我在我的项目中使用Spring Kafka,因为它似乎是基于Spring的项目中使用Kafka消息的自然选择。要使用消息,我可以使用MessageListener
接口。 Spring Kafka内部负责为每条新消息调用onMessage
方法。
但是,在我的设置中,我更喜欢显式轮询新消息并按顺序处理它们(这将需要几秒钟)。作为一种解决方法,我可能会阻止我的onMessage
实现,或者在内部缓冲消息。然而,这似乎违背了Spring Kafka的核心理念。
Kafka旨在让消费者不得不轮询新邮件,这符合我的要求。有没有办法利用Spring Kafka的这种“自然”工作流程?
我是否应避免将Spring Kafka用于此用例?
对于消息处理时间变化不可预测的用例, 这两种选择都不够。推荐的方式 处理这些情况是将消息处理移动到另一个线程, 这允许消费者在处理器时继续调用poll 还在工作必须注意确保承诺 偏移量不会超过实际位置。通常,你必须 禁用自动提交并手动提交已处理的偏移量 仅在线程完成处理后记录(取决于 你需要的交付语义)。另请注意,您需要 暂停分区,以便不从轮询中接收新记录 直到线程完成处理之前返回的那些之后。
相关问题:https://github.com/spring-projects/spring-kafka/issues/195
答案 0 :(得分:2)
现在已经解决了必须继续对消费者进行投票的问题(在KIP-62的0.10.1.x中),这不再是问题(只要你不超过{{1默认情况下,这是5分钟,但可以增加。
但是,如果你想自己调查一下,你仍然可以使用spring-kafka(例如,如果你使用Boot,可以获得Spring Boot自动配置的好处),但你可以从{{max.poll.interval.ms
获得Consumer
1}}和DefaultKafkaConsumerFactory
直接。