RocketMQ原理

一、消息队列

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的信息。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值