消息拉取介绍|学习笔记

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 快速学习消息拉取介绍

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息拉取介绍】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12495


消息拉取介绍


消息拉取介绍

消息消费拉取的过程,消息消费有两种模式,一种是广播模式,一种是集群模式。广播模式比较简单不存在什么负载均衡,就是每一个消费者需要拉取订阅主题下面的所有队列的消息,那么重点讲解的是集群模式下的一个负载均衡的一个过程。那集群模式之下,同一个消费者组内有多个消费者,然后同一个主题又有多个消息队列,那么消费者是通过负载均衡的方式去消费这个消息,它的做法是一个消息队列只能同一时间被一个消费者去消费,而一个消费者可以去消费多个消息队列,这是它的负载均衡的一个基本思想。

以 PullMessageSerivce来看消息消费实现的机制,为什么要去研究 PullMessageSerivce ?就是刚才所讲的消费者在启动的时候,会看到 mQclientFactory cline 的客户端,它在启动的时候有PullMessageSerivce 拉取消息的服务的启动,服务的启动是做了什么事情?启动之后会调用它的 run 方法,通过PullMessageSerivce 拉取消息的方式去把消息拉下来,那怎么去拉?

while (!this.isStopped())[

try (

PullRequestpul Request = this.pullRequestQueue.take();

this.pullMessage(pullRequest);

] catch(InterruptedException ignored)

]catch (Exception e) (

log.error("PullMessage Service Run Method exception", e);

首先是从拉取队列当中去请求对象,拉取的 request 请求对象之后处理拉取的请求,那么怎么去处理?

private void pullMessage(final PullRequest pullRequest){

FinalMQConsumerInner consumer = this.moclientFactory.selectConsumer(pullRequest.getConsumerGroup());

if (consumer !m null) {

DefaultMQPushConsumerImpl impl =(DefaultMQPushConsumerImp1) consumer;

impl.pullMessage(pullRequest);

)else (

log.warn("No matchedconsumer for the PullRequest (), drop it",pullRequest);

发现它首先从请求对象当中去找到当前的 consumer ,把消费者先去找到,找到之后把消费者发现变成了推送的消费者,然后再去调用 pullMessage 的方法。

image.png

整个过程总结,PullMessageSerivce  随着 MQClientlnstance  的启动而启动起来的,启动起来之后它就会去源源不断的去取出队列当中拉取数据的请求。然后开始处理请求,在处理请求的时候先去拿到消费者,通过消费者的pullMessage  把消息请求进行处理,去拿到消息并且推给消费方。

private String consumerGroup; //消费者组

private MessageQueue messageQueue; //待拉取消息队列

private ProcessQueue processQueue; //消息处理队列

private long nextoffset; //待拉取的Messagebueue偏移量

private boolean lockedFirst = false; //是否被锁定

Pull Request其中包括当前的消费者组、待拉取消息队列、消息处理队列、待拉取的 MessageQueue偏移量以及是否被锁定。

重点研究process queen 从名字上能够看到这是处理的队列,那它和消息队列到底有什么关系?其实processqueen 就是 MessageQueue 在消费端的一个重现或者是一个快照,PullMessageSerivce 从消息服务器去拉取32条消息,默认每次拉取32条消息,按照消息队列的偏移量按顺序存放到process queen当中,然后PullMessageSerivce  就会将消息提交到消费池当中,让它去进行对应的处理,它就可以再一次去拉取新的消息了,它这么做的好处就是能实现数据的转换,并且清空之后再可以从远端拉取新的消息。

所以这里有几个东西需要额外注意,其中PullMessageSerivce 是一个拉取消息的服务。通过这个是从服务端去拉取这个消息,拉取消息拉下来之后把这个消息放到process queen当中,然后让消息消费方去从这里去取出消息进行一个处理。这是拉取消息了之后PullMessageSerivce 和process queen这两个重要的一个作用。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
开发者
Makefile基础教程(伪目标)
Makefile基础教程(伪目标)
246 0
|
数据安全/隐私保护
|
算法 安全 Java
【JVM】并发的可达性分析详细解释
【JVM】并发的可达性分析详细解释
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
885 0
|
编解码 开发工具 git
ffmpeg 常用的批处理文件(windows版)
ffmpeg 常用的批处理文件(windows版)
730 0
|
Python 容器
用tkinter做一个简单图形界面
用tkinter做一个简单图形界面
110 1
|
JavaScript Java 关系型数据库
公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)
公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)
153 2
|
存储 设计模式 Java
ThreadLocal的短板,我 TransmittableThreadLocal 来补上!(上)
ThreadLocal的短板,我 TransmittableThreadLocal 来补上!(上)
ThreadLocal的短板,我 TransmittableThreadLocal 来补上!(上)
|
数据可视化 测试技术 uml
UML之时序图
UML之时序图
284 0
|
数据采集 云安全 安全
DDos防护、Web应用防火墙 与 云防火墙 有什么区别?
《云计算小白学习云产品》:云安全产品介绍