kafka順序保證
理想情況:
Kafka 可以保證同 一個(gè)分區(qū)里的消息是有序的。
也就是說(shuō),如果生產(chǎn)者按照一定的順序發(fā)送消息, broker 就會(huì)按照這個(gè)順序把它們寫(xiě)入分區(qū),消費(fèi)者也按照同樣的順序讀取它們。
實(shí)際情況:
在某些情況下 順序是非常重要的,有些場(chǎng)景對(duì)順序不是很敏感。
如果把retries設(shè)為非零整數(shù),同時(shí)把 max.in.flight.requests.per.connection 設(shè)為比 1大的數(shù),那么,如果第 一個(gè)批次消息寫(xiě)入失敗,而第 二個(gè)批次寫(xiě)入 成功, broker 會(huì)重試寫(xiě)入第 一個(gè)批次。如果此時(shí)第 一個(gè)批次也寫(xiě)入成功,那 么兩個(gè)批次的順序就反過(guò)來(lái)了。
使用建議
一般來(lái)說(shuō),如果某些場(chǎng)景要求消息是有序的,那么消息是否寫(xiě)入成功也是很關(guān)鍵的,所以不建議把retries 設(shè)為0 ??梢?max.in.flight.requests.per.connection設(shè)為1 ,這樣在生產(chǎn)者嘗試發(fā)送第一批悄息時(shí),就不會(huì)有其他的消息發(fā)送給 broker 。不過(guò)這樣會(huì)嚴(yán)重影響生產(chǎn)者的吞吐量 ,所以只有在 對(duì)消息的順序有嚴(yán)格要求的情況下才能這么做。
PS:
max.in.flight.requests.per.connection = 1 限制客戶(hù)端在單個(gè)連接上能夠發(fā)送的未響應(yīng)請(qǐng)求的個(gè)數(shù)。設(shè)置此值是1表示kafka broker在響應(yīng)請(qǐng)求之前client不能再向同一個(gè)broker發(fā)送請(qǐng)求。