分布式之消息队列的特色、选型、及应用场景详解

什么是消息队列

消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。前端

消息(Message)是指在应用之间传送的数据,消息能够很是简单,好比只包含文本字符串,也能够更复杂,可能包含嵌入对象。segmentfault

消息队列(Message Queue)是一种应用间的通讯方式,消息发送后能够当即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而无论谁来取,消息使用者只管从MQ中取消息而无论谁发布的,这样发布者和使用者都不用知道对方的存在。网络

file

  • Producer:消息生产者,负责产生和发送消息到 Broker;
  • Broker:消息处理中心。负责消息存储、确认、重试等,通常其中会包含多个 queue;
  • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理;

如今经常使用的MQ组件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ,固然近年来火热的Kafka,从某些场景来讲,也是MQ,固然kafka的功能更增强大。架构

虽然不一样的MQ都有本身的特色和优点,可是,不论是哪一种MQ,都有MQ自己自带的一些特色,下面,我们谈谈消息队列的的特色、优点、选型、以及应用场景。并发

为何须要消息队列

在高并发分布式环境下,因为来不及同步处理,经过使用消息队列,能够异步处理请求,从而缓解系统的压力。异步

举一个订单系统的例子:用户点击下订单,会触发如下业务逻辑流程:socket

  • 扣减库存
  • 生成相应的订单
  • 发短信通知等等

在业务发展初期这些逻辑可能放在一块儿同步执行,随着业务订单量增加,须要提高系统服务的性能,这时候能够将一些不须要当即生效的操做拆分出来异步执行,好比发短信通知等,这种场景就可使用消息队列MQ。分布式

本质仍是经过异步来解决同步的系统压力,因此咱们在作架构设计的时候有一个原则:能异步的就尽可能不要同步。高并发

消息队列的优势

一、屏蔽异构平台的细节:发送方、接收方系统之间不须要了解双方,只需认识消息。性能

二、异步:消息堆积能力;发送方接收方不需同时在线,发送方接收方不需同时扩容(削峰)。

三、解耦:防止引入过多的API给系统的稳定性带来风险;调用方使用不当会给被调用方系统形成压力,被调用方处理不当会下降调用方系统的响应能力。

四、复用:一次发送屡次消费。

五、可靠:一次保证消息的传递。若是发送消息时接收者不可用,消息队列会保留消息,直到成功地传递它。

六、提供路由:发送者无需与接收者创建链接,双方经过消息队列保证消息可以从发送者路由到接收者,甚至对于原本网络不易互通的两个服务,也能够提供消息路由。

file

消息队列的特色

1.异步性

将耗时的同步操做,经过以发送消息的方式,进行了异步化处理。减小了同步等待的时间。

2.松耦合

消息队列减小了服务之间的耦合性,不一样的服务能够经过消息队列进行通讯,而不用关心彼此的实现细节,只要定义好消息的格式就行。

3.分布式

经过对消费者的横向扩展,下降了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(固然消息队列自己也能够作成分布式集群)。

4.可靠性

消息队列通常会把接收到的消息存储到本地硬盘上(当消息被处理完以后,存储信息根据不一样的消息队列实现,有可能将其删除),这样即便应用挂掉或者消息队列自己挂掉,消息也可以从新加载。

消息队列的选型

file

1.ActiveMQ

file

Apache出品,最先使用的消息队列产品,时间比较长了,最近版本更新比较缓慢。

2.RabbitMQ

file

RabbitMQ是erlang语言开发,结合erlang语言自己的并发优点,支持不少的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的很是重量级,更适合于企业级的开发。性能较好,可是不利于作二次开发和维护。

3.RocketMQ

file

阿里开源的消息中间件,纯Java开发,具备高吞吐量、高可用性、适合大规模分布式系统应用的特色。

4.ZeroMQ

file

号称最快的消息队列系统,尤为针对大吞吐量的需求场景。

扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的从新封装,若是作为消息队列使用,须要开发大量的代码。

5.Kafka

file

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。

6.消息队列的详细比较

file

7.消息队列总结

消息队列的选型须要根据具体应用需求而定,ZeroMQ小而美,RabbitMQ大而稳,Kakfa和RocketMQ快而强劲。

消息队列的应用场景

1.异步处理

消息队列的主要特色是异步处理,主要目的是减小请求响应时间,实现非核心流程异步化,提升系统响应性能。

因此典型的使用场景就是将比较耗时并且不须要即时(同步)返回结果的操做,做为消息放入消息队列。

2.应用解耦

file

使用了消息队列后,只要保证消息格式不变,消息的发送方和接收方并不须要彼此联系,也不须要受对方的影响,即解耦。

每一个成员没必要受其余成员影响,能够更独立自主,只经过消息队列MQ来联系。

举一个例子:用户下订单流程,下订单后会发生扣库存这个动做,上游系统订单和下游系统扣库存,就能够经过上图的消息队列MQ来联系,扣库存异步化,从而实现订单系统与库存系统的应用解耦。

3.流量削锋

流量削锋也是消息队列中的经常使用场景,通常在秒杀或团抢活动中使用普遍。

应用场景:秒杀活动,通常会由于流量过大,致使流量暴增,应用挂掉。为解决这个问题,通常须要在应用前端加入消息队列。

4日志处理

日志处理是指将消息队列用在日志处理中,好比Kafka的应用,解决大量日志传输的问题。

5消息通信

消息队列通常都内置了高效的通讯机制,所以也能够用于单纯的消息通信,好比实现点对点消息队列或者聊天室等。

相关文章
相关标签/搜索