Java 如何控制Apache Kafka在每个特定时间发出的消息数?

Java 如何控制Apache Kafka在每个特定时间发出的消息数?,java,spring-boot,apache-kafka,spring-kafka,Java,Spring Boot,Apache Kafka,Spring Kafka,我不熟悉ApacheKafka,我正在尝试配置ApacheKafka,使其尽可能多地接收来自生产者的消息,但每次特定时间只向消费者发送配置数量的消息。 换句话说,如何将Apache Kafka配置为每“30秒”仅发送“例如50条消息” 无论消息的数量如何,都会发送给消费者,在接下来的30秒内,将从已兑现的消息中再接收50条消息,以此类推。如果您可以控制消费者 您可以使用属性限制每个poll()方法调用的最大记录数。然后您只需要确保在30秒内调用一次poll() 通常,您可以查看所有可用的配置属性

我不熟悉ApacheKafka,我正在尝试配置ApacheKafka,使其尽可能多地接收来自生产者的消息,但每次特定时间只向消费者发送配置数量的消息。 换句话说,如何将Apache Kafka配置为每“30秒”仅发送“例如50条消息” 无论消息的数量如何,都会发送给消费者,在接下来的30秒内,将从已兑现的消息中再接收50条消息,以此类推。

如果您可以控制消费者

您可以使用属性限制每个
poll()
方法调用的最大记录数。然后您只需要确保在30秒内调用一次
poll()

通常,您可以查看所有可用的配置属性

如果您无法控制消费者

那么你唯一的选择就是按照你的要求写信息——在30秒内最多写50条信息。没有可用的配置选项。只有您的应用程序逻辑才能实现这一点

更新-如何控制并确保呼叫轮询

最简单的方法是:

while (true) {
   consumer.poll()
   // .. do your stuff
   Thread.sleep(30000);
}
通过测量处理时间,您可以使事情变得更加复杂(即在
poll
调用
Thread.sleep()

您可以使用属性来限制每次
poll()
方法调用的最大记录数。然后您只需要确保在30秒内调用一次
poll()

通常,您可以查看所有可用的配置属性

如果您无法控制消费者

那么你唯一的选择就是按照你的要求写消息——在30秒内最多写50条消息。没有可用的配置选项。只有你的应用程序逻辑才能实现这一点

更新-如何控制并确保呼叫轮询

最简单的方法是:

while (true) {
   consumer.poll()
   // .. do your stuff
   Thread.sleep(30000);
}

通过测量处理时间,您可以使事情变得更加复杂(即在
poll
调用
Thread.sleep()之后开始)
一点也不等待超过30秒。

问题是,制作人真的不向消费者发送消息。在制作人放置消息的中间有一个持久的卡夫卡主题。它真的不在乎另一边是否有消费者。从消费者的角度看也是如此:它只是订阅了数据所以,如果有消息传递中间件的话,考虑消费者对生产者的压力是错误的

另一方面,还不清楚这些被消费的消息会如何影响您的第三方服务。关键是Kafka consumer在每个分区上都是单线程的。因此,来自一个分区的所有消息都将是(必须的)在同一线程中逐个处理。这样,您无法向您的服务发送多条消息:下一条消息只能在前一条消息已回复时发送。因此,请思考一下:在您的消费者应用程序中,如何可能超出速率限制

但是,如果用户端有足够的分区和高并发性,那么最终可能会有多个来自不同线程的并行服务请求。为此,我建议查看速率限制模式。此库提供了一个很好的实现:。最好将消息保留在然后试着以某种方式限制制作人


总结:即使消费者方面不是你的项目,也最好与该团队讨论如何改进他们的消费者。你做得很好:制作人向卡夫卡主题发送消息。你还可以在这里做什么?

制作人真的不向消费者发送消息的问题。卡夫卡主题一直存在,我不知道n在制作者放置消息的位置之间。它真的不关心另一边是否有消费者。从消费者的角度来看也是一样:它只是订阅主题中的数据,不关心另一边是否有制作者。因此,考虑一下消费者对有mes的制作者的背压用箭头标出中间件是错误的方向

另一方面,还不清楚这些被消费的消息会如何影响您的第三方服务。关键是Kafka consumer在每个分区上都是单线程的。因此,来自一个分区的所有消息都将是(必须的)在同一线程中逐个处理。这样,您无法向您的服务发送多条消息:下一条消息只能在前一条消息已回复时发送。因此,请思考一下:在您的消费者应用程序中,如何可能超出速率限制

但是,如果用户端有足够的分区和高并发性,那么最终可能会有多个来自不同线程的并行服务请求。为此,我建议查看速率限制模式。此库提供了一个很好的实现:。最好将消息保留在然后试着以某种方式限制制作人


总结:即使消费者方面不是您的项目,也最好与该团队讨论如何改进他们的消费者。您做得很好:制作人向Kafka topic发送消息。您还可以在这里做什么?

有趣的用例,不确定您为什么需要它,但有两种可能的解决方案:1.为了保护集群,您需要无法使用配额,不是针对邮件数量,而是针对带宽吞吐量:.2.如果您需要每个时间帧的确切邮件数量,可以在消费和暂停之间放置缓冲服务(速率限制器),将邮件发布到消费的topi