【问题标题】:EventHubClient.SendBatchAsync - is it thread-safe?EventHubClient.SendBatchAsync - 它是线程安全的吗?
【发布时间】:2016-03-11 16:11:02
【问题描述】:

根据文档,EventHubClient 的所有非静态调用都不是线程安全的。这意味着我不能轻易地从我想要的任何地方调用以下函数:

    public async Task SendBatchAsync(IList<EventData> eventHubBatch)
    {
        try
        {
            await this.eventHubClient.SendBatchAsync(eventHubBatch);
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR (EH WRITER): {0}", ex.Message);
        }
    }

想知道有什么替代品吗?

  1. 锁定
  2. 同步线程上下文
  3. 保存到某个队列并拥有一个基于线程池的异步/等待 while 循环,该循环从队列中读取并进一步发布到 EventHub

更新:来自 Event Hub 团队的 Eric 确认在多线程环境中使用 SendAsync 是安全的。

更新 2:MSDN 文档刚刚更新(在 2 小时内,哇!)。现在它说:“这种类型的任何公共静态或实例成员都是线程安全的。”。

【问题讨论】:

标签: c# multithreading azure-eventhub


【解决方案1】:

Cesar 提供了作为答案的 stackoverflow 链接。补充您的特定(EventHub)问题的信息:

  1. 如果您问“如果多个线程使用同一个实例调用 API,我的数据是否会损坏”,那么答案是否定的,我们保证数据损坏场景的线程安全。

  2. 如果您要问“如果多个线程使用同一个实例调用 API,我的数据顺序是否会保留”,那么答案取决于,因为我们在接收数据时确实保留了顺序,但有多个线程调用相同instance 意味着您无法确定哪个调用首先到达我们的网络实现层。如果您想订购,请将它们作为单个批次 (SendBatchAsync) 发送,因为我们保证批量订购。请注意,单个批次有大小限制(总共 256k)

您提供的文档链接 (https://msdn.microsoft.com/library/azure/microsoft.servicebus.messaging.eventhubclient.aspx) 包含不完整/不正确的信息,我们将根据需要返回并查看/编辑。

【讨论】:

【解决方案2】:

根据MSDN EventHubClient documentationSendBatchAsync 方法不保证是线程安全的。

话虽如此,根据我有很多工作人员以多线程方式使用 EventHubClient 的经验,我从未遇到过使用该特定方法的线程安全问题。

关于处理这种情况的选项,这与使用任何需要同步的多线程代码没有什么不同。

您可以使用您建议的任何替代方案,此外您还可以为每个线程创建新的 EventHubClient,因此由于只有一个线程使用它,因此您不存在互斥问题。我不知道您的情况,例如,此解决方案对于您生成许多使用 EventHubClient 的线程然后被关闭的系统不是很好(事件中心连接时间 + 分配问题等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多