【问题标题】:Apache Storm: throttling spout based on configurationApache Storm:基于配置的节流 spout
【发布时间】:2019-07-05 01:27:13
【问题描述】:

我的拓扑从 Kafka 中读取,并对外部系统进行 HTTP 调用。 Kafka 中的摄取速率约为每秒 200 条消息。外部系统仅支持每秒 20 个 HTTP 调用。我怎样才能引入节流,使进行 HTTP 调用的 Bolt 每秒只处理 20 条消息?

【问题讨论】:

    标签: apache-storm


    【解决方案1】:

    您可以使用 topology.max.spout.pending 设置根据拓扑中正在运行的元组数量来限制 spout。该设置是每个 spout 实例,所以如果你有例如10 个 spout 执行器,您设置最多 100 个元组,您将在拓扑中获得最多 1000 个元组。

    您可以在OutputCollector 上使用resetTimeout 方法来防止要推迟的元组因超时而失败。

    话虽如此,您可能需要将您的消息打包成更大的包。如果你每秒只能处理 20 条消息,而你每秒有 200 条的输入,你就会开始落后,永远追不上。

    【讨论】:

    • 我收到突发的请求,我必须以每秒 20 条消息的速度进行中继。因此,追赶不是问题。如何确保螺栓每秒处理的消息不超过配置的阈值?
    • 你可以写一个节流螺栓。使用 topology.max.spout.pending 来阻止 spout 一次发出超过一定数量的元组。节流螺栓应该接收发出的元组,并且只让例如每秒通过 20 次。您可以使用 resetTimeout 方法来防止元组在节流螺栓保持在它们上时超时。您可以使用刻度元组来保持时间。另一种选择是您将 KafkaSpout 包装在您自己的 spout 实现中,并且只允许它每秒发出 20 个元组。这可能更简单。
    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2018-08-14
    • 2015-04-22
    • 2018-09-19
    • 2019-03-14
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多