一、消息队列
1、什么是消息队列
消息队列是一种进程间或是统一进程的不同线程的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列的记录包含有详细的说明数据,包括发生的时间,输入设备的种类,以及特定的输入参数,也就是:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。 ---维基百科
这时一个比较官方的定义,举一个生活中常见的例子:这种机制就和代理差不多,商家和卖家不直接接触,而是和代理商联系,商家把货压给代理商,卖家通过代理商来进行购买。即你不用知道具体的服务在哪里,如何调用。你要做的只是将改发送的消息,想你们约好的地址进行发送,你的任务就完成了,对应的服务自然可以监听到你发送的消息,进行后续的处理,这就是消息队列最大的特点,将同步操作转为异步处理,将多服务共同操作转为职责单一的单服务操作,做到了服务将的解耦。
2、名词解释
(1)producer:消息生产者,负责产生和发送消息到Broker。
(2)broker:消息处理中心。负责消息的存储、确认、重试,一般其中会包含多个队列。
(3)consumer:消息消费者,负责从broker中获取消息,并进行相应的处理。
3、特性
(1)异步性:将耗时的同步操作,通过以发送消息的方式,进行了异步化的处理。减少了同步等待的时间。
(2)松耦合:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。
(3)分布式:通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(当然消息队列本身也可以做成分布式集群)
(4)可靠性:消息队列一般会把接收到的消息存储到本地的硬盘(当消息处理完之后,存储信息根据不同的消息队列是实现,有可能将其删除),这样即使应用挂掉或者消息队列挂掉,消息也能够重新加载。
本部分摘自一个故事告诉你什么是消息队列转载请保留出处。
4、为什么会有消息队列
消息队列主要是用于不同进程或同一进程的不同线程之间的通信。那为什么会产生消息队列那?
(1)不同进程之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这个两个进程,在两个进程间抽离出一层,所有两个进程之间的消息,都必须通过消息队列来传递,单独修改某一个进程不会影响另一个。
(2)不同进程之间传递消息时,为了实现标准化,将消息的格式规范化了,并且消息太多,一时间处理不完,为了保证的先后顺序,就出现了消息队列。
本部分摘自RabbitMQ教程转载请保留出处。
二、RocketMQ
关于RocketMQ历史的网上有很多的资料这里就不在赘述了,在这一部分我们一起了解一下RocketMQ的原理。
RocketMQ是一款分布式、队列模式的消息中间件,具有以下的特点:
(1)能够保证严格的消息顺序
(2)提供丰富的消息拉取模式
(3)高效的订阅水平扩展能力
(4)实时消息的订阅机制
(5)亿级消息堆积能力
1、RocketMQ网络部署图
在上面提到过,MQ中有producer(生产者)、consumer(消费者)、broker(代理),在RocketMQ中还有namesrv。
2、RocketMQ的机制
(1)broker
单个broker和所有的namesrv保持长连接,每隔30秒发送一次心跳,心跳包含了自身的topic配置信息,namesrv每隔10秒,扫描所有还存活的连接,若某个连接2分钟内(当前时间与最好更新时间差值超过2分钟)没有发送心跳,则断开连接。一旦broker挂掉,那么namesr就会和broker断开,并更新topic和队列的对应关系,但不会通知生产者和消费者(生产者和消费者会在更新Topic信息时,就会知道那个broker挂掉了)。
(2)producer(生产者)
单个生产者和一台namesrv保持长连接,定时查询Topic配置信息,如果该namesrv挂掉,生产者会自动连接下一个namesrv,直到有可用的连接为止,并能自动连接,一般情况下生产者每隔30秒(可以配置)就会从namesrv上获取Topic的最新队列情况。生产者和namesrv之间并没有心跳。
单个生产者和该生产者关联的所有broker(Master)保持长连接。生产者每隔30秒会向所有关联的borker发送心跳,broker每隔10秒扫描所有存活的连接,如果broker在2分钟内没有收到心跳数据,则关闭与producer的连接。
(3)consumer(消费者)
消费者和生产者的机制差不多,不过,消费者会和该消费者关联的所有broker(Master和salve)都保持长连接,当主master broker挂掉之后,消费者会转向salve broker消费。
(4)namesrv(命名服务)
namesrv的主要作用是保存broker的信息,生产者和消费者定时去namesrv处更新broker的信息。