首页 > 解决方案 > 如何计算合适的通道容量?

问题描述

我正在寻找解决方案,因为 sth-channel 已满。我为计算合适的信道容量而烦恼。

该文档具有以下描述。

为了计算合适的容量,只需考虑以下参数:
・每单位时间(例如 1 分钟)源要放入通道的
事件量。・要从每单位时间由 sinks 处理的通道。
・估计每单位时间无法处理的事件数量,因此要重新注入到通道中(参见下一节)。

如何检查这些参数的值?

标签: flumeflume-ngfiware-cygnus

解决方案


如何检查这些参数的值?

您不能只检查这些参数。它们取决于您的应用程序。

他们说的是你应该有一个足够大的尺寸,这样发电机就不会卡住。这在您的应用程序中可能是不可能的。

假设您的生成器每秒接收一个事件,并且接收器需要 2 秒来管理该事件。现在假设您有 3 个接收器。在 1 秒内,您可以设法处理每个接收器 0.5 个事件。您有 3 个接收器,因此您的接收器一起能够处理 0.5 × 3 = 1.5 个事件,这比您获得的输入要多。您的容量可以是 1 或 2,使用 2 将大大增加您不被阻止的机会。

让我们回顾另一个例子:

  • 您的生成器希望每秒推送 1,000 个事件
  • 您的接收者需要 3 秒来处理一个事件
  • 您将需要 1,000 x 3 = 3,000 个接收器(3,000 个可以并行全速运行的 goroutine...)

在此示例中,接收器的总数非常大,以至于您必须分解代码以在多台计算机上工作或优化接收器代码,以便它可以在有意义的时间内处理数据。假设您有 50 个处理器,您的接收器每秒将获得 1,000 个事件,所有 50 个都可以全速运行,您需要一个接收器来完成它的工作:

50 / 1000 = 0.05 秒

现在让我们假设在大多数情况下,您的 goroutines 需要 0.02,但偶尔会需要 1 秒。这意味着你的 goroutine 可能会落后一点。在这种情况下,您的容量(因此发电机不会被阻塞)应该略高于 1,000。同样,这取决于有多少例程变慢等。在最后一个示例中,一次运行是 0.02 秒,因此处理 1,000 个事件通常需要 0.02 秒。如果您可以在 1 秒内发送这 1,000 个事件,您甚至可能不需要 50 个 goroutine,并且容量可能会更小。另一方面,如果你有大量的突发事件,最终可能会发送很多(比如 500 个)事件,那么更多goroutine 和更大的容量对于不被阻塞很重要。


推荐阅读