Golang在接入层长连接服务中的实践-黄欣Go:代码上同步,思维自然 • 性能够用,工具齐全 – 100w?10w?~~ – Memprof、cpuprof~ • 社区活跃,发展迅猛 背景—使用现状 • 每天服务于千万级别的司机,数亿的用户 • 实时在线百万级别 • 每天平均70亿次的推送量 背景—总结 • 业务上核心依赖 • Golang成功的使用案例 目录 • 背景 • 心得 架构 • 整体架构图 架构—接口设计 • Timer优化 • Channel使用优化 心得—timer优化 • 为什么需要优化? – 万级别的连接 – 每个连接上大量的定时任务(心跳检测,注册检测,认证检测) 实际情况:当10w左右连接,什么数据不收发,只有定时器检测心跳超时,cpu 能耗掉一个core • 怎么优化? – 特点: • 秒级别定时任务 • 范围最多60s – 方案: • 时间轮 • 实现 – Channel0 码力 | 31 页 | 1.67 MB | 1 年前3
Hello 算法 1.0.0b2 Golang版?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 本质上看,计算渐近上界就是在找一个函数 ?(?) ,使得在 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同的增 长级别(仅相差一个常数项 ? 的倍数)。 2. 复杂度分析 hello‑algo.com 17 � 渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只 需要会推算即可,数学意义可以慢慢领悟。 size := 100000 for i := 0; i < size; i++ { count++ } return count } 线性阶 ?(?) 线性阶的操作数量相对输入数据大小成线性级别增长。线性阶常出现于单层循环。 // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := := 0 // 循环次数与数组长度成正比 for range nums { count++ } return count } 平方阶 ?(?2) 平方阶的操作数量相对输入数据大小成平方级别增长。平方阶常出现于嵌套循环,外层循环和内层循环都为 ?(?) ,总体为 ?(?2) 。 // === File: time_complexity.go === /* 平方阶 */ func quadratic(n0 码力 | 202 页 | 15.73 MB | 1 年前3
Hello 算法 1.0.0b1 Golang版?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 本质上看,计算渐近上界就是在找一个函数 ?(?) ,使得在 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同的增 长级别(仅相差一个常数项 ? 的倍数)。 2. 复杂度分析 hello‑algo.com 17 � 渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只 需要会推算即可,数学意义可以慢慢领悟。 size := 100000 for i := 0; i < size; i++ { count++ } return count } 线性阶 ?(?) 线性阶的操作数量相对输入数据大小成线性级别增长。线性阶常出现于单层循环。 // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := := 0 // 循环次数与数组长度成正比 for range nums { count++ } return count } 平方阶 ?(?2) 平方阶的操作数量相对输入数据大小成平方级别增长。平方阶常出现于嵌套循环,外层循环和内层循环都为 ?(?) ,总体为 ?(?2) 。 // === File: time_complexity.go === /* 平方阶 */ func quadratic(n0 码力 | 190 页 | 14.71 MB | 1 年前3
Go Web编程main,在这个main包中必定包含一个入口函数main,而这 个函数既没有参数,也没有返回值。 为了打印Hello, world...,我们调用了一个函数Printf,这个函数来自于fmt包,所以我们在第三行中导入了 系统级别的fmt包:import "fmt"。 包的概念和Python中的package类似,它们都有一些特别的好处:模块化(能够把你的程序分成多个模块)和可重用性 (每个模块都能被其它应用程序反复使用 现,当然需要针对REST做一些改造,REST是根据不同的method来处理相应的资源,目前已经存在的很多自称是REST的 应用,其实并没有真正的实现REST,我暂且把这些应用根据实现的method分成几个级别,请看下图: 图8.7 REST的level分级 上图展示了我们目前实现REST的三个level,我们在应用开发的时候也不一定全部按照RESTful的规则全部实现他的方 式,因为有些时 服务器句柄返回结果,调用远程系统内核 8.消息传回本地主机 9.客户句柄由内核接收消息 10.客户接收句柄返回的数据 193 Go RPC Go RPC Go标准包中已经提供了对RPC的支持,而且支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的 RPC,它和传统的RPC系统不同,它只支持Go开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编 码。 Go0 码力 | 295 页 | 5.91 MB | 1 年前3
Hello 算法 1.1.0 Go版(?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000 for i := 0; i < size; i++ { count++ } return count } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := 需根据输入数据的类型来具体确定。比如在第一个示例中,变量 ? 为输入数 据大小;在第二个示例中,数组长度 ? 为数据大小。 3. 平方阶 ?(?2) 平方阶的操作数量相对于输入数据大小 ? 以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层 循环的时间复杂度都为 ?(?) ,因此总体的时间复杂度为 ?(?2) : // === File: time_complexity.go ===0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版(?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000 for i := 0; i < size; i++ { count++ } return count } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := 需根据输入数据的类型来具体确定。比如在第一个示例中,变量 ? 为输入数 据大小;在第二个示例中,数组长度 ? 为数据大小。 3. 平方阶 ?(?2) 平方阶的操作数量相对于输入数据大小 ? 以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层 循环的时间复杂度都为 ?(?) ,因此总体的时间复杂度为 ?(?2) : // === File: time_complexity.go ===0 码力 | 382 页 | 17.60 MB | 1 年前3
2.7 Golang与高性能DSP竞价系统ReservedAll Right Reserved • 每天N亿曝光 • 30个维度,40个指标 • 表的数据量和维度的离散程度相关 • 如⼲⼴广告位有5000个,全国500个城市,时间粒度到⼩小时级别,则地区汇总表⼀一个 推⼲⼴广活动⼀一天最多就有 5000*500*24 = 6千万 记录 • 实时统计 • 实时计算、⼊入库 • 实时查询,秒级响应 曝光统计服务 专业DSP解决⽅方案 ReservedAll Right Reserved • 专为统计分析⽽而⽣生 • 列存储 • shared-nothing的分布式架构,可扩展性、⾼高可⽤用 • 秒级以内对⼗十亿⾏行级别的表进⾏行统计查询 • 对内存要求⾼高,相当于内存数据库 • JAVA系,开源 曝光统计服务: Druid 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right0 码力 | 51 页 | 5.09 MB | 1 年前3
Hello 算法 1.0.0b4 Golang版?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 从本质上讲,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 2.2.4. 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理解,也无需担心。因为在实际使用中,我们只需要掌握 推算方法,数学意义可以逐渐领悟。 2 := 100000 for i := 0; i < size; i++ { count++ } return count } 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小以线性级别增长。线性阶通常出现在单层循环中。 // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := range nums { count++ } 2. 复杂度 hello‑algo.com 21 return count } 平方阶 ?(?2) 平方阶的操作数量相对于输入数据大小以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层循 环都为 ?(?) ,因此总体为 ?(?2) 。 // === File: time_complexity.go === /* 平方阶 */0 码力 | 347 页 | 27.40 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版(?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 www.hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没 100000 for i := 0; i < size; i++ { count++ } return count } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { count := 需根据输入数据的类型来具体确定。比如在第一个示例中,变量 ? 为输入数 据大小;在第二个示例中,数组长度 ? 为数据大小。 3. 平方阶 ?(?2) 平方阶的操作数量相对于输入数据大小 ? 以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层 循环的时间复杂度都为 ?(?) ,因此总体的时间复杂度为 ?(?2) : // === File: time_complexity.go ===0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0b5 Golang版(?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 hello‑algo.com 29 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000 for i := 0; i < size; i++ { count++ } return count } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.go === /* 线性阶 */ func linear(n int) int { 第 2 章 复杂度分析 需根据输入数据的类型来具体确定。比如在第一个示例中,变量 ? 为输入数 据大小;在第二个示例中,数组长度 ? 为数据大小。 3. 平方阶 ?(?2) 平方阶的操作数量相对于输入数据大小 ? 以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层 循环都为 ?(?) ,因此总体为 ?(?2) : // === File: time_complexity.go === /* 平方阶 */0 码力 | 379 页 | 30.70 MB | 1 年前3
共 22 条
- 1
- 2
- 3













