Apache Kafka隔离了不同的生产者

时间:2017-10-13 20:00:23

标签: apache-kafka

我正在开展一个项目,其中不同的生产者(每个生产者代表另一个客户)可以向我的服务发送事件。

此服务负责接收这些事件并将其存储在中间Kafka主题中,稍后我们将获取并处理这些事件。

问题在于,一个客户可以淹没事件并影响其他客户的事件处理,我正在努力寻找在不同客户之间创建隔离级别的最佳方式!

到目前为止,我能够通过为每个客户创建不同的主题来解决这个问题。

虽然这个解决方案暂时解决了这个问题,但似乎Kafka并不是设计用于处理大量的100k +主题,因为我们的生产者(客户)数量增长了,我们开始体验到单个经纪人的受控重启需要达到几个小时。

有人能建议更好的方法来创建生产者之间的隔离级别吗?

2 个答案:

答案 0 :(得分:1)

您可以查看Kafka限制,这是在Kafka经纪人级别上完成的。通过将生产者配置为每个都具有不同的用户/客户端ID,您可以实现某种程度的限制(以便一个生产者不会淹没其他生产者)。

请参阅https://kafka.apache.org/documentation.html#design_quotas

答案 1 :(得分:1)

使用您提到的数字(100k +),我认为您可能需要在Kafka之前的服务中解决此问题。

Kafka最有可能(不知道确切的数字)处理你抛出的负载,但是每个代理可以以高效的方式处理的分区数量是有限的。像往常一样,对此没有固定的限制,但是我会说每个代理的分区数量在较低的4位数中更多,所以除非你有一个相当大的集群,否则你可能还有更多。这可能导致更长的重启时间,因为必须恢复所有这些分区。你可以尝试的是试验 num.recovery.threads.per.data.dir 参数并将其设置得更高,这可能会使你的重启时间缩短。

我建议合并主题以降低数量,并在客户交谈的服务中实施某种流量控制,也可以添加负载均衡器以便能够扩展该服务。