数百个 Azure 函数实例来处理事件中心事件

Hundreds of Azure Function Instances to Process Event Hub Events

我的情况如下,处理一个事件需要30s到3min。我每天创建/(事件中心正在接收)大约 100k-300k 事件。 我创建的是一个具有 32 个分区(标准计划最多可用)的事件中心,一个消费者计划 Azure 函数。

但问题是,Azure 函数正在扩展到 32 个实例,这还不够。 我能想到的解决方法是创建另一个 Function App 并将其连接到同一个 Consumer Group。但这听起来不像是一个合理的解决方案。

我能否以任何其他更合适的方式增加可用函数实例的数量?

为什么每个分区一个实例不够用?更多的实例只会竞争获得对相同分区的锁定。所以它不会提高性能。每个分区应该有一个实例。

投资于更快的处理可能会更好。对于这样的系统,每次事件三分钟的时间长得令人难以置信。不能将此类事件的处理委托给另一个系统

如果有些事件需要很长时间,你或许可以使用多个消费者组来区分快慢来处理事件,并想当然地认为慢的消费者组在处理事件时有一些滞后事件。

如何增加一个实例内的工作进程数https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices?tabs=csharp#worker-process-count

这些工作线程在一个实例中共享相同的资源,但至少您有更多的工作线程可以处理请求。

我相信您使用的是错误的消息服务。 Azure 事件中心不适合你的场景。数据吞吐量低,您的案例听起来您需要尽可能避免重复处理,因为多次重新处理同一条消息的成本很高。因此,我建议您查看下面的 Azure Functions 的服务总线队列触发器。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=csharp

正如其他人已经描述的那样(以及在本文中:Kafka how to consume one topic parallel)从一个事件中心(一个 Kafka 主题)读取的并行性受限于其上的分区数量。

  • 一个消费者可以从一个或多个分区消费。
  • 一个分区一次最多可以被一个消费者使用。

如果你分配更多,那么“额外”的消费者只会等到他们被分配一个分区if/when一些“活跃”的消费者死亡。


提高吞吐量的其他选项是:

(我假设您别无选择,只能从事件中心开始使用)

  • 支付更多。获取专用计划。 Limit is 1024 partitions. Though it's debatable from documentation so I've raised a bug 澄清。
  • 做点什么3分钟左右,真的很慢。
  • 分批消费:如果您的函数代码受更多 I/O 约束,那么让它一次消费多个消息。
    • 请注意,这可能有点棘手,因为您指定的所有参数都是对 Azure Function Runtime(代表您轮询分配的分区)的“建议”,并且您实际上没有细粒度的控制每批消息数量过多。通常你的问题是批量太小。
  • 在从事件中心使用的代码(比如 af_eh_consumer)和处理消息的代码(比如新的 Azure 函数)之间引入另一个 Q(存储 Q、blob 存储、服务总线)af_msg_processor。因此 af_eh_consumer 只会向存储 Q 发送 post 消息,这会触发 af_msg_processor,此触发器不受 32 的限制。问题在于:
    • 错误处理:您必须了解新 Q 的重试是如何工作的,因为一旦 af_eh_consumer post 将其编辑到存储 Q,您将检查点(移动指针)您的事件中心.
    • 顺序:Storage Q 不保证消息的顺序,如果您关心这一点,请使用像服务总线这样的有序 Q。
    • 更多编码、维护和操作工作。