Golang在接入层长连接服务中的实践-黄欣
Golang 在接入层长连接服务中的实践 黄欣 基础平台-架构部 目录 • 背景 • 架构 • 心得 目录 • 架构 • 心得 背景—why 长连接? • 业务场景 – 大量实时计算 • 司机乘客撮合 • 实时计价 – 高频度的数据交互 • 坐标数据 • 计价数据 – App和服务端双向可达 • 上行(抢单) • 下行(派单) 背景—why golang? • 开发效率 开发效率 • 异步模型,同步原语 – C:代码上各种回调、思维中保持冷静 – Go:代码上同步,思维自然 • 性能够用,工具齐全 – 100w?10w?~~ – Memprof、cpuprof~ • 社区活跃,发展迅猛 背景—使用现状 • 每天服务于千万级别的司机,数亿的用户 • 实时在线百万级别 • 每天平均70亿次的推送量 背景—总结 • 业务上核心依赖 • Golang成功的使用案例 整体架构图 架构—接口设计 • 原则 – 扩展性 – 稳定性(最好不用升级) • 解决方法 – Protobuf(golang) – 接口设计分层 • 框架层:模块间通信协议(类似tcp/udp) • 业务层:bytes(类似应用层)留给业务自己定义就好了 架构—性能 • conn svr 架构—集群扩展 • Proxy本身无限扩容(无状态) • 依赖的存储可无限扩容(状态交给存储)0 码力 | 31 页 | 1.67 MB | 1 年前3大规模高性能区块链架构设计模式与测试框架-李世敬
版权所有 ©2016-2021 11 趣链科技 版权所有 ©2016-2021 11 公有�架构(⾮�可�架构) 应⽤层 数据层 块链式结构 账户模型 时间戳 ⽹络层 共识层 激励层 发⾏机制 分配机制 PoW PoS DPoS 可编程货币 可编程⾦融 可编程社会 合约层 智能合约脚本 算法机制 合约执⾏引擎 哈希算法 数字签名 P2P⽹络 传播机制 验证机制 默克尔树 轮胎、悬架等 公有链基础架构⾃下⽽上分为六层:数据层、⽹络层、共识层、激励层、合约层与应⽤层。如果将区块链⽐作⼀ 辆汽车,那么各层分别对应汽车的各个组成部分(下图所⽰),各层之间协同合作,形成多中⼼化可信系统 12 趣链科技 版权所有 ©2016-2021 12 趣链科技 版权所有 ©2016-2021 12 趣链科技 版权所有 ©2016-2021 12 �盟�(�可�架构) 基 础 层 数据层 区块结构 账户体系 账本数据结构 安全层 核⼼安全机制 ⾝份隐私保护 数据隐私保护 共识层 分布式⼀致性算法 典型共识算法 新型共识算法 合约层 智能合约脚本 合约执⾏引擎 分布式应⽤DApp ⽹络层 P2P⽹络 区块链⽹络模型 区块链⽹络协议 扩 展 层 扩展操作 跨链协议 链上链下计算 预⾔机 扩展组件 消息队列MQ 证书管理 测试框架 治理层 权限体系 治理模型 区块链审计 BaaS运维治理 应⽤层 司法存证0 码力 | 39 页 | 56.58 MB | 1 年前3GoFrame框架介绍及设计
统一框架、统一组件、降低选择成本 • 开发规范、设计模式、代码分层模型 • 强大便捷的开发工具链 • 完善的本地中文化支持 • 设计为团队及企业使用 特点 框架介绍-框架架构 • 发布方式:Docker、二级制、源码模块 • 模块管理: • 核心模块、社区模块、三方模块 • Go Modules管理方式 • 开发工具链 • 设计模式:MVC、三层架构、工具集 • 应用接口:HTTP/TCP/UDP/RPC 代码分层设计 第四部分 • 经典MVC • 三层架构模式 • 项目代码结构 代码分层设计-经典MVC 痛点: • 视图展示与数据操作方式的进一步剥离,特别是移动端的发展, 前端MVVM框架的发展,我们大多数场景下已不再需要服务端 渲染View • Model层级的代码既维护着数据,也封装着业务逻辑,随着业 务逻辑变得越来越复杂,这一层功能逻辑会变得越来越臃肿不 易维护 • Co 要求会比较高 经典MVC模式 代码分层设计-三层架构模式 表示层 - UI 位于三层构架的最上层,与用户直接接触,主要是B/S中 的 WEB页面,也可以是API接口。 业务逻辑层 - BLL 对具体问题进行逻辑判断与执行操作。 数据访问层 - DAL 实现数据的增删改查等操作,并将操作结果反馈到业务逻辑层 BLL。 模型定义层 - Model 也常用Entity实体对象来表示,主要用于数据库表的映射对象。0 码力 | 37 页 | 8.84 MB | 1 年前3Hello 算法 1.1.0 Go版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 hello‑algo.com 15 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为拼装积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数据结 ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 383 页 | 18.48 MB | 1 年前3Hello 算法 1.0.0 Golang版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 hello‑algo.com 15 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为拼装积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数据结 ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 382 页 | 17.60 MB | 1 年前3Hello 算法 1.0.0b5 Golang版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 hello‑algo.com 14 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数据结构 ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。0 码力 | 379 页 | 30.70 MB | 1 年前3Hello 算法 1.0.0b4 Golang版
我们按照说明书一步步操作,就能组装出精美的积木模型。 1. 初识算法 hello‑algo.com 11 Figure 1‑5. 拼装积木 两者的详细对应关系如下表所示。 数据结构与算法 LEGO 乐高 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得注意的是,数据结构与算法独立于编程语言 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = float64) int { if n <= 1 { return 0 } return logRecur(n/2) + 1 } 线性对数阶 ?(? log ?) 线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 ?(log ?) 和 ?(?) 。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 2. 复杂度 hello‑algo.com 250 码力 | 347 页 | 27.40 MB | 1 年前3Hello 算法 1.2.0 简体中文 Go 版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 www.hello‑algo.com 15 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为拼装积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数 ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 384 页 | 18.49 MB | 10 月前302. Service Mesh落地之后_为sidecar注入灵魂 - 周群力
展望2022:待解决的问题 • 总结 3 Service Mesh 回顾 Service Mesh 回顾 4 由开发了 Linkerd 的Buoyant 公司提出 服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服 务网格负责在这些拓扑中实现请求的可靠传递。在实践中,服务网格通常实现为一组轻量 级网络代理,他们与应用程序部署在一起,而对应用程序透明。 Service Layotto 标准 API 标准 API 标准 API 名字含义 26 OSI模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 Layotto Layer8 Layer + 8 七层模型 Layer + otto(意大利语) Layotto(L8) OSI App 第八层 27 问题 解决了 吗? Runtime API 28 如何解决厂商绑定的0 码力 | 63 页 | 880.85 KB | 1 年前3Hello 算法 1.0.0b2 Golang版
且已经习惯将它们 应用到日常生活中。接下来,我将介绍两个具体例子来佐证。 例一:拼积木。一套积木,除了有许多部件之外,还会附送详细的拼装说明书。我们按照说明书上一步步操作, 即可拼出复杂的积木模型。 如果从数据结构与算法的角度看,大大小小的「积木」就是数据结构,而「拼装说明书」上的一系列步骤就是 算法。 例二:查字典。在字典中,每个汉字都有一个对应的拼音,而字典是按照拼音的英文字母表顺序排列的。假设 到下表所示的对应关系。 数据结构与算法 LEGO 乐高 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 1. 引言 hello‑algo.com 11 � 约定俗成的简称 在实际讨论中,我们通常会将「数据结构与算法」直接简称为「算法」。例如,我们熟称的 LeetCode 算法题目,实际上同时考察了数据结构和算法两部分知识。 省略所有系数。例如,循环 2? 次、5? + 1 次、⋯⋯,都可以化简记为 ? 次,因为 ? 前面的系数对时间 复杂度也不产生影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别套 用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) =0 码力 | 202 页 | 15.73 MB | 1 年前3
共 55 条
- 1
- 2
- 3
- 4
- 5
- 6