常用的消息队列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的消息队列相关的知识,希望对你有一定的参考价值。
参考技术A 一、redis消息队列和kafka消息队列的比较1、Redis作为消息队列
Redis的pub-sub模式非常像西式快餐一样,快产快消,全都是因为Redis是使用内存来做存取,所有你生产的消息立马会被消费者一次性全部处理掉,并且没有留下任何痕迹, 同时因为内存总是宝贵的,所以内存上会有限制,当生产者以及消费者上来的时候也会对redis的效率,还有Redis在处理发布和消费big size(10K+的文件)的数据的时候会表现出无法忍受的缓慢
如果有以下场景可以考虑使用Redis作为消息队列:
a、如果你的需求是快产快消的即时消费场景,并且生产的消息立即被消费者消费掉
b、如果速度是你十分看重的,比如慢了一秒好几千万这种
c、如果允许出现消息丢失的场景
d、如果你不需要系统保存你发送过的消息,做到来无影去无踪
e、需要处理的数据量并不是那么巨大
2、KafKa作为消息队列
KafKa的设计精妙,支持分布式,高可用的部署,并且对一个大的队列采用分成多个Partition(分区),来提高消息入队的吞吐量,分而治之的思想. 并且消费的时候支持group的概念,能够支持多个客户端消费同个队列,并且一个group中可以增加consumer的数量来扩展消费的处理量.
KafKa不熟生产者数量的影响,因为吞吐量足够支撑,即使在廉价的单机服务器上也可以有10万每秒的消息传输量,并且消费者是想什么时候消费都可以,消息它就在那里,十分灵活,不用担心来无影去无踪的恐慌.能把消息持久化,并以一定的策略(例如一定时间内删除,或者到达多大容量的时候清空)
当有一下场景的时候你可以考虑使用KafKa作为消息队列:
a、如果你想要稳定的消息队列
b、如果你想要你发送过的消息可以保留一定的时间,并不是无迹可寻的时候
c、如果你无法忍受数据的丢失
d、如果速度不需要那么的快
e、如果需要处理数据量巨大的时候
啥是消息队列?为啥要用消息队列?有那些常用的消息队列?一文解答你的疑问
文章目录
一:为什么要使用消息队列
1.使用同步的通信方法解决多个服务之间的通信
在电商支付的一个案例当中,下一个订单可能包含很多个步骤:为数据库创建订单,减库存,加积分…
如果使用同步的方式就如下图所示存在的问题就是说,造成系统开销比较大,同步的过程要保证所有的服务都顺利执行完成,整个链路执行完毕才能使下一个订单执行成功,如果在执行的途中网络出现问题,那么就会导致成功率受到影响,导致用户体验较差
- 解决同步的出现的问题可以使用异步,采用消息队列
2.使用消息队列异步解决多个服务之间的通信
- 使用异步的方式可以让我们创建订单这个业务的话可以解决提交系统的吞吐量,因为我们在创建订单的时候,发送一个消息到消息队列当中之后就可以去创建这个订单
- 然后后续要继续执行业务再异步的到对应的消息队列当中去进行拿到消息去执行即可
- 怎么保证能够让后续的服务都执行成功呢?因为创建订单成功的话,那么附带的业务都必须成功,但是这是异步的,订单已经创建成功了,怎么保证其他的业务也都能够创建成功呢?这个就要用到这个分布式事务来保证了!这个就叫做业务执行的最终一致性.
- 所以可以总结出消息队列解决的问题就是服务之间的通信问题!
- 很多资料说到消息队列的目的是通过将消息的发送和接收分离来实现应⽤程序的异步和解偶,这个给⼈的直觉是MQ 是异步的,⽤来解耦的,但是这个只是MQ的效果⽽不是⽬的。MQ真正的⽬的是为了通讯,屏蔽底层复杂的通讯协议, 定义了⼀套应⽤层的、更加简单的通讯协议。
二:消息队列的流派
- 市面上常用的消息队列:
- rabbitMQ:内部功能较多可玩性比较强,比较简单
- rocketMQ:阿里内部的大神,根据Kafka底层原理手写的一个消息中间件,性能比肩Kafka,在Kafka的基础上封装了更多的功能
- kafka:全球消息队列当中性能最好的!!!消息处理最快的一款MQ
- zeroMQ
1.有broker的消息队列
-
borker:
这个borker的作用就是用来进行消息的中转⽣产者把消息发送给它就结束⾃⼰的任务了,broker 则把消息主动推送给消费者(或者消费者主动轮询) -
重topic
整个broker又是依据topic进行消息的转发的,在重topic消息队列当中就必然需要topic的存在了
Kafka,RocketMQ,ActiveMQ等就是重topic的消息队列
- 轻topic
topic只是一种中转模式,不一定采用
RabbitMQ是一种轻topic类型的消息队列
2.无broker的消息队列
- ⽆Broker的MQ 的代表是zeroMQ。该作者⾮常睿智,他⾮常敏锐的意识到——MQ 是更⾼级的 Socket,它是解决通讯问题的。所以 ZeroMQ 被设计成了⼀个“库”⽽不是⼀个中间件.
以上是关于常用的消息队列的主要内容,如果未能解决你的问题,请参考以下文章
啥是消息队列?为啥要用消息队列?有那些常用的消息队列?一文解答你的疑问