使用kafka的Quarkus反应式消息传递

时间:2020-07-12 19:14:44

标签: java apache-kafka quarkus microprofile smallrye-reactive-messaging

我有两个微服务,一个生产者和一个消费者。生产者每两秒钟向kafka主题写一个数字增量。使用者有两个正在运行的实例,它们消耗这些增量。我注意到一些我想解决的奇怪问题:

  • 当还没有消费者时,生产者开始生产消息时,消息将保存在kafka中。当消费者在线时,它不处理生产者已经产生的现有消息,而是开始使用现在传入的消息。消费者还可以如何处理所有未消耗的消息?
  • 当有两个消费者时,我希望两个消费者都能平等消费。现在,只有一个消费者承担了所有的负担,而另一个只是坐在那里。如何将负载分配给消费者数量?
  • kafka似乎保存了所有正在生成的记录,即使消费者已经使用了它也是如此。有什么办法可以防止这种情况?我找不到例如确认的良好信息。

有人知道这三个问题之一的答案吗?

消费者配置:

mp.messaging.incoming.stocks.connector=smallrye-kafka
mp.messaging.incoming.stocks.topic=stocks
mp.messaging.incoming.stocks.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
mp.messaging.incoming.stocks.group.id=test1
mp.messaging.incoming.stocks.auto.offset.reset=earliest

生产者配置:

mp.messaging.outgoing.stock-quote.connector=smallrye-kafka
mp.messaging.outgoing.stock-quote.topic=stocks
mp.messaging.outgoing.stock- 
quote.value.serializer=org.apache.kafka.common.serialization.StringSerializer

1 个答案:

答案 0 :(得分:2)

由于默认情况下,Kafka被归类为事件流引擎(实时消息+存储),因此会保存所有记录。主题中邮件保留的默认配置为7天(168小时),可以使用主题配置retention.ms=10000(10秒或您想要的任何值)进行更改。

对于并发使用,您需要确保对主题进行了分区,因为主题分区是Kafka中的并行单元。同样,我记得Quarkus / Smallrye开发团队正在实施enter image description here。如果这是最新的Quarkus所在的地方,那么剩下的部分就是对主题进行分区。

要在将分区分配给使用者之前使用消息,我们需要开发。团队在这里输入,我不建议这样做。