1.什么是消息中间件
消息中间件是指:利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程之间的通信。
2.消息中间件能做什么
消息中间件主要解决的就是分布式系统之间消息传递的问题,它能够屏蔽各种平台以及协议之间的特性,实现应用程序之间的协同。
使用消息中间件,主要有如下两个特点:①异步化 ②解耦。我们可以从如下两个实例来入手,具体了解消息中间件在项目中的具体使用场景。
场景一:电商平台用户注册功能
用户注册这一服务,并不单单只是向数据库中insert一条数据即可,有些时候比如我们使用邮箱来注册,还需要发送激活邮件等操作。新用户还有可能会给你发送新人红包、发送短信等来提示你注册成功等等操作。
我们从上图这个注册服务可以看到,信息入库、发送激活短信...等每一个操作都是独立的。同时,基于领域划分(请参考:领域驱动设(DDD))以后,发送邮件短信、发送新人红包、发送注册成功短信等都属于不同的子域。所以我们可以对这些子模块来异步化执行,类似于多线程并行处理的概念。
如何实现异步化呢?多线程当然可以实现,只是消息的持久化、消息的重发这些条件,多线程并不能满足。所以需要借助一些开源中间件来解决。而分布式消息队列就是一个非常好的解决办法,引入分布式消息队列以后,架构图就变成这样了(下图是异步消息队列的场景)。通过引入分布式队列,就能够大大提升程序的处理效率,并且还解决了各个模块之间的耦合问题。
具体步骤为:用户注册成功后,发送一条信息到消息中间件,其他的几个子域如果有需要的话,只需要订阅/关注该消息中间件,就能够实现异步化操作了。这就是分布式消息队列异步化 && 解耦 的一个场景。
注册接口并不依赖其他三个子域的操作的结果。成功或失败,与主流程是没有任何影响的。做解耦,只需要在当前功能关心核心领域即可,不需要关心其他子域,只需要保证其他子域的正确性即可。
假如说这里面每一部操作都需要消耗1s,按照基础一个Conntroller开发,将这4步都写在一个Controller中,整个注册过程就需要消耗4s才能响应给客户。使用消息中间件之后,则整个过程只需要消耗1s多,便能够响应给客户,明显缩短了响应时间,这就是异步化所带来的好处。
场景二:流量削峰(秒杀、抢购情景)
比如在电商平台的秒杀场景下,流量会非常大。通过消息队列的方式可以很好的缓解高流量的问题,异步的消息队列,可以通过排队的机制,来很好的解决这一问题。
具体步骤如下:①用户提交过来的请求,先写入到消息队列。消息队列是有长度的,如果消息队列长度超过指定长度,直接抛弃; ②秒杀的具体核心处理业务,接收消息队列中消息,并进行下一步处理。
其他场景使用:
消息中间件还有更多应用场景,比如在弱一致性事务模型中,可以采用分布式消息队列的实现最大能力通知方式来实现数据的最终一致性等等
3.常用的消息中间件有哪些
①ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。官网:https://activemq.apache.org/
②RabbitMQ
AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。官网:http://www.rabbitmq.com/
③ZeroMQ
史上最快的消息队列系统,这属于是一个类库,直接使用能不快吗。官网:https://zeromq.org/
④Kafka
Apache下的一个子项目 。特点:高吞吐,在一台普通的服务器上即可以达到10w/s的吞吐速率;完全的分布式系统。适合处理海量数据。官网:http://kafka.apache.org/
⑤RocketMQ
RocketMQ是阿里开源的消息中间件,目前已经捐献给Apache基金会。它是由Java语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑。官网:http://rocketmq.apache.org/
其他一些消息中间件,使用也不是很多,这里就不再过多罗列了
END