我正在计划一个spring+kafka流应用程序,它处理传入的消息并存储这些消息产生的更新的内部状态。预计每个唯一密钥的状态将达到~500mb(可能有~10k个唯一密钥分布在2k个分区中)。
这种状态通常必须保存在内存中才能有效地运行我的应用程序,但即使在磁盘上,我仍然会面临类似的问题(尽管只是在以后的扩展日期)。
我计划将此应用程序部署到一个动态扩展环境(如aws)中,并将设置最少的示例数,但我对以下两种情况持谨慎态度:
在第一次启动时(可能只有一个使用者首先启动),它将无法处理所有分区的分配,因为内存中的状态将使示例的可用内存溢出。
在一次大的淘汰(aws可用性区域淘汰)之后,可能会有33%的用户被淘汰出组,而剩余示例上的额外内存负载实际上可能会淘汰所有剩余的用户。
人们如何保护他们的消费者不占用超过他们所能处理的分区,这样他们就不会溢出可用的内存/磁盘?
1条答案
按热度按时间bxjv4tth1#
参见Kafka文档。
从0.11开始。。。
编辑
对于您的第二个用例(它也适用于第一个用例),也许您可以实现一个定制的
PartitionAssignor
这限制了分配给每个示例的分区数。我没有试过;我不知道代理对未分配分区的存在有何React。
编辑2
这似乎工作正常;但是ymmv。。。
和
和
和
当然,这会使未分配的分区悬而未决,但听起来这就是您想要的,直到该区域重新联机。