【问题标题】:Will two Azure Event Hub consumers get the same notifications?两个 Azure 事件中心消费者会收到相同的通知吗?
【发布时间】:2020-08-06 21:26:28
【问题描述】:

我正在开发一个 Azure IoT Web 应用程序,它使用来自 Azure 事件中心的事件。我定期在测试环境中将 Web 应用程序发布到 Azure,然后我也在自己的机器上以调试模式运行它,当这种情况发生时,基本上有两个 Web 应用程序同时运行,它们是事件中心的消费者。

我想知道一个消费者是否可能会“吞下”通知,以便其他消费者不会收到它。那会很糟糕,我必须为我的调试本地机器设置一个单独的事件中心。

事件中心的两个消费者都会收到所有通知吗?

我没有以任何特殊方式设置事件中心或使用者代码。消费者代码使用Azure.Messaging.EventHubs.EventProcessorClient,其ProcessEventAsync() 如下所示:

async Task ProcessEventHandler(ProcessEventArgs eventArgs)
{
    string deviceId = eventArgs.Data.Properties["deviceId"].ToString();
    string message = Encoding.UTF8.GetString(eventArgs.Data.Body.Span);
    await ProxyMessageToController(deviceId, message);

    
    await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken);
}

【问题讨论】:

    标签: azure azure-eventhub asp.net-core-3.0 .net-core-3.0


    【解决方案1】:

    EventHubProcessorClient 将确保在您创建处理器时指定的使用者组范围内的给定分区只有一个活动读取器。只要读取事件中心的每个EventHubProcessorClient 使用相同的消费者组,它们就不会同时从同一个分区主动读取。

    重要的是要知道EventProcessorClient 与其他处理器协调以在它们之间分配负载。当一个处理器从其他处理器“窃取”一个分区的所有权时,您可能会看到一些重叠,其中两者都读取了相同的事件。这种重叠通常是一个非常小的时间窗口,但在某种程度上取决于您的检查点策略。在启动新处理器直到所有分区均等分布之前,您最有可能看到分区所有权发生变化。

    另一个需要注意的是,事件中心服务具有至少一次交付保证。尽管事件是一次发布的,但有可能发生重复事件,尽管很少见。

    【讨论】:

    • 非常感谢。如果我的理解正确,我最好为 a) 我的调试环境和 b) 公司测试环境设置一个单独的事件中心(和 IoT 中心,它将设备孪生更改路由到事件中心)?我之所以这么问,是因为每个新的 Azure 资源都会花费我公司的资金。
    • 我绝对不建议将生产数据与事件中心范围内的任何其他内容混合。作为流平台,事件中心分区中的事件是持久的 - 这意味着它们在被读取时不会被删除。流一直存在,直到事件超过配置的保留期限(即使那样,也无法保证何时清理它们。)
    • 如果成本是一个约束,那么在一个事件中心命名空间下拥有多个事件中心实例是值得考虑的。吞吐量单位在命名空间级别计费,并且您将拥有相同的入口流量率,因此我认为您不会因在同一命名空间下使用多个事件中心而产生额外费用。更多上下文:docs.microsoft.com/en-us/azure/event-hubs/…azure.microsoft.com/en-us/pricing/details/event-hubs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2017-02-05
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多