消息中间件(MQ)(消息中间件的使用)
1.什么是消息中间件?
专注于数据的发送和接收,使用高效可靠的异步消息机制集成分布式系统。 通过提供消息传递和消息队列模型,它可以扩展分布式环境中的进程间通信。
二、为什么需要消息中间件 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机器上。 正常处理还可以,每秒可以轻松处理上百个请求。
但如下图所示,高峰期突然涌来每秒数千个请求,转眼就出现了流量高峰。 这时,你的选择是建造10台机器来承受这瞬间的峰值吗?
此时我们可以使用MQ中间件来削减流量高峰。 所有机器前面都部署了一层MQ,每个人都可以轻松接收每秒数百个请求的消息。
一旦达到瞬时高峰期,每秒有数千个请求会积压在MQ中,然后机器会慢慢地处理和消费它们。
这是MQ的一个非常典型的用法。 用有限的机器资源来承载高并发请求。 如果业务场景允许异步削峰,高峰期部分请求会积压在MQ中。 高峰期过后,后台系统会在一定时间内消耗。 如果不再出现积压,非常适合使用该技术方案。
三、常见的消息中间件有哪些 1、ActiveMQ
Apache 下的一个子项目。 使用Java全面支持JMS1.1和J2EE 1.4规范的JMS Provider实现,可以用少量代码高效实现高级应用场景。 可插拔传输协议支持,例如 VM 内、TCP、SSL、NIO、UDP、多播、JGroups 和 JXTA 传输。 RabbitMQ、ZeroMQ、ActiveMQ都支持常用的多语言客户端C++、Java、.Net、Python、Php、Ruby等。
2.RabbitMQ
用 Erlang 编写的开源消息队列支持多种协议:AMQP、XMPP、SMTP、STOMP。 这使得它非常重量级,更适合企业级开发。 同时实现了Broker架构。 核心思想是生产者不会直接向队列发送消息。 消息发送到客户端时首先在中央队列中排队。 它对路由、负载均衡和数据持久化有很好的支持。 它主要用于企业级ESB集成。
3.卡夫卡
Apache下的一个子项目,使用scala实现的高性能分布式发布/订阅消息队列系统,具有以下特点:
4.RocketMQ
阿里巴巴开源的分布式、队列模型的消息中间件。 原名是Metaq。 3.0版本更名为RocketMQ。 是阿里巴巴基于Kafka设计思想,使用Java实现的一套MQ。 同时,我们在阿里巴巴内部集成了多个mq产品(Notify、metaq),只维护核心功能,去除所有其他运行时依赖,确保核心功能最小化。 在此基础上,我们与阿里巴巴上述其他开源产品合作,实现不同的场景。 mq架构目前主要应用于订单交易系统。
具有以下特点:
4.各种MQ之间的比较