汽车位置服务之kafka集群配置注意事项
? ? ? ? ? ? ? ? ?
1)? 重復(fù)消費問題。
問題描述?
采用kafka讀取消息進(jìn)行處理時,consumer會重復(fù)讀取afka隊列中的數(shù)據(jù)。
問題原因?
kafka的consumer消費數(shù)據(jù)時首先會從broker里讀取一批消息數(shù)據(jù)進(jìn)行處理,處理完成后再提交offset。而我們項目中的consumer消費能力比較低,導(dǎo)致取出的一批數(shù)據(jù)在session.timeout.ms時間內(nèi)沒有處理完成,自動提交offset失敗,然后kafka會重新分配partition給消費者,消費者又重新消費之前的一批數(shù)據(jù),又出現(xiàn)了消費超時,所以會造成死循環(huán),一直消費相同的數(shù)據(jù)。
解決方案?
項目中使用的是spring-kafka,所以把kafka消費者的配置enable.auto.commit設(shè)為false,禁止kafka自動提交offset,從而使用spring-kafka提供的offset提交策略。spring-kafka中的offset提交策略可以保證一批消息數(shù)據(jù)沒有完成消費的情況下,也能提交offset,從而避免了提交失敗而導(dǎo)致永遠(yuǎn)重復(fù)消費的問題。
?
2) Server.properties配置問題
borker,partition,replica 的配置之間的關(guān)系。
約束關(guān)系:Topic Partition Replicas Size <= Kafka Brokers Size。
創(chuàng)建Topic時直接指定Topic Partition Replica與Kafka Broker之間的存儲映射關(guān)系
例如:kafka_2.10-0.8.2.1/bin/kafka-topics.sh --zookeeper ZooKeeperHost:ZooKeeperPort --create --topic TopicName --replica-assignment id0:id1:id2,id3:id4:id5,id6:id7:id8
其中,“id0:id1:id2,id3:id4:id5,id6:id7:id8”表示Topic TopicName一共有3個Partition(以“,”分隔),每個Partition均有3個Replica(以“:”分隔)
我們的策略:replicas >=2 ,確保有一個副本;partion=cpu cores,最大化利用多核并發(fā)。Brokers>=3 。根據(jù)gps數(shù)據(jù)量,系統(tǒng)吞吐量具體設(shè)計。
?
3) Zookeeper 問題。
Kafka集群強(qiáng)烈依賴zookeeper 來做集群的配置,狀態(tài),failover等機(jī)制。如果zookeeper集群出行問題,kafka集群也會不可用。所以要確保zookeeper集群的健康健壯。商用系統(tǒng)最少是3個zookeeper 集群節(jié)點,條件允許,應(yīng)該是5個節(jié)點。
?
?
4) 消息保存時間。
無論消息是否被消費,kafka 都會保留所有消息。有兩種策略可以刪除舊數(shù)據(jù):
?
1. 基于時間:log.retention.hours=168
2. 基于大小:log.retention.bytes=1073741824
需要注意的是,因為Kafka讀取特定消息的時間復(fù)雜度為O(1),即與文件大小無關(guān),所以這里刪除過期文件與提高 Kafka 性能無關(guān)。我們選擇基于文件大小的配置即可。
?
5) 機(jī)器內(nèi)存配置,文件配置
內(nèi)存不能少于1G,最好2G。/bin/zookeeper-server-start.sh 中的內(nèi)存配置。
??
6) consumer group問題
high-level consumer API 提供了 consumer group 的語義,一個消息只能被 group 內(nèi)的一個 consumer 所消費,且 consumer 消費消息時不關(guān)注 offset,最后一個 offset 由 zookeeper 保存。
?
使用 high-level consumer API 可以是多線程的應(yīng)用,應(yīng)當(dāng)注意:
?1. 如果消費線程大于 patition 數(shù)量,則有些線程將收不到消息
2. 如果 patition 數(shù)量大于線程數(shù),則有些線程多收到多個 patition 的消息
3. 如果一個線程消費多個 patition,則無法保證你收到的消息的順序,而一個 patition 內(nèi)的消息是有序的
例如:我們根據(jù)車牌號設(shè)計消息路由到指定的partion,多線程消費時,在提升gps數(shù)據(jù)解析性能的情況下,每輛車的gps時序也不會錯亂。每個消費線程消費一個partion的數(shù)據(jù),多線程則可以并行處理多個partion的gps數(shù)據(jù)。
轉(zhuǎn)載于:https://www.cnblogs.com/daila/p/9148869.html
總結(jié)
以上是生活随笔為你收集整理的汽车位置服务之kafka集群配置注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2008
- 下一篇: B - Calculating Func