讲讲kafka维护消费状态跟踪的方法
大 部 分 消 息 系 统 在broker端 的 维 护 消 息 被 消 费 的 记 录 : 一 个 消 息 被 分 发到consumer后broker就 马 上 进 行 标 记 或 者 等 待customer的 通 知 后 进 行 标 记 。 这样 也 可 以 在 消 息 在 消 费 后 立 马 就 删 除 以 减 少 空 间 占 用 。
但 是 这 样 会 不 会 有 什 么 问 题 呢 ? 如 果 一 条 消 息 发 送 出 去 之 后 就 立 即 被 标 记 为 消 费过 的 , 一 旦consumer处 理 消 息 时 失 败 了 ( 比 如 程 序 崩 溃 ) 消 息 就 丢 失 了 。
为 了解 决 这 个 问 题 , 很 多 消 息 系 统 提 供 了 另 外 一 个 个 功 能 : 当 消 息 被 发 送 出 去 之 后 仅仅 被 标 记 为 已 发 送 状 态 , 当 接 到consumer已 经 消 费 成 功 的 通 知 后 才 标 记 为 已 被消 费 的 状 态。
这 虽 然 解 决 了 消 息 丢 失 的 问 题,但 产 生 了 新 问 题,首 先 如 果consumer处 理 消 息 成 功 了 但 是 向broker发 送 响 应 时 失 败 了,这 条 消 息 将 被 消 费 两 次。第 二个 问 题 时 ,broker必 须 维 护 每 条 消 息 的 状 态 , 并 且 每 次 都 要 先 锁 住 消 息 然 后 更 改状 态 然 后 释 放 锁 。
这 样 麻 烦 又 来 了 , 且 不 说 要 维 护 大 量 的 状 态 数 据 , 比 如 如 果 消息 发 送 出 去 但 没 有 收 到 消 费 成 功 的 通 知 , 这 条 消 息 将 一 直 处 于 被 锁 定 的 状 态 ,Kafka采 用 了 不 同 的 策 略。
Topic被 分 成 了 若 干 分 区,每 个 分 区 在 同 一 时 间 只 被 一个consumer消 费 。 这 意 味 着 每 个 分 区 被 消 费 的 消 息 在 日 志 中 的 位 置 仅 仅 是 一 个简 单 的 整 数:offset。这 样 就 很 容 易 标 记 每 个 分 区 消 费 状 态 就 很 容 易 了,仅 仅 需 要一 个 整 数 而 已 。 这 样 消 费 状 态 的 跟 踪 就 很 简 单 了 。
这 带 来 了 另 外 一 个 好 处 :consumer可 以 把offset调 成 一 个 较 老 的 值 , 去 重 新 消