Azure 事件中心 - 具有 SQL 个检查点的自定义使用者

Azure Event Hubs - custom consumer with SQL checkpoints

我们目前正在将 Azure 事件中心视为一种将消息分派给后台处理器的机制。目前正在使用基于队列的系统。

大多数处理器正在将数据写入 SQL 服务器数据库,并且写入包含在事务中。

事件中心被定位为至少一次的通信通道,因此应该预料到重复的消息。 EventProcessorHost 是读取端的推荐 API,它使用 Azure Blob 存储自动执行租约管理和检查点设置。

但是我们有一个想法,对于一些最关键的处理器,我们使用同一数据库中的 SQL 服务器 table 自己实现检查点,并将检查点写入处理器的同一事务中.这应该给我们提供了在需要时恰好一次交付的强有力保证。

暂时忽略租约管理(每个分区只有 运行 1 个处理器),基于 SQL 的检查点是个好主意吗?除了需要在 API 的较低级别上工作并自己处理检查点外,还有其他缺点吗?

Azure 存储是内置解决方案,但我们不限于此。如果您的大多数处理器正在将数据写入 SQL 服务器数据库,并且您不希望 EventProcessorHost 在 Azure 存储中存储检查点(这需要存储帐户),在我看来,将检查点存储在您的 SQL数据库提供了一种简单的方法来创建流程事件和事务管理检查点,这将是一个很好的解决方案。

您可以使用 ICheckpointManager interface 编写自己的检查点管理器,以将检查点存储在 SQL 数据库中。

根据 Fred 的建议,我们基于 SQL 服务器中的 table 实施了我们自己的检查点管理器。您可以找到代码示例 here.

此实现可以很好地插入 EventProcessorHost。我们还必须实现 ILeaseManager,因为它们在默认实现中高度耦合。

my blog post 中,我描述了这种基于 SQL 的实现的动机,以及整体解决方案的高级视图。