陌陌云原生微服务架构落地实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 陌陌云原生微服务架构
落地实践
袁世超
2.
3. 目录
•
•
•
陌陌微服务平滑演进之路
陌陌微服务治理现状与挑战
陌陌 Service Mesh 落地实践
4. 陌陌微服务发展历程
MOA 微服务
架构建立
单体应用
2011
2012
系统拆分
PHP API + Java 后端
2013
日志平台
分布式跟踪系统
2014
配置中心
监控平台
异步调用平台
2015
应用容器化
2016
并行调用代理
异构语言代理
2017
限流容错
2018
服务鉴权
2019
2020
Service Mesh
架构落地
5. 陌陌微服务整体架构
注册中心
(MomoKeeper)
服务发现(lookup)
MOA
Watcher
(健康检查)
1. 注册中心
Redis 作为底层存储
MOA Watcher中心化健康检测
查询
2. 多语言支持
订阅
客户端
PHP/Python
Client
C++ Client
中心化地址发现服务
X Client
Java Client
MOA 传输协议
Mesh Agent
服务流量代理
MOA 协议
3. 关联产品支持
服务端
Mesh Agent
C++ Server
Java Server
健康检查
X Server
基于brpc
配置中心
注册
异步调用平台
统一监控平台
分布式跟踪系统
压测平台
6. 陌陌微服务整体情况
服务数 峰值QPS
千级 千万级
实例数 全天调用量
万级 万亿级
7. 关键演进
1 MOA 架构建立
2 可观测性建设
3 异构语言服务代理
4 Service Mesh 架构引入
8. MOA 架构建立
单体应用的问题
复杂度高,所有
业务都堆在一起
公司初期业务规模小,单体应用架构是
合适的,适应功能快速迭代的需求。
可靠性差,一个
小问题导致整体
不可用
可扩展性差
但是随着业务规模的扩张,单体应用的
局限性也凸显了出来。
制约业务
迭代效率
9. MOA 架构建立
MOA 的时代背景
面对单体应用的问题,首先进行了系统拆分,但是效果并不理想,随后微服务架构开始
流行,陌陌于 2013 年开启了微服务架构的时代,自研 MOA 架构落地,一直使用至今。
放到微服务发展的大背景下,陌陌可以说是最早一批实践微服务的公司。
2011 Dubbo 开源
2012 James Lewis 发布著名的 《Microservice - Java, the Unix Way》主题演讲
2013 陌陌自研微服务架构 MOA 落地
2014 Martin Fowler & James Lewis 发布著名的 《Microservice: A Definition of This New
Architectural Term》文章
10. MOA 架构建立
客户端
MOA 的收益
PHP API
查询
服务发现
(lookup)
MOA 架构为业务快速迭代和扩张提供了
坚实的基础,其优势主要体现在:
• 围绕业务能力构建(康威定律)
• 分散治理
• 通过服务来实现独立自主的组件
• 容错性设计
• 演进式设计
MOA协议
发现
MOA 服务 A
注册中心
(MomoKeeper)
MOA协议
MOA 服务 B
注册
11. 可观测性建设
异常问题定位
服务间依赖复杂
在服务规模越来越大的背景下,当某个
服务出异常时,如何快速有效定位成了
监控告警缺失
日志信息缺失
迫切需要解决的问题。换句话说,我们
需要提高 MOA 架构的可观测性。
无法快速
定位异常
12. 可观测性建设
可观测性三大支柱
1. 统一监控平台(hubble)
分钟级打点监控(全面、准确)
下游资源访问监控(作为客户端)
上游调用来源监控(作为服务端)
应用关联监控:GC、进程、Error日志、容器、物理机
2. 分布式跟踪系统(momotrace)
调用链路分析
慢请求分析
3. 应用日志
秒级STAT日志
慢请求及异常请求日志(记录下游IP)
日志平台统一采集、分析、展示
The 3 Pillars of System
Observability
13. 异构语言服务代理
支持异构语言提供服务
MOA 是以 Java 生态构建的,但是在某些领域 Java 并不是主流的语言,比如大数据领域主
要使用 Python 和 C++,而且他们也有向外提供服务的需求。
MOA 对异构语言的支持是通过“服务代理”的形式实现的,该方案在 2016 年落地,可以说
是对 Service Mesh 思想的蒙昧尝试。
14. 异构语言服务代理
服务代理实现
Python Client
•
服务端
MOA协议
PHP Client
查询 服务发现
(lookup)
注册 注册中心
(MomoKeeper)
MOA协议
异构语言根据自身情况实现服务
MOA Proxy 提供 MOA 接口,
进行流量转发
MOA Proxy
GRPC
Python Server
•
MOA Proxy
FCGI
MOA协议
PHP Server
客户端
异构语言重复实现 MOA Client SDK
客户端流量没有进行代理,Client 由异构语言自己实现,
给之后的服务治理埋下了大坑。
15. Service Mesh 架构引入
服务治理的痛点
•
MOA 在服务治理方法一直存在一些痛点:
Java SDK 升级缓慢
* 升级周期需要一个季度
* 耗费业务团队和 SRE 大量精力
版本碎片化严重
* 线上使用的版本有 50+ 个
异构语言治理落后
* 异构语言 SDK 功能滞后
* 很多组件由业务团队自己维护,无法统一
16. Service Mesh 架构引入
Mesh 解决服务治理的痛点
•
MOA 治理逻辑下沉到 sidecar 代理
业务解耦,独立容器
自主升级,统一演进
跨语言统一治理
17. Service Mesh 架构引入
Mesh 方案选型
兼容性
• 使存量服务接入 Mesh 方案
• 对接大量内部系统
关键需求 • 关键收益来源数据平面建设
• 非完善的控制平面功能
其它因素 • 最成熟的服务端语言为 Java
• 技术体系内不引入其它语言
自研数据平面与控制平面
使用 Java 开发数据平面
18. Service Mesh 架构引入
Mesh 架构
•
服务实例 Pod
服务实例 Pod
业务容器
A
重点建设 Agent
业务容器
B
数据平面
•
Agent
将原有治理平台封装为控制平面
MOA MESH 协议
Kubernetes
MOA
注册中心
Agent
私有协议
MOA
服务治理
pangu
配置中心
控制平面
hubble
监控
19. Service Mesh 架构引入
平滑升级 Agent
在 Mesh 架构下,平稳升级 Agent 成为了服务治
理的关键,为此我们基于 Linux fd 迁移机制设计
了 Agent 平滑升级:
•
升级过程业务无感知
旧 Agent 将存量连接迁移到新 Agent,不影响上层业务处理请求
•
升级效率大幅提升
升级过程完全自主进行,不需要业务方配合
20. Service Mesh 架构引入
转发时延
Mesh 架构增加了一层 Agent 转发,在服务治理方法有巨大收益,但是也会增加服务请求耗
时,为了减少时延的损耗,我们做了大量优化,最终将平均时延增加降低到了 0.3ms 以内。
优化措施包括但不限于:
1. 减少编解码成本,将请求分为header和body两部分,agent只需处理 header;
2. 构建对象池,减少对象创建;
3. 非主干逻辑改为异步处理;
4. 零拷贝 Netty 请求响应的 ByteBuf 数据,直接透传;
5. 针对 agent 修改部分字段的场景对 protobuf 编码进行优化;
21. Service Mesh 架构引入
落地情况
70% 目前线上服务整体覆盖率超过70%
230 项目升级速度超过 230个/人天
覆盖率
升级速度
22. Mesh 时代的服务治理
• 优化可观测性
监控指标细化到10秒粒度
通过DDSketch算法优化p99耗时指标
• 优化长尾请求
backup request
• 优化容错
调用端异常实例检测
得益于 Mesh 架构的优势,这种治理能力的推广全覆盖仅耗费了几周时间,
在之前这是不敢想象的推广效率。
23. Service Mesh 的问题
agent时延
agent转发带来的时延增量,对于我们大部分服务是可以接受的,
但是也存在一些时延敏感的业务,另外对于大消息体的服务问题会
更明显。
目前已经在两个方向进行尝试:
1. 两个进程之间使用共享内存通信。
初步来看时延可以降低到 0.1ms 以内,并且在高负载场景更稳定
2. 以 Java Agent 的形式提供服务治理能力。
这样可以消除进程间通信的成本
24. 总结
陌陌微服务架构的演进,总的来说是为了支撑业务的发展。其中有些
演进点参考了业界实践,有些演进点是自己摸着石头过河。最近我们
引入 Mesh 架构,也并不是完全复制业界标准,主要的落脚点是解决
服务治理的问题。
架构模式层出不穷,如何选择?我们认为应该坚持两个原则:
• 实用主义
• 保持兼容
25.