MQ平台在VIPKID的架构演进实践
如果无法正常显示,请先停止浏览器的去广告插件。
1.
2. MQ平台在VIPKID的架构演进实践
VIPKID 基础架构存储平台
3. 主讲人
石鹏
VIPKID存储平台团队负责人
10+年专注于分布式存储、高并发、高可用,曾就职于摩托罗拉、爱奇艺
2019年5月加入VIPKID,目前负责VIPKID存储中间件平台,包括Redis平
台、Kafka平台、RocketMQ平台、ElasticSearch搜索平台、数据库访问
平台、对象存储平台等
4. 目
录
01
Content
02
03
04
平台简介
RocketMQ:业务类
Kafka:日志类
MQ平台一期方案
做了哪些Features
存在哪些不足
MQ平台二期方案
加了Proxy怎样解决MQ消息丢失、重复,保证顺序
Proxy层怎样保证高可用
基于Proxy增强MQ平台原生能力
收益总结
避免了多语言客户端迭代的风险和人工成本
流量调度和容灾自动化
5. 01
MQ平台简介
RocketMQ:业务类场景
Kafka:日志类场景
6. 02
MQ平台一期方案
我们做了什么
存在哪些不足
7. Feature1:封装Java版RocketMQ客户端
• 可动态更新客户端配置
• 避免用户自维护客户端稳定性风险
• 监控数据上报
8. Feature2:提供RocketMQ的管理后台
9. Feature3:提供Kafka的管理后台
10. Feature4:提供统一的监控告警
• 客户端上报监控信息到监控平台
• 收集Broker监控信息到监控平台
• 统一对接告警平台做IM、邮件、短信、电话等告警
11. 问题1:怎样提供MQ多语言客户端支持
• 同时维护多语言MQ客户端:升级成本高、风险大
思考:
• 怎样以最小的代价提供MQ多语言客户端?
12. 问题2:客户端升级需多业务配合,代价高
• 客户端更新需要所有业务应用升级
思考:
• 怎样规避业务端一起升级带来的代价?
13. 问题3:由于历史原因多个Kafka版本难统一
• 不同业务应用使用Kafka版本不同,怎样统一?
思考:
• 怎样统一Kafka版本且无稳定性风险?
14. 03
MQ平台二期方案
基于Proxy重构MQ平台的架构
加了Proxy后如何避免消息丢失、重复,保证顺序
Proxy层的高可用方案
基于Proxy怎样做到MQ集群容灾自动化智能化
基于Proxy提供MQ数据自动化迁移工具
基于Proxy增强Kafka消息过滤能力
15. 基于Proxy重构MQ平台的架构
• PProxy:传统MQ Producer客户端
• CProxy:传统MQ Consumer客户端
• 业务轻量级多语言客户端与Proxy通信:
GRPC
• PProxy&CProxy通信做流量调度:借助
管理后台
• 客户端无需升级:仅升级Proxy即可
• 无需维护多语言:Proxy仅用Java实现
16. 加了PProxy如何避免Kafka消息丢失
• 收到确认才算发成功
• 若超时则换Proxy重试
• 会重不会丢
17. 加了CProxy如何避免Kafka消息丢失
• 向broker提交offset后才算消费
成功
• 业务处理失败可从CProxy上重新
拉取
18. 加了PProxy怎样避免消息重复
• 发批量消息:平均负载到每个
broker
• 向单broker发送失败时仅重试该
broker对应的消息
19. 加了CProxy怎样避免消息重复
• Consumer&partition
rebalance:清空CProxy上的
buffer
• 清空buffer仍可能重复:消息已
被client拉取,rebalance后,新
的CProxy节点仍会消费此消息
20. 加了PProxy怎样保证顺序消息
• 顺序消息的原理:顺序消息落到
同一个partition, 并串行发消息
• Proxy发消息也要保证串行
21. 加了CProxy怎样保证顺序消息
问题:
• Partition与Cproxy consumer一
一对应。
• 但无法保证一个客户端仅对应一
个Cproxy consumer
解决方案:
• Client确认处理完CProxy的消息
后,CProxy consumer的后面缓
存的消息才能被其他客户端拉取
22. PProxy 如何保证高可用
• 发消息,PProxy单节点访问失败,
自动重试另一节点
• 若PProxy集群故障,业务客户端
直连MQ Broker
23. CProxy如何保证高可用
• 单台CProxy故障:消息可能会重
(Client拉取到消息,CProxy未
提交offset)但不会丢
• CProxy集群故障:消费MQ要等
CProxy恢复后
24. 基于Proxy实现MQ跨集群容灾
• 发消息,集群故障自动发现,
自动流量调度,业务无感
• 主备MQ Broker集群,单写双
消费
• 通过滑动窗口检测超阈值触发
熔断,自动检测是否恢复
• 自动流量调度
25. 基于Proxy提供集群数据迁移工具
• 切换写集群
• 单写双消费
• 原集群数据消费完毕后下线
26. 基于CProxy实现MQ消息过滤
• 需求:MQ Broker中数据格式
无法改变
• CProxy对数据预处理,消费完
并过滤好等Client来拉取,提升
性能
• 避免业务无意义消费全量消息
后做过滤
27. 后续展望
• 合并RocketMQ和Kafka的管理后台
• 合并Kafka和RocketMQ的客户端为Proxy的客户端
• 基于Proxy实现MQ的双机房双活的流量调度
28. 04
MQ平台收益总结
不必浪费人力同时维护多语言客户端
消除客户端升级带来的人力成本和稳定性风险
统一服务端MQ版本
业务层对存储层无感知,一种客户端可兼容多种MQ
自动流量调度&故障容灾
可更轻量增强MQ原生功能
29.