簡體   English   中英

如何按順序使用來自 kafka 的消息?

[英]How can I consume message from kafka in order?

生產者生成一些數據並按順序發送到 Kafka,例如:

{uuid:123 狀態:1}

{uuid:123 狀態:3}

狀態 1表示開始

狀態 3表示成功

我使用sarama.NewConsumerGroup(xx, xx, config).Consume(xx, xx, myhandler)使用代碼:

func (h myhandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
    for msg := range claim.Messages() {

        key := fmt.Sprintf("%q-%d-%d", msg.Topic, msg.Partition, msg.Offset)
        _, err := rdb.RedisClient.Get(h.ctx, key).Result()
        if err == redis.Nil {
            msgQueue <- msg.Value
            sess.MarkMessage(msg, "")
            rdb.RedisClient.Set(h.ctx, key, none, 12*time.Hour)
        } else if err != nil {
            log.Errorln("RedisClient get key error : ", err)
            return err
        } else {
            continue
        }

    }
    return nil
}

msgQueue := make(chan interface{}, 1000)

然后我將 msgQueue 中的值解碼為一個結構並將記錄插入到 mysql 中。

通常,最終數據狀態是 '3' ,但我發現有時它是 '1'

而且我發現通道msgQueue 中的消息順序不固定。

那么如何確保 data 的最終狀態為3

這取決於主題分區。 Kafka 不提供主題內的排序保證,只提供分區內的排序保證。

換句話說,如果您發送消息 A,然后將消息 B發送到分區 0 ,那么順序將是:首先是 A,然后是 B。在 A 寫入其之前。

這是 Confluent 網站上的引述:

Kafka 僅提供分區內記錄的總順序,而不提供主題中不同分區之間的總順序。 對於大多數應用程序來說,按分區排序與按鍵分區數據的能力相結合就足夠了。 但是,如果您需要記錄的總順序,這可以通過只有一個分區的主題來實現,盡管這意味着每個消費者組只有一個消費者進程。

關聯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM