消息队列(如下简称MQ)是一种跨进程的通讯机制,用于上下游传递消息。前端
1.数据驱动的任务依赖数据库
如:定时任务tast1, task2, task3之间存在任务依赖关系,必须task1先执行,再task2执行,载task3执行后端
此时,MQ用来传递上游任务执行完成的消息。服务器
2.上游不关心执行结果微信
3.上游关注执行结果,但执行时间很长架构
跨公网调用微信支付接口,使用回调网关+MQ来解耦。并发
调用与被调用的关系,是没法被MQ取代的。运维
用户登陆场景,登陆页面调用passport服务,passport服务的执行结果直接影响登陆结果,此处的“登陆页面”与“passport服务”就必须使用调用关系,而不能使用MQ通讯。异步
不管如何,记住这个结论:调用方实时依赖执行结果的业务场景,请使用调用,而不是MQ。分布式
使用MQ可能存在的问题:
- 系统更复杂,多了一个MQ组件
- 消息传递路径更长,延时会增长
- 消息可靠性和重复性互为矛盾,消息不丢(架构师之路-消息总线可否实现消息必达?)不重(幂等性设计)难以同时保证
- 上游没法知道下游的执行结果,这一点是很致命的
远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合
吞吐量极高的分布式消息系统,总体设计是典型的发布与订阅系统。下图1为Kafka架构图:
图-1 Kafka架构图
消息生产者:即Producer,消息源头,负责发送消息并发送到Kafka服务器上。
消息消费者:即Consumer,消息的使用方,负责消费Kafka服务器上的消息。
主题:Topic,用户配置并定义在Kafka服务端,用于创建生产者和消费者之间的订阅关系:生产者发送消息到指定topic下,消费者从这个topic下订阅消息。
参考连接
高效开发运维-漫谈消息队列:以Kafka和RocketMQ为例
芋道源码-为何须要消息队列?使用消息队列有什么好处?(主流消息队列对比)
芋道源码-分布式消息队列RocketMQ源码分析—Message顺序发送与消费(顺序消费问题,RocketMQ支持可是通常场景不推荐使用,Kafka只能保证每一个partition内的消息顺序传输)