【RocketMQ解析】⾼性能消息中间件MQ解析
最近正好在看RocketMQ的源代码,本篇⽂章主要是⽤于公司内部的⼀次整理分享。整篇⽂章将以订单系统为出发点,对⽐分析⼀些市⾯上的MQ,最终具体到RocketMQ源码分析带领⼤家全局性的了解整个MQ的流程。
户籍所在地怎么填1 传统的订单系统,存在什么问题?
图1 传统的订单下单流程
在之前公司的项⽬中有电商的经验。传统的订单下单流程分为上述的这样⼀些步骤,如图所⽰,以⽀付为例,在我们的原有系统⾥我们主要分为两个⼤流程:(1)创建订单并⽀付:如图中步骤1,2,3,4我们进⾏订单的创建(订单状态为created 创建),并发送订单的⽀付信息到。(2)接收⽀付成功回调并处理:如图中5,6,7,8 收到回调通知处理,(将订单状态更新为paid 已⽀付待发货 )然后进⾏发送优惠券和红包,发送通知,扣减库存,更新积分等操作。分别要与促销系统,通知系统,仓储系统,积分系统等进⾏交互。
徐若瑄男友换⼀个视⾓我们可以这样看这两个⼤流程:
图2 传统的订单下单流程v2
在上述步骤串⾏的情况下,但是这样的步骤存在什么问题呢?图1 传统的订单下单流程 步骤8 中的操作可能出现耗时,以及各个⼦系统的不稳定因素等情况。导致⽤户的订单⽀付虽然付了钱,但是订单的某些关联的状态却始终没有更新。
感人爱情电影这⾥“图1 传统的订单下单流程” 步骤8,也就是“图2 传统的订单下单流程v2”就是我们系统中的耗时任务,其实我们的⽤户对于这些耗时任务并并没有那么关⼼实时性,但是这些任务如果串⾏执⾏却可能导致系统性能等问题。这⾥也就引⼊了MQ的使⽤场景。二十年后的家乡五年级
2 什么是MQ?MQ 解决了什么问题?
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的⼀种数据结构。⼀般⽤来解决应⽤解耦,异步消息,流量削峰等问题,实现⾼性能,⾼可⽤,可伸缩和最终⼀致性架构。本篇⽂章将重点围绕RocketMq进⾏系统性的分析。
女人用什么头像好2.1 异步提升系统性能
这⾥单独以⽀付成功后发送通知为例,如果发送通知我们分为短信,邮件,通知等,假设步骤(1)耗时200ms,步骤(2)耗时200ms,那么整个系统⾄少要等待400ms以上。
同步调⽤
我们引⼊了MQ之后系统变成了如下图所⽰,步骤变多了,但是对于系统来说却是优化了。
在我们将订单信息发送给MQ之后,我们不需要等待通知系统的事务,RPC调⽤邮件⽹关,发送邮件等操作。⽤户可以迅速的获取到订单⽀付成功状态。哪怕是10s,20s之后⽤户再收到⽀付成功的邮件通知等,也是完全可以接受的。
MQ引⼊异步提升系统性能
2.2 降低系统耦合
同样是考虑上⾯的场景,如果⽤户⼀直在同步等待发送通知,通知系统发送失败了,对于没有MQ的场景,我们肯定是要处理对应的错误的。但是在引⼊MQ的场景⾥,在通知系统拉取订单信息并消费,然后发送通知失败后,我们肯定可以有机制确保这条订单信息是保存在MQ⾥⾯的。于是MQ的引⼊,降低了系统的耦合程度。
2.3 流量削峰
在单机mysql的情况下,⼀般Mysql可以做到⼏百的qps是没问题的。但是如果我们部署多台机器,⽤户量上来的话,肯定会导致Mysql被数据压垮。
MQ引⼊前流量洪峰
在引⼊MQ之后我们可以实现流量的削峰。特别是对于电商的秒杀场景或者做活动的时候。我们的瞬时⽤户订单量都会上来,⽽且持续时间不会太长。我们可以将这些操作写⼊MQ,从⽽实现了数据流量的“削峰填⾕”。
MQ引⼊后流量削峰
上⾯说了MQ的三个优点,其实在实际的⽣产环境中,我们引⼊MQ之后也会存在:消息丢失,消息幂等性(不重复),消息积压故障,分布式消息的⼀致性等问题。下⾯⽂章中也会对这些问题进⾏剖析以及提供⼀些对应的解决⽅案。好看的日本动画片
3 各种MQ的对⽐
3.1 MQ对⽐
MQ对⽐
下⾯⽂章中也会提炼部分MQ内容进⾏讲解。
3.2 消息队列选择建议
1.Kafka
在上⾯的所有消息队列中,Kafka可以说是整体性能最⾼的,⽽且是天⽣⽀持分布式的。Kafka主要特点是基于Pull的模式基于消息的offset来处理消息消费,追求⾼吞吐量,⼀开始的⽬的就是⽤于⽇志收集和传输,适合产⽣⼤量数据的互联⽹服务的数据收集业务。
⼤型公司建议可以选⽤,如果有⽇志采集功能,肯定是⾸选kafka了。
2.RocketMQ
天⽣为⾦融互联⽹领域⽽⽣,对于可靠性要求很⾼的场景,尤其是电商⾥⾯的订单扣款,以及业务削峰,在⼤量交易涌⼊时,后端可能⽆法及时处理的情况。
RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿⾥双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。
3.RabbitMQ
RabbitMQ :结合erlang语⾔本⾝的并发优势,性能较好,社区活跃度也⽐较⾼,但是不利于做⼆次开发和维护。不过,RabbitMQ的社区⼗分活跃,可以解决开发过程中遇到的bug。
如果你的数据量没有那么⼤,⼩公司优先选择功能⽐较完备的RabbitMQ。
4 整体系统架构
kafka架构
Producer:⽣产者,也就是发送消息的⼀⽅。⽣产者负责创建消息,然后将其发送到 Kafka。
Consumer:消费者,也就是接受消息的⼀⽅。消费者连接到 Kafka 上并接收消息,进⽽进⾏相应的业务逻辑处理。
Consumer Group:⼀个消费者组可以包含⼀个或多个消费者。使⽤多分区 + 多消费者⽅式可以极⼤提⾼数据下游的处理速度,同⼀消费组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消息消息时互不影响。Kafka 就是通过消费组的⽅式来实现消息 P2P 模式和⼴播模
Broker:服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论