首页 > 解决方案 > Azure 事件中心在一个应用程序中提供多个消费者

问题描述

语境

我在 Azure 中部署了一个Azure Functions应用程序,它需要处理来自Event Hub的事件。
在此应用程序中,我希望为多个独立功能处理一些事件。

要求

我要避免的是,如果一个功能失败了,那么所有其他功能也会失败。
此外,我想有一种简单的方法来重试特定功能的事件。

研究

在阅读文档并浏览互联网后,我遇到了Consumer Groups,这表明它们可以用于独立的并行处理。

但是,我觉得 Consumer Groups 并不适合我的情况,应该更多地被视为每个应用程序1 个使用者组,而不是每个功能1 个使用者组。
我在这个假设中正确吗?

在搜索了更多之后,我还没有真正遇到过任何人解决这个问题,虽然我觉得它应该很常见。
这通常如何实现?

潜在的解决方案?

我一直在考虑的一件事是拥有一个接收所有事件的 Azure 函数。
收到事件后,此 Azure 函数将检查谁对该事件感兴趣,然后每个功能将相同的事件发送到不同的事件中心,并指示应针对哪个功能进行处理(按功能分区)。
然后,这将允许每个功能独立处理事件。

这是通过事件中心处理事件的“正常”方式吗?
有没有我遗漏的陷阱?

标签: azureazure-functionsazure-eventhub

解决方案


如果我正确理解您的场景,听起来您有多个独立的功能,每个功能都希望对流经系统的事件有一个独特的视图。每个功能都应独立处理并与其他功能隔离,以防止级联故障。假设这是正确的,我首先要从一个问题开始:

您是否看到事件以足够高的规模通过事件中心有意义?对我来说,订阅每个功能的服务总线主题似乎是更自然的模式。除非您始终如一地处理大量事件,否则可能值得探索。

如果您确信事件中心是正确的选择,那么我会考虑从以下框架开始探索,假设您也坚持使用函数:

  • 每个功能一个消费者组。 (注意:标准实例的使用者组限制为 20 个;如果您有超过 20 个功能,则需要考虑在多个事件中心实例之间进行分片或使用专用层)

  • 每个功能一个功能,绑定到关联的消费者组

消费者组将允许您拥有您正在寻找的隔离,功能是独立的并且能够在不影响其他功能的情况下恢复/重新处理。它还允许您通过功能管理更有效地进行水平扩展。

我不建议对所有实例使用单个函数。您最终将不得不直接管理更多复杂性,以便独立跟踪每个功能的状态,因为用于读取分区的检查点和状态存在于消费者组级别。您还将在单个实例中完成更多工作,从而更难以有效扩展。您能做的最好的事情是为事件中心的每个分区创建一个实例。


推荐阅读