kafka是可以保證同一個分區里面的消息寫入是有序的。也就是說,如果生產者按照一定的順序發送消息,broker就會按照這個消息順序來將他們寫入分區,消費者也會按照一定的順序將他們寫入分區,消費者也會按照同樣的順序讀取它們。
在某些情況下,數據的順序是很重要的,例如,在一個賬戶存入100元再取出來 和 先從一個賬戶取100元之后再存進去是截然不同的。
讓消息無序
kafka有個max.in.flight.requests.per.connection
參數,這個參數是用來調整每個分區的可寫入的連接數。如果把retries
參數設置為一個非零整數,同時把max.in.flight.requests.per.connection
設置為一個大於1的整數,那么,如果第一個批次消息寫入失敗,而第二個批次寫入成功,broker會重試寫入第一個批次。如果此時第一個批次也寫入成功,那么兩個批次的順序就反過來了。
讓消息有序
一般來說,如果某些場景要求消息是有序的,那么消息是否寫入成功也是很關鍵的,所以不建議把retries
參數設置為0。可以把max.in.flight.requests.per.connection
設置為1,這樣在生產者嘗試將第一批消息發送到分區上時,就不會有其他的消息發送給broker了。不過這樣會嚴重影響生產的吞吐量,所以只有在對消息的順序有嚴格的要求的情況下才能這么做。