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了。不过这样会严重影响生产的吞吐量,所以只有在对消息的顺序有严格的要求的情况下才能这么做。