<commit_before>---
layout: post
title:  "kafka学习笔记之消息时间戳"
categories: kafka
tags: kafka
author: ShuxiaoW
---

{:toc}

本文主要讲述kafka对消息时间戳提供的一些支持，以及kafka如何支持根据时间戳精确查找offset。




得益于kafka良好的设计理念，Producer和Consumer完全独立，互不影响，各司其职即可。但是，对于消费者而言，当它从kafka拿到一条消息时，它可能会想知道，这条消息是何时发布到kafka的呢？

另外，当消费者开始消费时，除了从最新的offset或最久的offset开始之外，是不是可以允许消费者指定回退多长时间来开始消费呢？这在下面的两种场景下会非常有用：

1. 为了保证数据的可靠性，我们通常在异地部署多个相互独立的kafka集群。当消费者从一个集群切到另一个集群时，由于offset不是全局的，所以我们期望切到新集群时，能够回退半小时，以保证消息不丢。
2. 在同个集群内，当我们期望从一个ConsumerGroupId切到另外一个新的ConsumerGroupId后保证消息不丢。为了避免复杂的offset拷贝工作，我们可以让新group直接回退10分钟开始消费即可。

本文主要讲述kafka对消息时间戳提供的一些支持，最终能够解决上面提到的2个问题。

## 1 消息中的时间戳

### 新的消息结构体

在0.10.0版本之后，发布到kafka中的消息结构体中新增了一个时间戳字段。新格式如下：

```cpp
// v1, supported since 0.10.0
class Message {
    int32_t crc;<commit_msg>update post format<commit_after>---
layout: post
title:  "kafka学习笔记之消息时间戳"
categories: kafka
tags: kafka
author: ShuxiaoW
---

* content
{:toc}

本文主要讲述kafka对消息时间戳提供的一些支持，以及kafka如何支持根据时间戳精确查找offset。




## 0 前言

得益于kafka良好的设计理念，Producer和Consumer完全独立，互不影响，各司其职即可。但是，对于消费者而言，当它从kafka拿到一条消息时，它可能会想知道，这条消息是何时发布到kafka的呢？

另外，当消费者开始消费时，除了从最新的offset或最久的offset开始之外，是不是可以允许消费者指定回退多长时间来开始消费呢？这在下面的两种场景下会非常有用：

1. 为了保证数据的可靠性，我们通常在异地部署多个相互独立的kafka集群。当消费者从一个集群切到另一个集群时，由于offset不是全局的，所以我们期望切到新集群时，能够回退半小时，以保证消息不丢。
2. 在同个集群内，当我们期望从一个ConsumerGroupId切到另外一个新的ConsumerGroupId后保证消息不丢。为了避免复杂的offset拷贝工作，我们可以让新group直接回退10分钟开始消费即可。

本文主要讲述kafka对消息时间戳提供的一些支持，最终能够解决上面提到的2个问题。

## 1 消息中的时间戳

### 新的消息结构体

在0.10.0版本之后，发布到kafka中的消息结构体中新增了一个时间戳字段。新格式如下：

```cpp
// v1, supported since 0.10.0
class Message {
    int32_t crc;
{'fraction_non_alphanumeric': 0.0913154533844189, 'fraction_numerical': 0.02234993614303959, 'mean_word_length': 9.65986394557823, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7055054', 'n_tokens_mistral': 1144, 'n_tokens_neox': 1339, 'n_words': 70}