究竟!风暴只能通过下一个命令来限制你的喷口,所以如果你在接下来的第一个命令时传输了所有东西,那么Storm就无法限制你的喷口。
Storm开发人员建议使用单个next命令发出单个元组。然后,Storm框架将根据需要限制您的喷口,以满足“最大喷口待定”要求。如果你发出大量的元组,你可以将你的排放量最多批量计入最大喷口的十分之一,以给予Storm一定的节流机会。
Storm拓扑具有最大spout挂起参数。最大 可以通过以下命令配置拓扑的spout挂起值 拓扑中的 topology.max.spout.pending 设置 配置yaml文件。该值限制了多少 元组可以在飞行中,即尚未被激活或失败,在一个 任何时间点的风暴拓扑。需要这个参数 来自Storm使用ZeroMQ进行调度的事实 从一个任务到另一个任务的元组。如果消费者方面 ZeroMQ无法跟上元组率,然后是 ZeroMQ队列开始建立。最终元组超时 喷出并重放到拓扑结构,从而增加了压力 在队列上。为了避免这种病态失败的情况,风暴 允许用户限制其中的元组数量 在拓扑中飞行。 的 此限制对每个喷口任务生效 基础而不是拓扑级别。 强> ( 资源 )对于喷口的情况 这是不可靠的,即他们不会在他们的元组中发出消息ID 价值没有影响。 Storm用户不断面临的一个问题是 为这个最大喷口待定提供正确的值 参数。一个非常小的值很容易使拓扑结构变得饥饿 足够大的值可能会使拓扑过载 导致失败和重放的元组数量。 用户必须经历多次拓扑迭代 具有不同最大spout挂起值的部署以查找 最适合他们的价值。
一种解决方案是在nextTuple方法之外构建输入队列,而在nextTuple中唯一要做的就是轮询队列并发出。如果您正在处理多个文件,则nextTuple方法还应检查轮询队列的结果是否为空,如果是,则自动重置填充队列的源文件。