小米推送技术负责人 夏超 - 微服务在小米消息推送的演进

2020-02-27 58浏览

  • 1.微服务在小米消息推送的实践和感悟 夏超
  • 2.
  • 3.• 动机 • 降低系统耦合 • 提升系统可扩展性 • 提升开发效率 • 挑战 • 系统的整体稳定性 • 排查定位问题困难 • 治理 • 服务管理 • 路由控制 • 监控升级 • 有状态服务改造 目录
  • 4.存储服务 状态服务 C++/TCP 离线消息 Java/UDP 订阅关系 Java/UDP 总体架构 长连接接入服务层 C++/UDP 消息转发服务层 C++/UDP 网络短信服务 Java/UDP 生活消息服务 Java/UDP 业务层 消息推送服务 Java/UDP 云信息服务 Java/UDP 基础服务 服务管理 路由控制 配置分发 系统监控
  • 5.总体介绍 服务管理 服务Y A集群->c.A B集群->c.B 路由控制服务 配置管理服务 • 服务X和服 务Y的相互 关联,以及 其和整体系 统的交互 服务X控制信息 CONNECTION.LIMITS FEATURE.M.ENABLE 1000000 1 : y100 0 : y101 服务Y路由信息 c.A c.B y100 y101 …… …… 1000 1000 …… …… 服务实例上报服务[机房A] Y : App-instance y100 MICRO-SDK ROUTING CONF REPORT MONITOR Y : App-instance y101 MICRO-SDK ROUTING CONF REPORT MONITOR RPC X : App-instance x100 MICRO-SDK ROUTING CONF REPORT MONITOR RPC X : App-instance x101 MICRO-SDK ROUTING CONF REPORT MONITOR 监控服务 (本机) 监控服务 (本机) 监控服务
  • 6.微服务治理——服务管理 服务管理 服务的注册和发现• 服务Y A集群->c.A B集群->c.B • 服务的限流控制 路由控制服务 配置管理服务 • 服务的发布和升级 • 使用动态配置 • 高级灰度控制 服务Y控制信息 CONNECTION.LIMITS FEATURE.M.ENABLE 1000000 1 : y100 0 : y101 服务实例上报服务[机房A] Y : App-instance y100 Y : App-instance y101 MICRO-SDK ROUTING CONF REPORT MONITOR MICRO-SDK ROUTING CONF REPORT MONITOR 服务Y路由信息 c.A y100 1000 y101 1000 c.B …… …… …… ……
  • 7.微服务治理——服务管理——灰度控制 EANBLE_NEW_FEATURE (CONFIGURE) • 程序开发规范 • 灰度开关 • 选择逻辑配置化 INPUTS=string CLUSTER, string MACHINE, string API,long ID RULE.CLUSTER_A = CLUSTER IN (A) RULE.CLUSTER_B = CLUSTER IN (B) RULE.API = API IN (LOGIN, LOGOUT) RULE.ID = ID MOD 1000 IN (100..200,450..600) • 逐步灰度 • 实例维度 • 流量维度 • 组合维度 JUDGE = RULE.CLUSTER_A && RULE.ID JUDGE = RULE.CLUSTER_B && RULE.API JAVA API ConditionJudgeOutput enableNewFeature =ConditionJudge(“ENABLE_NEW_FEATURE”) .CLUSTER(getLocalCluster()).MACHINE(getLocalMachine()) .API(context.api()).ID(context.id()).judge(); if (enableNewFeature.isHit()) { newFeature(); } else { oldFeature(); }
  • 8.微服务治理——路由控制 • 生成路由 • 负载均衡 • 熔断策略 服务管理 服务Y A集群->c.A B集群->c.B 服务Y路由信息 • 高级策略 • 多集群混合策略 • 过载保护 c.A c.B 路由控制服务 服务实例上报服务[机房A] 服务实例上报服务[机房B] 配置管理服务 y100 y101 …… 10 1000 …… y200 y201 …… 1000 2000 …… Y : App-instance y100 MICRO-SDK ROUTING CONF REPORT MONITOR Y : App-instance y200 MICRO-SDK ROUTING CONF REPORT MONITOR Y : App-instance y101 MICRO-SDK ROUTING CONF REPORT MONITOR Y : App-instance y201 MICRO-SDK ROUTING CONF REPORT MONITOR ROUTING.DoSelectInstance(Y, c.A) Routing.DoSelectInstance(Y, c.A) X : App-instance x101 MICRO-SDK ROUTING CONF REPORT MONITOR X : App-instance x102 MICRO-SDK ROUTING CONF REPORT MONITOR
  • 9.微服务路由——路由策略 • 负载均衡——服务端权重/客户端自适应? • 服务端为主:路由稳定 • 客户端为主:反应速度快 • 熔断控制——防止雪崩 • 服务端熔断保护策略:设置路由变化阀值 • 客户端熔断保护策略: • 触发条件:RPC调用异常(错误/超时)结果超过阀值 • 初步处理:时间窗口临时禁止实例 • 进一步处理(禁止实例超过比例):服务降级或拒绝
  • 10.微服务路由——高级路由策略 • 多集群调度:多集群权 重混合 • bj集群是按照A/B两个集群1:3 流量来配比 服务Y路由信息 c.A y100 • 容灾策略:兄弟集群成 为备选 c.B • bj集群是A/B两个集群的父亲集群, 若A集群访问出现问题,回退访 问bj集群下面的B集群 y101 …… y200 y201 …… 1000 1000 …… 2000 2000 …… 服务管理 服务Y A集群->c.A (父集群bj) B集群->c.B (父集群bj) bj集群->c.bj->c.A 1000 c.B 3000 c.bj y100 1000 y101 1000 y200 y201 3000 3000 …… ……
  • 11.微服务路由——高级路由调度 • 过载保护 • 从负载过高的集群向尚且有富裕 容量的集群调度流量 服务Y路由信息 • 服务整体过载不进行调度 c.A • 负载自适应策略:防止流量摇摆 y100 y101 c.B …… y200 y201 …… 服务管理 服务Y A集群->c.A 负载/容量=1100/1000 B集群->c.B 负载/容量=800/1000 A过载集群->c.a.overload->c.a 1000 c.B 100 1000 1000 …… c.a.overload 2000 2000 …… y100 y101 y200 y201 …… 1000 1000 100 100 ……
  • 12.微服务监控——链路监控 • 传统监控的问题 • 报警模糊 • 定位问题慢 • 目标 • 迅速定位排查问题 • 链路监控的实现 • 链路基本调用情况 • 整合请求链调用系统
  • 13.微服务监控——监控思路 • 记录上下游服务的ip,调用的api,延时,成功失败情况,错 误代码和错误的id • 提供api,机器,机房,错误代码,时间等多个维度的聚合结 果,和报警系统结合,提供更加精准的报警 • 错误id,机器ip和trace调用链系统整合来提供调用链调查
  • 14.微服务监控——排查过程 • 确定导致服务可用 性下降的关键点。 • 确定出现问题的服 服务X api 务,查看错误是否 集中的特点。 • 从上游集群中抽出 一个出现问题id, 查看服务链。 调查调用链发现X Y Z1 G0出现问题, 确定G0服务是导致失败率的关键点 调用成功 率99.0% 服务Y api 调用成功 率98.1% 服务Z1 api 调用成功 率100% 服务T api 调用成功 率100% 服务Z0 api 调用成功 率97.8% 服务G0 api 调用成功 服务G1 api 率99.9%
  • 15.微服务监控——基本调用情况采集和监控 • 程序中SDK分钟级 聚合调用情况 • 延时采用平均数, 90分位数采用预估 服务x实例 MONITOR-SDK 监控数据文件 • 提供小时/天时间维 度聚合并提供统计 报告 监控数据聚合和查询服务 监控数据库 监控数据采集 agent 监控数据上报服务
  • 16.微服务监控——链路调用情况采集和监控 • 问题调查需要全采样 • 消耗大量带宽和存储 • 场景的时效性 • 考虑结合日志 服务X 实例 MONITOR-SDK trace索引库 trace信息库 SRIBED TRACE AGENT (远端) TRACE查询 QueryTrace(TimeSpan ts, String key) QueryTrace(TraceId, DateTime dt)
  • 17.微服务监控——链路调用情况采集和监控 服务X 实例 • 记录trace信息的上下游 服务ip,关键的ID,调 MONITOR-SDK 用发生的时间和日志的 位置。 日志文件2017-01-20.1 日志文件2017-01-20.2 • trace存储不再集中。 日志文件2017-01-20.3 …… trace索引库 trace信息库 SRIBED TRACE AGENT (本地) LOG QUERY (本地) TRACE查询 QueryTrace(TimeSpan ts, String key) QueryTrace(TraceId, DateTime dt)
  • 18.微服务监控——链路查询示例 X服务 x100 X101 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY Y服务 y200 y201 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE SERVICE ListQueryTrace(TimeSpan ts, String key) TraceTree QueryTrace(Long traceId) UID 10982773 QUERY TIME SPAN 17-01-20 15:00:00 ~ 17-01-20 15:30:00 QUERY ID TRACE ID TIME HOST MACHINE 20099338834 17-01-20 15:01:25 x100 QUERY TRACE Z服务 z300 z301 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY
  • 19.微服务监控——链路查询示例 X服务 x100 X101 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY Y服务 y200 y201 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY Z服务 z300 z301 …… TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE-AGENT LOG-QUERY TRACE SERVICE ListQueryTrace(TimeSpan ts, String key) TraceTree QueryTrace(Long traceId) UID 10982773 QUERY TIME SPAN 17-01-20 15:00:00 ~ 17-01-20 15:30:00 QUERY ID TRACE ID TIME HOST MACHINE 20099338834 17-01-20 15:01:25 x100 QUERY TRACE Server Span 0 x100 15:01.25.002 ~ 15:01.25.032 Client Span 0.0 y201 15:01.25.003 ~ 15:01.25.028 Server Span 0.0 y201 15:01.25.007 ~ 15:01.25.030 Client Span 0.0.0 z300 15:01.25.008 ~ 15:01.25.028 Server Span 0.0.0 z300 15:01.25.012 ~ 15:01.25.028 h/omew/ork/log/serviceY/srv20170120.8.log …… 2017-01-20 15:01:25.008 [PROCESS-0][INFO] [20099338834] UID 10982773 LOGIN 2017-01-20 15:01:25.009 [PROCESS-0][INFO] [20099338834] QUERY UID OFFLINE MESSAGE ……
  • 20.有状态服务的微服务化改造 • 纳入路由系统统一管理 • 考虑数据的迁移场景 • 典型的状态服务类型 • 半持久化数据 • 持久化数据
  • 21.有状态vs无状态 • 集群路由信息包含数据分 片。查找路由首先确定数 据分片,然后确定对应的 访问实例。 • 每个数据分片可能存在主/ 备分区。 数据分片 BASE0 MASTER y100 数据分片 BASE1 MASTER y110 • 无状态是一种特殊的有状 态服务(仅一个数据分区) PARTITION 0 PARTITION 1 PARTITION 2 PARTITION 3 PARTITION 4 PARTITION 5 PARTITION 6 PARTITION 7
  • 22.有状态服务的数据迁移 • 定义数据迁移前 数据分片 BASE0 和迁移后的两张 MASTER y100 分片信息 数据分片 BASE1 • 定义迁移状态来 MASTER y110 控制数据读写 调整前 EXTERNAL VIEW PARTITION 0 PARTITION 1 PARTITION 2 PARTITION 3 PARTITION 4 PARTITION 5 PARTITION 6 PARTITION 7 调整后 IDEAL VIEW PARTITION 0 PARTITION 1 PARTITION 2 PARTITION 3 PARTITION 4 PARTITION 5 PARTITION 6 PARTITION 7 PARTITION 3
  • 23.有状态服务——半持久化模式——登录状态 • 利用用户平均30 分钟的登录时长 的经验值来简化 迁移过程 • 定义两个迁移状 态和迁移数据的 读写行为 数据分片 BASE0 MASTER y100 数据分片 BASE1 MASTER y110 调整前 EXTERNAL VIEW PARTITION 0 PARTITION 1 PARTITION 2 PARTITION 3 PARTITION 4 PARTITION 5 PARTITION 6 PARTITION 7 状态DATA-FILL 迁移PARTITION读行为 双读 迁移PARTITION写行为 写IDEAL 状态DATA-READY 迁移PARTITION读行为 读IDEAL 迁移PARTITION写行为 写IDEAL 调整后 IDEAL VIEW PARTITION 0 PARTITION 1 PARTITION 2 PARTITION 3 PARTITION 4 PARTITION 5 PARTITION 6 PARTITION 7 PARTITION 3 将EXTERNAL更新成IDEAL 状态NORMAL 迁移PARTITION读行为 读EXTERNAL 迁移PARTITION写行为 写EXTERNAL
  • 24.有状态服务——持久化模式——离线消息系统 • 基于redis,添加proxy 层用于屏蔽数据迁移 PROXY PROXY …… PROXY • proxy负责读取状态和 REDIS INSTANCE 控制读写,直接和redis REDIS INSTANCE 实例通讯 AGENT REDIS INSTANCE …… • agent负责起停redis实 例,上报实例状态和对 数据做dump迁移 REDIS INSTANCE REDIS INSTANCE AGENT REDIS INSTANCE …… REDIS INSTANCE REDIS INSTANCE AGENT REDIS INSTANCE ……
  • 25.有状态服务——持久化模式——离线消息系统 REDIRECT-WRITE PROXY 双读 AGENT 写EXTERANAL 迁移数据从 同一PROXY上 面发起 SYNC-WRITE PROXY AGENT 双读 写IDEAL DATA-MIGRATE PROXY AGENT 双读 写IDEAL 从EXTERNAL迁移到IDEAL SYNC-READY PROXY AGENT 读IDEAL 写IDEAL 将EXTERNAL更新成IDEAL NORMAL PROXY AGENT 读EXTERNAL 写EXTERNAL
  • 26.总结和感悟 • 坏消息传播的慢 • 熔断、限流、灰度 • 坏消息知道的快 • 链路监控、链路定位 • 自动化本身有代价 • 自适应策略 • 微服务体系建设目标 • 稳定、便捷、高效
  • 27.