• 12第三章:【06】offset管理


    一、offset 管理

    这里的 offset 指的是 Consumer 的消费进度 offset。

    消费进度 offset 是用来记录每个 Queue 的不同消费组的消费进度的。根据消费进度记录器的不同,可以分为两种模式:本地模式和远程模式。

    二、offset 本地管理模式

    当消费模式为广播消费时,offset 使用本地模式存储。因为每条消息会被所有的消费者消费,每个消费者管理自己的消费进度,各个消费者之间不存在消费进度的交集。

    Consumer 在广播消费模式下 offset 相关数据以 json 的形式持久化到 Consumer 本地磁盘文件中,默认文件路径为当前用户主目录下的.rocketmq_offsets/${clientId}/${group}/Offsets.json

    其中${clientId}为当前消费者 id,默认为ip@DEFAULT${group}为消费者组名称。

    三、offset 远程管理模式

    当消费模式为集群消费时,offset 使用远程模式管理。因为所有 Cosnumer 实例对消息采用的是均衡消费,所有 Consumer 共享 Queue 的消费进度。

    Consumer 在集群消费模式下 offset 相关数据以 json 的形式持久化到 Broker 磁盘文件中,文件路径为当前用户主目录下的store/config/consumerOffset.json

    Broker 启动时会加载这个文件,并写入到一个双层 Map(ConsumerOffsetManager)。外层 map 的 key 为 topic@group,value 为内层 map。内层 map 的 key 为 queueId,value 为 offset。当发生 Rebalance 时,新的 Consumer 会从该 Map 中获取到相应的数据来继续消费。

    集群模式下 offset 采用远程管理模式,主要是为了保证 Rebalance 机制。

    四、offset 用途

    消费者是如何从最开始持续消费消息的?消费者要消费的第一条消息的起始位置是用户自己通过 consumer.setConsumeFromWhere()方法指定的。

    在 Consumer 启动后,其要消费的第一条消息的起始位置常用的有三种,这三种位置可以通过枚举类型常量设置。这个枚举类型为 ConsumeFromWhere。

    CONSUME_FROM_LAST_OFFSET:从 queue 的当前最后一条消息开始消费

    CONSUME_FROM_FIRST_OFFSET:从 queue 的第一条消息开始消费

    CONSUME_FROM_TIMESTAMP:从指定的具体时间戳位置的消息开始消费。这个具体时间戳 是通过另外一个语句指定的 。

    consumer.setConsumeTimestamp(“20210701080000”) yyyyMMddHHmmss

    当消费完一批消息后,Consumer 会提交其消费进度 offset 给 Broker,Broker 在收到消费进度后会将其更新到那个双层 Map(ConsumerOffsetManager)及 consumerOffset.json 文件中,然后向该 Consumer 进 行 ACK,而 ACK 内容中包含三项数据:当前消费队列的最小 offset(minOffset)、最大 offset(maxOffset)、及下次消费的起始 offset(nextBeginOffset)。

    五、重试队列

    当 rocketMQ 对消息的消费出现异常时,会将发生异常的消息的 offset 提交到 Broker 中的重试队列。系统在发生消息消费异常时会为当前的 topic@group 创建一个重试队列,该队列以%RETRY%开头,到达重试时间后进行消费重试。

    六、offset 的同步提交与异步提交

    集群消费模式下,Consumer 消费完消息后会向 Broker 提交消费进度 offset,其提交方式分为两种:

    同步提交:消费者在消费完一批消息后会向 broker 提交这些消息的 offset,然后等待 broker 的成功响应。若在等待超时之前收到了成功响应,则继续读取下一批消息进行消费(从 ACK 中获取 nextBeginOffset)。若没有收到响应,则会重新提交,直到获取到响应。而在这个等待过程中,消费者是阻塞的。其严重影响了消费者的吞吐量。

    异步提交:消费者在消费完一批消息后向 broker 提交 offset,但无需等待 Broker 的成功响应,可以继续读取并消费下一批消息。这种方式增加了消费者的吞吐量。但需要注意,broker 在收到提交的 offset 后,还是会向消费者进行响应的。可能还没有收到 ACK,此时 Consumer 会从 Broker 中直接获取 nextBeginOffset。

  • 相关阅读:
    计算机系统结构之重要知识点总结2
    计算机系统结构之重要知识点总结1
    蓝桥杯 历届试题 幸运数(暴力打表)
    蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)
    蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)
    蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
    蓝桥杯 历届试题 小朋友排队(数状数组+离散化||归并排序||线段树+离散化)
    poj 1932 XYZZY(spfa最长路+判断正环+floyd求传递闭包)
    pycharm+selenium搭建环境之no module named 'selenium'异常解决
    Web自动化测试—— Selenium+Python Windows环境搭建
  • 原文地址:https://www.cnblogs.com/niujifei/p/16549772.html
Copyright © 2020-2023  润新知