EventHubClient.SendBatchAsync - 它是线程安全的吗?

时间:2016-03-11 16:11:03

标签: c# multithreading azure-eventhub

根据文档,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. 保存到某个队列并有一个基于线程池的async / await while循环从队列中读取并进一步发布到EventHub
  4. 更新:来自Event Hub团队的Eric确认在多线程环境中使用SendAsync是安全的。

    更新2 :MSDN文档刚刚更新(2小时内,哇!)。现在它说:&#34;此类的任何公共静态或实例成员都线程安全。&#34;。

2 个答案:

答案 0 :(得分:2)

Cesar提供了stackoverflow链接,这是一个很好的答案。为了补充特定(EventHub)问题的信息:

  1. 如果您问“如果多个线程使用相同的实例调用API,我的数据是否会被破坏”,那么答案是否定的,我们确保数据损坏情况的线程安全。

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

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

答案 1 :(得分:0)

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

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

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

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