Golang在接入层长连接服务中的实践-黄欣
Golang 在接入层长连接服务中的实践 黄欣 基础平台-架构部 目录 • 背景 • 架构 • 心得 目录 • 架构 • 心得 背景—why 长连接? • 业务场景 – 大量实时计算 • 司机乘客撮合 • 实时计价 – 高频度的数据交互 • 坐标数据 • 计价数据 – App和服务端双向可达 • 上行(抢单) • 下行(派单) 背景—why golang? • 开发效率0 码力 | 31 页 | 1.67 MB | 1 年前3go-zero开源项目的成长史
0 码力 | 31 页 | 4.83 MB | 9 月前3Go Web编程
Go语言基础 2 Go语言基础 Go是一门类似C的编译型语言,但是它的编译速度非常快。这门语言的关键字总共也就二十五个,比英文字母还少一 个,这对于我们的学习来说就简单了很多。先让我们看一眼这些关键字都长什么样: break default func interface select case defer go map struct 而非在概念上属于某个struct的。 图2.8 方法和struct的关系图 很显然,这样的实现并不优雅,并且从概念上来说"面积"是"形状"的一个属性,它是属于这个特定的形状的,就像长 方形的长和宽一样。 基于上面的原因所以就有了method的概念,method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎 一样,只是在func后面增加了一个receiver(也就是method所依从的主体)。 接下来的例子我主要以第一个驱动为例(我目前项目中也是采用它来驱动),也推荐大家采用它,主要理由: 这个驱动比较新,维护的比较好 完全支持database/sql接口 支持keepalive,保持长连接,虽然星星fork的mymysql也支持keepalive,但不是线程安全的,这个从底层就 支持了keepalive。 示例代码 示例代码 接下来的几个小节里面我们都将采用同一个数据库表结0 码力 | 295 页 | 5.91 MB | 1 年前3Go 入门指南(The way to Go)
com/hg/urlshortener/v1"` 现在我们写一个 Web 应用(参见第 15 章 4-8 节)通过表单实现短地址和长地址的相互转换。我们将使用 template 包并写三个处理函数:root 函数通过执行表单模板来展示表单。short 函数将长地址转换为短 地址,long 函数逆向转换。 要调用 urlshortener 接口必须先通过 http 包中的默认客户端创建一个服务实例 Do 方法传入包含长地址的 Url 数据结构从而获取短地址: url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl: longUrl}).Do() 返回 url 的 Id 便是我们需要的短地址。 我们通过调用服务中的 Url.Get 中的 Do 方法传入包含短地址的Url数据结构从而获取长地址: url, error error := urlshortenerSvc.Url.Get(shwortUrl).Do() 返回的长地址便是转换前的原始地址。 示例 9.9 urlshortener.go package main import ( Go入门指南 - 185 - 本文档使用 看云 构建 import ( "fmt" "net/http" "text/template"0 码力 | 380 页 | 2.97 MB | 1 年前3Go 入门指南(The way to Go)
可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个 长度可变的数组。 切片提供了计算容量的函数 cap() 可以测量切片最长可以达到多少:它等于切片的长度 + 数组除切片之外的长 度。如果 s 是一个切片, cap(s) 就是从 s[0] 到数组末尾的数组长度。切片的长度永远不会超过它的容量, 所以对于 切片 s 来说该不等式永远成立: 0 <= len(s) com/hg/urlshortener/v1"` 现在我们写一个 Web 应用(参见第 15 章 4-8 节)通过表单实现短地址和长地址的相互转换。我们将使用 template 包并写三个处理函数:root 函数通过执行表单模板来展示表单。short 函数将长地址转换为短地址, long 函数逆向转换。 要调用 urlshortener 接口必须先通过 http 包中的默认客户端创建一个服务实例 方法传入包含长地址的 Url 数据结构从而获取短地址: 1. url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl: longUrl}).Do() 返回 url 的 Id 便是我们需要的短地址。 我们通过调用服务中的 Url.Get 中的 Do 方法传入包含短地址的Url数据结构从而获取长地址:0 码力 | 466 页 | 4.44 MB | 1 年前31.6 resource scheduling & container technology for financial service_yujun
⑥ 轮询调度(Round Robin Scheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响 应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮询调 度算法容易导致服务器间的负载不平衡。0 码力 | 21 页 | 27.20 MB | 1 年前3Golang大规模云原生应用管理实践
Result{RequeueAfter: waitTime}, nil } 1 获取应用期望状态 控制器初始化 2 解析期望的WTS状态 3 调谐动作-更新与新增 4 调谐动作-删除 5 调谐动作-状态同步 6 异步轮询 func (r *components) Render(ctx context.Context, ac *v1alpha2.ApplicationConfiguration) { workloads Measurable • Relevant • Attainable • Timebound • 控制器设计(做什么) • 基于“可重构”状态机,开放的世界 • 不要修改资源声明 • 事件驱动+主动轮询 • 重试 + 幂等 • 自愈 • e2e测试 • Ginkgo BDD • Kind本地K8s集群 新的复杂度-最终一致性 status: … phase: succeed …0 码力 | 23 页 | 7.70 MB | 1 年前3TarsGo微服务开发实践-利开园
Tars应用实践:https://github.com/tarscloud/gopractice RPC:不应该只是RPC • 基本功能:远程函数调用 • 可观测 • 名字服务+SET流量管理 • 熔断与恢复 • 轮询/一致性Hash • 错误码管理 日志:排查问题的利器 • 格式化 =〉 JSON • 单机withFields • 基于context • 跨服务withFields • 基于透传元数据0 码力 | 15 页 | 4.23 MB | 1 年前3基于gRPC go实现消息发布订阅
Unlock() return ch } 发布者消息推送 01. 副标题 func (p *Publisher) Publish(v interface{}) { ... // 发布时,轮询所有注册上来的对象 for sub, topic := range p.subscribers { ... go p.sendTopic(sub, topic, v, wg) // 消息推送到订阅者的chan0 码力 | 31 页 | 2.42 MB | 1 年前3IPC性能极致优化方案-RPAL落地实践
间进行函数调用? 方案诞生的背景 基于以上问题,我们最终引入了 RPAL(Run Process As Library) 方案,基于跨进程虚拟地址 共享,复用 epoll 网络模型,实现了纯用户态的事件轮询和无拷贝的指针读写接口。 从性能瓶颈的两点分析: 1. 异步线程唤醒: 关键在于如何最低限度降低线程唤醒的开销,非必要不通知事件。 2. 数据序列化/反序列化 需要做到跨进程的虚拟地址空间共享,通过传递指针来传递一切数据。0 码力 | 39 页 | 2.98 MB | 1 年前3
共 31 条
- 1
- 2
- 3
- 4