卡夫卡的初学者。
我希望有一个python生成器发送前几个类型为A的消息(json),然后是类型B.消费者必须使用它们来保持这个顺序,以便更新数据库。
我的第一个想法是使用单个主题来保证消息的顺序。我读了这些答案:
然而,似乎在Kafka中将一个主题用于不同的对象类型并不是一个好习惯吗?
所以另一个解决方案更多“kafkaesque”有两个主题来解决这个问题。但是,在发送第二个主题之前,生产者是否有办法确保第一个主题中的所有消息都已被消耗?我会失去异步吗?
在您看来,这种配置中最好的策略是什么?
谢谢。
答案 0 :(得分:6)
订单不会保留在多个主题或多个分区中,因此您需要将所有消息发送到该主题中的一个主题和一个分区。
不要担心将不同的数据类型发送到同一主题,除非您使用Avro或其他一些序列化程序来强制每个主题使用一致的架构。如果您要发送JSON,那么单个主题就可以了。
值得注意的是,订单不会在主题的多个分区中保留。如果您的主题有一个分区,那么你没事。如果您的主题有多个分区,那么您应该在发布时使用密钥,并对需要保持有序的所有邮件使用相同的密钥。这将确保它们都进入同一分区。
如果您想确保保留订单,则应设置max.in.flight.requests.per.connection=1
。否则,错误和重试一条消息可能会使其与其他正在进行的消息无关。