什么是消息中间件?
在了解什么是消息中间件之前我们要先理解什么是同步,什么是异步
同步与异步
**同步(Synchronous)😗*调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
**异步(Asynchronous) 😗*调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。
我们拿传统系统架构来几个例子用户发起请求给系统A,系统A接到请求直接调用系统B,系统B返回结果后,系统A才能返回结果给用户,这种模式就是同步调用。
而引入了MQ(英文全称“Message Queue”,简称MQ)以后呢,用户发起请求给系统A,此时系统A发送消息给MQ,然后就返回结果给用户,不去管系统B了。然后系统B根据自己的情况,去MQ中获取消息,获取到消息的时候可能已经过了1分钟甚至1小时,再根据消息的指示执行相应的操作。这种通信方式就是异步的,A与B之间不直接通信,A不去管B什么时候执行,B去MQ拉去消息后也不用通知A。
什么是消息中间件
那么消息中间件到底是什么呢?
大多数书籍中,把MQ中间件类比为邮局,因为邮局本身就是收发消息的,与MQ的生产者、消费者都能匹配上。这就有点类似我们耳熟能详的生产者消费者问题了,我们呢可以把它理解为一个强大的中介,生产者只管往里面放入生产的消息,消费者只管从里面取出消息
我们只需要把消息中间件理解为中间件中的一种,消息队列中间件也称消息中间件或消息队列,他主要的特点就是异步处理,就像我们上面说的一样,消息的生产者和消费者之间不直接通信,而是通过引入一个消息队列来保存生产者生产的消息,消费者从队列中去取消息。
消息队列的协议
不同的消息队列,可能会遵循不同的公共协议,也有可能自己制定的协议。比如OpenMQ支持JMS协议,rabbitmq支持AMQP协议,ActiveMQ支持比较多,而Kafka和rocketmq则有自己的一套玩法。
JMS协议
Java消息服务(Java Message Service),是一个Java平台中关于面向消息的中间件的API,用于两个应用程序之间或者分布式 系统中发布消息,进行异步通信。
AMQP协议
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。
常见消息队列
开源的消息中间件有很多,比如RabbitMQ,kafka,rocketmq,activemq等等,针对不同的业务场景我们可以选择不同的中间件,下面一张图对比了各种中间件的区别:
消息队列的作用
消息中间件的作用呢总结起来就是三个:异步化、降低耦合度、流量削峰。
异步化
我们引用上面介绍同步异步通信的图来说一下,
在没有引入MQ的时候,我们用户一次请求到返回一共耗时180ms,
引入MQ以后呢我们看看一次请求到返回总共耗时70ms,后面的执行步骤我们安全不用管,这样用户的请求响应时间大大缩短了,极大地提高了用户的使用体验!
降低耦合度
我们现在假设这样一种情况,有一天,你们部门大佬叫你在系统里接入A系统,,然后我就在代码里面调用了A,接下来大佬又叫你接入B、C系统,你又改了代码;忽然有一天,大佬说A系统不需要接入了,你又改了代码。这样是不是非常麻烦,对一个程序员来说简直想要***了!
那MQ如何解耦合呢?
解耦后
假设我们设计一种电商系统,这种交易系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,我们需要考虑各个系统之间的通信,安全,用户体验等问题,不能说如果一个点击下单后,过了5,6秒才下单成功,这样的系统给用户的体验是极差的。通过 MQ 的异步化设计,即便下游子系统(如物流、积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转;而且通过 MQ 的异步化设计,也能随时接入新的系统,适应业务的变化。
流量削峰
双十一秒杀、抢红包等活动皆会带来较高的流量,如果没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,削峰填谷是解决该问题的最佳方式;
通过 MQ 超高性能的消息处理能力可以承接流量脉冲而不被击垮,在确保系统可用性同时,因快速有效的请求响应而提升用户的体验。可以把请求丢到MQ、服务器处理完了再去取请求。
这就是流量削峰的过程图。在电商秒杀、抢票等等具有流量峰值的场景下可以使用这么一套架构。
欢迎点赞加收藏,拒绝白嫖!!!
欢迎点赞加收藏,拒绝白嫖!!!
欢迎点赞加收藏,拒绝白嫖!!!