消息中间件(MQ)

一、什么是消息中间件

关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

二、为什么需要消息中间件

1、系统解耦

     假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要这个数据。
那简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了。

问题:如果现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统慢慢的都需要这份核心数据呢?如下图:

使用MQ后,系统A就把自己的一份核心数据发到MQ里,下游哪个系统感兴趣自己去消费即可,不需要了就取消数据的消费,如下图所示:

2、异步调用

假设你有一个系统调用链路,是系统A调用系统B,一般耗时20ms;系统B调用系统C,一般耗时200ms;系统C调用系统D,一般耗时2s,如下图所示。

用户请求走完整个链路需要耗费:20ms + 200ms + 2000ms(2s) = 2220ms,
例如:外卖订餐,下订单、付款、账户扣款、创建订单、通知商家给你准备菜品、需要再找个骑手给你送餐。

3、流量削峰

假设你有一个系统,平时正常的时候每秒可能就几百个请求,系统部署在8核16G的机器的上,正常处理都是OK的,每秒几百请求是可以轻松抗住的,
但是如下图所示,在高峰期一下子来了每秒钟几千请求,弹指一挥间出现了流量高峰,此时你的选择是要搞10台机器,抗住这个瞬时高峰吗?

此时我们就可以用MQ中间件来进行流量削峰。所有机器前面部署一层MQ,平时每秒几百请求大家都可以轻松接收消息。
一旦到了瞬时高峰期,一下涌入每秒几千的请求,就可以积压在MQ里面,然后那一台机器慢慢的处理和消费。

这个就是很典型的一个MQ的用法,用有限的机器资源承载高并发请求,如果业务场景允许异步削峰,高峰期积压一些请求在MQ里,然后高峰期过了,后台系统在一定时间内消费完毕不再积压的话,那就很适合用这种技术方案。

三、常见的消息中间件有哪些

1、ActiveMQ

Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

2、RabbitMQ

使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。

 3、Kafka

 Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:

  • 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
  • 高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
  • 高堆积:支持topic下消费者较长时间离线,消息堆积量大;
  • 完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现负载均衡;
  • 支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

4、RocketMQ

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。
具有以下特点:

  • 能够保证严格的消息顺序
  • 提供针对消息的过滤功能
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

四、各种MQ之间的比较


  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:MQ是指消息中间件,是一种面向消息的中间件,通过高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它提供了消息传递和消息排队模型,在分布式环境下实现了应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等功能。\[1\] 引用\[2\]:主从模式是MQ中的一种消息传递模式。在主从模式中,消息发送者将消息发送到一个虚拟的通道(主题或队列),而消息接收者则订阅或监听该通道。消息可能会被转发给一个或多个消息接收者,这些接收者无需对发送者做出同步回应。整个过程是异步的,发送者不关心接收者如何处理消息或是否处理完毕。\[2\] 因此,主从模式消息中间件MQ是一种通过消息传递机制实现系统间异步通信的中间件。在该模式下,消息发送者将消息发送到一个通道,而消息接收者订阅或监听该通道,接收并处理消息。这种模式可以提高系统的吞吐量,实现应用解耦,削峰填谷,以及实现日志处理和消息通讯等功能。 #### 引用[.reference_title] - *1* *2* [微服务 消息中间件MQ](https://blog.csdn.net/m0_37583655/article/details/122575034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java消息中间件MQ面试题重点汇总](https://blog.csdn.net/fegus/article/details/125671153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值