[英]How can we use streaming in spark from multiple source? e.g First take data from HDFS and then consume streaming from 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.