大家好,欢迎来到IT知识分享网。
大家好,我是mikechen。
我之前讲过在分布式高并发等架构里,消息队列是非常重要的利器,刚好最近也有小伙伴大厂归来,重点也问到了消息队列。
今天我就全面的来谈谈消息队列,希望有所帮助@mikechen
消息队列
消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。
消息队列是一种应用程序之间通过异步通信进行数据交换的通信模式。
它可以用于将消息从一个应用程序发送到另一个应用程序,实现解耦、并发处理、削峰填谷等功能。
现在常用的MQ组件有:RabbitMQ、RocketMQ、Kafka等。
虽然不同的MQ都有自己的特点和优势,但是不管是哪种MQ,都有MQ本身自带的一些特点,下面咱们谈谈消息队列的的特点、优势、选型、以及应用场景@mikechen
为什么需要消息队列
在高并发分布式环境下,由于来不及同步处理,通过使用消息队列,可以异步处理请求,从而缓解系统的压力。
举一个订单系统的例子:用户点击下订单,会触发以下业务逻辑流程:
- 扣减库存
- 生成相应的订单
- 发短信通知等等
在业务发展初期这些逻辑可能放在一起同步执行,随着业务订单量增长,需要提升系统服务的性能,这时候可以将一些不需要立即生效的操作拆分出来异步执行,比如发短信通知等,这种场景就可以使用消息队列MQ。
本质还是通过异步来解决同步的系统压力,所以我们在做架构设计的时候有一个原则:能异步的就尽量不要同步。
消息队列的类型
消息队列主要包含两种:一个是点对点,一个是发布订阅模型。
1.点对点
点对点队列模型是一种一对一的消息传递模型,其中每个消息只能被一个接收者消费。
如下图所示:
发送者将消息发送到队列中,而接收者从队列中获取消息并进行处理,一旦消息被接收者消费,它将从队列中删除。
这种模型适用于需要可靠传递的消息,以及需要确保消息只被一个接收者处理的场景。
2.发布订阅
发布/订阅模型是一种一对多的消息传递模型,其中消息被发送到一个主题(Topic),而订阅该主题的所有接收者都会接收到该消息。
如下图所示:
发布订阅模型包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。
发送者将消息发布到主题,而订阅者通过订阅感兴趣的主题来接收消息。
这种模型适用于需要将消息广播给多个接收者的场景,如实时广播、事件通知等。
消息队列的特点
1.异步性
将耗时的同步操作,通过以发送消息的方式,进行了异步化处理。减少了同步等待的时间。
2.松耦合
消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。
3.分布式
通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(当然消息队列本身也可以做成分布式集群)。
4.可靠性
消息队列一般会把接收到的消息存储到本地硬盘上(当消息被处理完之后,存储信息根据不同的消息队列实现,有可能将其删除),这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。
消息队列的选型
1.ActiveMQ
Apache出品,最早使用的消息队列产品,时间比较长了,最近版本更新比较缓慢。
2.RabbitMQ
RabbitMQ是erlang语言开发,结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。性能较好,但是不利于做二次开发和维护。
3.RocketMQ
阿里开源的消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
4.ZeroMQ
号称最快的消息队列系统,尤其针对大吞吐量的需求场景。
扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发大量的代码。
5.Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。
6.消息队列的详细比较
消息队列的应用场景
1.异步处理
消息队列常用于实现异步处理,如将请求放入队列,然后由后台进程或服务逐个处理。这可以提高应用程序的响应速度,允许前端快速返回,而后台慢慢处理任务。
2.解耦应用
消息队列可以解耦不同组件、模块或微服务之间的依赖关系。发布者将消息发送到队列,而不需要关心谁会处理,这使得各组件可以独立演化。
3.削峰填谷
在流量波动大的场景下,消息队列可以用来缓冲和平滑处理峰值流量,防止系统过载,同时避免资源浪费。
4.日志传输
应用程序可以将日志消息发送到消息队列,然后由日志收集器订阅和处理,以分散日志的收集和存储压力。
更多分布式架构系列、阿里架构师进阶系列,请查看以下文章:
阿里架构师进阶从0到1全部合集(建议收藏)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/97679.html