Please enable JavaScript.
Coggle requires JavaScript to display documents.
MQ(Message Queue) (WHEN (上游不关心多下游执行结果 (案例 (招聘用户发布帖子后,招聘业务要奖励58豆,…
MQ(Message Queue)
WHEN
异步处理
异步返回执行时间长
回调网关+MQ
流程
(1)调用方直接跨公网调用微信接口
(2)微信返回调用成功,此时并不代表返回成功
(3)微信执行完成后,回调统一网关
(4)网关将返回结果通知MQ
(5)请求方收到结果通知
应用解耦
流量削峰
当上下游系统处理能力存在差距的时候,可以用消息队列进行缓冲
日志处理
消息通讯
数据驱动的任务依赖
傳統解法 crontab 排程錯開時間執行
如果有一个任务执行时间超过了预留buffer的时间,将会得到错误的结果
总任务的执行时间很长,总是要预留很多buffer,如果前置任务提前完成,后置任务不会提前开始
如果一个任务被多个任务依赖,这个任务将会称为关键路径,排班表很难体现依赖关系,容易出错
如果有一个任务的执行时间要调整,将会有多个任务的执行时间要调整
MQ解法
任务之间通过MQ来传递“开始”与“结束”的通知
不需要预留buffer,上游任务执行完,下游任务总会在第一时间被执行
依赖多个任务,被多个任务依赖都很好处理,只需要订阅相关消息即可
有任务执行时间变化,下游任务都不需要调整执行时间
MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据
上游不关心多下游执行结果
上游需要关注执行结果时要用“RPC调用”
上游不关注执行结果时,使用MQ
流程
(1)帖子发布成功后,向MQ发一个消息
(2)哪个下游关注“帖子发布成功”的消息,主动去MQ订阅
優點
(1)上游执行时间短
(2)上下游逻辑+物理解耦,除了与MQ有物理连接,模块之间都不相互依赖
(3)新增一个下游消息关注方,上游不需要修改任何代码
案例
招聘用户发布帖子后,招聘业务要奖励58豆
房产用户发布帖子后,房产业务要送2个置顶
二手用户发布帖子后,二手业务要修改用户统计数据
使用RPC解法的缺點
(1)帖子发布流程的执行时间增加了
2)下游服务当机,可能导致帖子发布服务受影响,上下游逻辑+物理依赖严重
(3)每当增加一个需要知道“帖子发布成功”信息的下游,修改代码的是帖子发布服务
歷史
1985 The Information Bus(TIB)
1993 IBM WebSphere MQ
1997 Microsoft MSMQ
2001 JMS(Java Message Service)
提供公共 Java API 的方式,隐藏单独 MQ 产品供应 商提供的实际接口
ActiveMQ
2006 AMQP, RabbitMQ
由 Cisco 、 Redhat 、iMatix 等联合制定了 AMQP 的公开标准
2010 LinkedIn Kafka
不支持AMQP协议
类似Topic和Consumer Group的概念
2011 阿里 RocketMQ
不支持AMQP协议
类似Topic和Consumer Group的概念
方案
ActiveMQ
社区算是比较成熟
性能比较差
版本迭代很慢
不推荐使用
RabbitMQ
吞吐量方面虽然稍逊于 Kafka 和 RocketMQ
erlang 开发
并发能力很强,性能极其好,延时很低,达到微秒级
社区活跃度很高
如果不是用於大數據(即時,日誌)可優先考慮
RocketMQ
Java
Kafka
超高的吞吐量
ms 级的延迟
极高的可用性以及可靠性
分布式可以任意扩展
劣势是有可能消息重复消费
对数据准确性会造成极其轻微的影响
在大数据领域中以及日志采集中,这点轻微影响可以忽略
WHAT
属于分布式系统中的一个子系统
关注于数据的发送和接收
利用高效可靠的消息传递机制对分布式系统中的其余各个子系统经进行集成
協定
JMS
AMQP
概念
Server/Broker: 接受客户端的连接,实现AMQP实体服务
Connection: 一个网络连接,比如TCP/IP套接字连接
Channel: 多路复用连接中的一条独立的双向数据流通道
Message: 服务器和应用程序之间传送的数据
Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性
Body则就是消息体内容
Virtual Host: 逻辑隔离,最上层的消息路由
可以有若干个Exchange和Queue
不能有相同名称的Exchange或Queue
Binding: 消息队列和交换器之间的关联
Routing Key: 交换器可以用这个消息头决定如何路由某条消息
Message Queue: 用来保存消息直到发送给消费者
WHY