序:
本文整理自沈老师公众号的mq系列文档:值得推荐下,欢迎大家关注(架构师之路),另外结合到家dmq的李天晨在技术大会分享PPT,比公账号的1分钟系列更加深入,供mq的自研参考,文章有些长,尽量把相关知识点写全。
一 mq介绍
消息总线(Message Queue),后面是网上的介绍:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。不在赘述。
二 MQ的业务场景
1 异步处理
demo,滴滴的订单结束的例子:对每个事件的非核心或不需要实时反馈给客户端的逻辑进行拆解,核心的主流程会变简洁。对非核心的逻辑在事件上做订阅之后,进行二级处理。但是都是通过 MysqlBinlog 处理或 MQ 处理。这里关注MQ即可。canal的方式同步binlog不在本文讨论范围。
2 业务解耦
这里是沈老师介绍上下游业务耦合的例子,原文链接
总结下对应场景:业务不关注下游结果,或者关注结果(但下游业务耗时较长)
3. 流量销峰填谷
业务场景:下游完成秒杀业务逻辑(库存检查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生成流水,余额解冻,库存解冻),上游下单业务简单,每秒发起了10000个请求,下游秒杀业务复杂,每秒只能处理2000个请求,很有可能上游不限速的下单,导致下游系统被压垮,引发雪崩。
解决方式,mq从server侧push改为业务侧pull 原文链接
三 消息必达 原文链接
(1)消息收到先落地
(2)消息超时、重传、确认保证消息必达
MQ消息投递上半场,MQ-client-sender到MQ-server流程见上图1-3:
(1)MQ-client将消息发送给MQ-server(此时业务方调用的是API:SendMsg)
(2)MQ-server将消息落地,落地后即为发送成功
(3)MQ-server将应答发送给MQ-client(此时回调业务方是API:SendCallback)
MQ消息投递下半场,MQ-server到MQ-client-receiver流程见上图4-6:
(1)MQ-server将消息发送给MQ-client(此时回调业务方是API:RecvCallback)
(2)MQ-client回复应答给MQ-server(此时业务方主动调用API:SendAck)
(3)MQ-server收到ack,将之前已经落地的消息删除,完成消息的可靠投递
补充下:ppt截图
四 消息的延迟性
传统的轮询扫表低效,利用环形队列实现延时消息。原文链接:
业务场景:
五 幂等性
还是分开从两个角度去说:生产者与消费者。
生产者:MQ-client生成inner-msg-id,保证上半场幂等。
这个ID全局唯一,业务无关,由MQ保证。
消费者:业务发送方带入biz-id,业务接收方去重保证幂等。
这个ID对单业务唯一,业务相关,对MQ透明。
***************************
通常会采用开源的mq:如RabbitMQ ,还有用于大量日志采集kafka.
到家自研框架DMQ相关介绍:大会PPT链接
******************************
沈老师公众号:架构师之路