一些收藏收藏设计方案

业务场景实战(二)消息推送

2022-01-29  本文已影响0人  后来丶_a24d

目录


系列总目录


背景


消息推送

整体架构

整体架构.png
  1. 业务侧: 各个业务侧根据需要,接消息推送SDK发送需要推送的消息
  2. 消息推送SDK: 消息推送SDK会将需要推送的消息发送到MQ, SDK还提供了本地消息表来保证MQ发送的最终一致性
  3. 消息推送集群: 消费业务侧的MQ消息,并将消息推送到EMXQ集群,或者直接推送到第三方应用
  4. 消息推送控制台: 提供消息统计,查询等后台能力
  5. EMQX集群: 实现MQTT协议的集群,推送公司产品移动端,PC端应用的底层实现。公司产品移动端,PC端应用需要实现连接EMQX
  6. 支撑: 消息推送结论链路追踪Skywalkin; 监控Grafana以便更好的排查问题; 每个应用发送的消息都将会持久化到mysql; 出于运营复杂多样的统计需要,这里会利用DTS监听mysql binlog来进行异构同步到ElasticSearch

SDK

最终一致性保障
  1. mysql本地事务表一致性保障: 业务方执行本地事务时加上sdk提供的mysql本地消息表记录状态,执行发送mq前记录本地消息表并将状态设置为初始状态。mq发送完成时,更新本地消息状态,发送失败也更新本地消息表状态。
  2. mysql本地事务表捡漏线程: 不断轮训某段时间数据库状态,有问题数据重发送达到最终一致性。
  3. 未来版本支持更高性能的并发: 有些业务侧对性能要求很高,并且发送消息推送数据不可丢,这时mysql本地事务表就有可能是性能瓶颈。这里可以参考美团到家的架构设计思想: SDK提供同步lua脚本到redis,然后redis调用成功发送消息MQ,如果提交异常则发补偿MQ。捡漏服务监听redis的AOF SDK数据流水,然后进行校验处理。这种方法性能很高,但是实现成本也比较高。目前业务侧的最终一致性保障是通过第一种方案mysql本地事务表。


    Redis保证最终一致性.png

消息推送集群

emqx集群

MQTT技术选型
对比项 EMQ RabbitMQ Mosquitto ActiveMQ
开源机构 杭州映云科技有限公司 Rabbitmq团队 Eclipse Apache
语言 Erlang Erlang C/C++ Java
活跃度 很高 很高 一般
管理界面 提供,功能全面 提供,功能较全面
规则引擎 支持(多种方式,部分商业化) 不支持 不支持 不支持
原理
  1. 订阅表: 主题 - 订阅者,假设现在有两个broken node1和node2,topic是主题,这里topic类似mq的topic,发送者发送消息到topic, 然后topic再到订阅者。client是客户端
node1:
    topic1 -> client1, client2
    topic2 -> client3
node2:
    topic1 -> client4
  1. 路由表: 主题 - 节点
topic1 -> node1, node2
topic2 -> node3
topic3 -> node2, node4
  1. 主题树: 带统配符的主题匹配, eg如下,订阅完成时EMQ X 中会维护如下主题树 (Topic Trie) 和路由表 (Route Table):
客户端 节点 订阅主题
client1 node1 t/+/x, t/+/y
client2 node2 t/#
client3 node3 t/+/x, t/a
主题树和路由表映射关系.png
  1. 例如 client1 向主题 t/a 发布消息,消息在节点间的路由与派发流程:
  2. client1 发布主题为 t/a 的消息到节点 node1
  3. node1 通过查询主题树,得知 t/a 可匹配到现有的 t/a、t/# 这两个主题。
  4. node1 通过查询路由表,得知主题 t/a 只在 node3 上有订阅者,而主题 t/# 只在 node2 上有订阅者。故 node1 将消息转发给 node2 和 node3。
  5. node2 收到转发来的 t/a 消息后,查询本地订阅表,获取本节点上订阅了 t/# 的订阅者,并把消息投递给他们。
  6. node3 收到转发来的 t/a 消息后,查询本地订阅表,获取本节点上订阅了 t/a 的订阅者,并把消息投递给他们。

支撑

mysql异构一致性保障,弱一致性保证方案
  1. 消息推送集群:业务方mq发送的推送消息消费
  2. 消息推送集群: 持久化数据到mysql
  3. 消息推送集群:异构数据mq发送
  4. 异构服务集群: 消费消息推送的mq,进行异构数据处理
  5. DTS集群: 监听binlog变动,这个是兜底,监听的变动后发送到异构消息mq集群,集群通过时间戳判断过来的id是否有更新过
mysql异构一致性保障,强一致性保证方案

参考文章

上一篇 下一篇

猜你喜欢

热点阅读