文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
基本原理
总体架构图
零拷贝
零拷贝技术是一个思想,指的是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。
- RocketMQ内部使用基于mmap实现的零拷贝,用来读写文件。
mmap():
mmap(memory map)是一种内存映射文件的方法。
- 即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
简单地说就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝。
消息存储
CommitLog:
CommitLog
,消息存储文件,所有主题的消息都存储在CommitLog
文件中。业务系统向
RocketMQ
发送一条消息,最终这条消息会被持久化到CommitLog
文件。一台
Broker服务器
只有一个CommitLog
文件(组),RocketMQ
会将所有主题的消息存储在同一个文件中,这个文件中就存储着一条条Message,每条Message都会按照顺序写入。
ConsumeQueue:
它是为了高效检索主题消息的。
通过
ConsumerQueue
可以知道消息的长度和偏移量,那么查找消息就比较容易了。消息偏移量的差值等于 =
消息长度 * 队列长度
。
Index:
除了通过消息偏移量来查找消息的方式,还提供了其他几种方式可以查询消息:
- 通过Message Key查询
- 通过Unique Key查询
- 通过Message Id查询
Message Key和Unique Key
都是在消息发送之前,由客户端生成的。可以自己设置,也可以由客户端自动生成,
Message Id
是在Broker
端存储消息的时候生成。
消费方式
在RocketMQ里消费方式虽有PUSH与PULL两种,但实现机制实为 PULL 模式,PUSH 模式是一种伪推送,是对 PULL 模式的封装,每拉去一批消息后,提交到消费端的线程池(异步),然后马上向 Broker 拉取消息,即实现类似 推 的效果。
拉取式消费(Pull Consumer):
Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。
一旦获取了批量消息,应用就会启动消费过程。
- Pull指的是客户端主动向服务端请求,拉取数据。
由消费者客户端主动向消息中间件(MQ消息服务器代理)拉取消息。
采用Pull方式,如何设置Pull消息的频率需要重点去考虑:
举个例子来说,可能1分钟内连续来了1000条消息,然后2小时内没有新消息产生(消息延迟与忙等待)。
如果每次Pull的时间间隔比较久,会增加消息的延迟,即消息到达消费者的时间加长,MQ中消息的堆积量变大。
若每次Pull的时间间隔较短,但是在一段时间内MQ中并没有任何消息可以消费,那么会产生很多无效的Pull请求的RPC开销,影响MQ整体的网络性能。
推动式消费(Push Consumer):
该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。
Push指的是客户端与服务端建立好网络长连接,当服务端有数据时立即通过连接将数据推送给客户端。
由消息中间件(MQ消息服务器代理)主动地将消息推送给消费者。
采用Push方式,可以尽可能实时地将消息发送给消费者进行消费。
但是,在消费者的处理消息的能力较弱的时候(比如,消费者端的业务系统处理一条消息的流程比较复杂,其中的调用链路比较多导致消费时间比较久:慢消费问题),而MQ不断地向消费者Push消息,消费者端的缓冲区可能会溢出,导致异常。
长轮询:
在PULL模式下为了保证消费的实时性,采起了长轮询消息服务器拉取消息的方式,每隔一定时间客户端向服务端发起一次请求。
如果有数据则取回进行消费,如果服务端没数据客户端线程会阻塞,阻塞时间为15S,有数据了就会被唤醒。
长轮询还是由Consumer发起的,因此就算Broker端有大量数据也不会主动推送给Consumer。
RocketMQ 中 PULL 模式和 PUSH 模式的区别:
标签:总结,PULL,消费,基本原理,Broker,拉取,消息,RocketMQ,客户端 From: https://blog.csdn.net/qq_35508033/article/details/140789167PULL 模式是从 Broker 拉取消息后放入缓存,然后消费端不停地从缓存取出消息来执行客户端定义的处理逻辑,而 PUSH 模式是在死循环中不停的从 Broker 拉取消息,拉取到后调用回调函数进行处理,回调函数中调用客户端定义的处理逻辑。
- 消费者订阅主题,然后自动进行集群内消息队列的动态负载,自动拉取消息,准实时。
PUSH 模式拉取消息依赖死循环来不停唤起业务,而 PULL 模式拉取消息是通过 MessageQueue 监听器来触发消息拉取线程,消息拉取线程会在拉取完一次后接着下一次拉取。
- 消费者无需订阅主题,由业务方(应用程序)直接根据MessageQueue拉取消息。