
本文为《蚂蚁金服 Service Mesh 大规模落地系列》第二篇,该系列将会从核心、RPC、消息、无线网关、控制面、安全、运维、测试等模块对 Service Mesh 双十一大规模落地实践进行详细解析。文末包含往期系列文章。
引言
-
对消息 Mesh 进行介绍,解答消息 Mesh 在整个 Service Mesh 中的地位是什么,它又能为业务带来哪些价值; -
结合蚂蚁金服消息中间件团队 Mesh 化的实践与思考,阐述如何在消息领域进行 Mesh 化改造; -
消息 Mesh 在蚂蚁金服内部大规模落地过程中遇到的问题与挑战,以及对应的解决方案; -
消息流量精细化调度上的思考与在 Mesh 上的实现与落地;
消息 Mesh 简介
-
快速升级 - 通过将与业务逻辑无关的一些核心关键能力下沉到 Sidecar 中,使这些能力的单独快速迭代与升级成为可能; -
流量控制 - 可以向 Sidecar 中集成各种流量控制策略,例如可根据消息类型、消息数量、消息大小等多种参数来控制消息的发送和消费速率; -
流量调度 - 通过打通 Sidecar 节点之间的通信链路,可以利用 Sidecar 的流量转发来实现任意精度的消息流量调度,帮助基于事件驱动的微服务应用进行多版本流量管理、流量着色、分组路由、细粒度的流量灰度与 A/B 策略等; -
消息验证 - 消息验证在基于事件驱动的微服务架构中正变得越来越重要,通过将这部分能力下沉到 Sidecar,不仅可以让业务系统无缝集成消息验证能力,也可以让 Sidecar 通过 Schema 理解消息内容,并进一步具备恶意内容识别等安全管控能力; -
可观测性 - 由于所有的消息流量都必须通过 Sidecar,因此可以为 Sidecar 上的消息流量按需增加 Trace 日志,Metrics 采集,消息轨迹数据采集等能力,并借此进一步丰富消息服务的治理能力;
消息 Mesh 化改造
-
客户端不再与服务端直连,而是通过 Sidecar 进行请求的中转,对客户端而言,Sidecar 实际上是它唯一能感知到的消息服务端,对服务端而言,Sidecar 则扮演着客户端的角色; -
所有 Sidecar 都会与控制平面交互,接收服务端地址列表、流量管控和调度配置、运行时动态配置等的下发,从而使数据平面具备限流、熔断、异常重试、服务发现、负载均衡、精细化流量调度等能力;
-
在经过 Mesh 化改造后,消息客户端不再直接向 SOFARegistry 订阅消息服务端的地址,而是将所有消息元数据(包含业务应用声明的消息 Topic、发送/订阅组 GroupId 等关键信息)通过 HTTP 请求上报给 MOSN,由 MOSN 进行元数据的持久化(用于 MOSN 异常 Crash 后的恢复)以及消息服务端地址的订阅和处理; -
当客户端收到 MOSN 对于注册请求的响应时,会主动与 MOSN 建立连接,并将与该连接相关的 Group 集合信息通过控制指令发送给 MOSN,由于客户端与 MOSN 可能存在多个连接,且不同连接上的 Group 集合可以不同,而 MOSN 与同一个消息服务端只维持一个连接,因此控制指令无法向消息数据一样直接进行转发,而是需要汇总计算所有 GroupId 集合后再统一广播给消息服务端集群。由于上述计算逻辑十分复杂,需要包含过滤和聚合,且存在动态和并发行为,一旦因计算错误则会严重影响到消息投递的正确性,因此当前 MOSN 绕过了该指令的代理,只利用客户端的控制指令进行相关数据的校验,以及更新客户端连接的映射信息(用于 MOSN 的客户端连接选择),而是选择依赖消息客户端的改造引入上述 HTTP 注册请求来构造全量控制指令;
消息 Mesh 的挑战
-
在连接迁移的过程中,如果消息客户端已处理完经过 MOSN 转发的服务端投递消息请求,但是还未回复响应,此时若把连接迁移到新的 MOSN,则新的 MOSN 将收到上述响应,但由于新 MOSN 缺失上下文,无法将该响应返回给正确的消息服务端; -
在连接迁移完成,但老 MOSN 还未优雅退出期间,由于两个 MOSN 与消息服务端都存在连接,两者都会收到服务端发送的投递消息请求,但因两个 MOSN 与服务端连接的状态各自独立,可能会使客户端收到的请求ID冲突;
-
老 MOSN 平滑升级指令后,会立即向所有的消息服务端发送禁止再接收消息的控制指令; -
新 MOSN 感知老 MOSN 完成前置操作,开始进行原有的平滑升级流程,进行初始化和存量连接迁移; -
新 MOSN 完成存量连接迁移后,向所有的消息服务端发送接收消息的控制指令,开始正常的消息订阅;
消息 Mesh 流量调度
总结
消息 Mesh 经过蚂蚁消息中间件团队大半年的打磨和沉淀,已经迈出了坚实的一大步:在开源社区迟迟未在消息 Mesh 上取得实质性进展时,我们已经为蚂蚁内部主流消息中间件打通了数据平面。
同时也有充满想象力的一小步:依赖消息的精细化流量调度,预期可以发挥更大的业务价值,包括基于事件驱动的微服务应用多版本流量管理、流量着色、分组路由、细粒度的流量灰度与A/B策略等,等待着去开发与挖掘。
这些都在双十一大促中取得了不俗的成绩。未来,我们将会持续加大对消息 Mesh的投入,为消息 Mesh 支持更多的消息协议,赋予更多开箱即用的的消息流量管控和治理能力,并进一步结合 Knative 探索消息精细化流量调度在 Serverless 下的应用场景。最后,也欢迎志同道合的伙伴加入我们(看次条),一起参与金融级分布式消息系统、云原生时代的下一代消息系统的架构设计和研发。
1065

被折叠的 条评论
为什么被折叠?



