【问题标题】:Is Azure TopicClient threadsafe?Azure TopicClient 线程安全吗?
【发布时间】:2018-07-19 13:55:57
【问题描述】:

我一直在处理来自 TopicClient 的大量超时,我认为这可能与对象的生命周期和处置有关。

我正在使用来自Microsoft.ServiceBus.MessagingTopicClient 类并阅读此Best Practices Guide 状态

您不应在发送消息后关闭消息传递工厂或队列、主题和订阅客户端,然后在发送下一条消息时重新创建它们。关闭消息传递工厂会删除与服务总线服务的连接,并在重新创建工厂时建立新的连接。

这让我感到困惑 - 本文档并未专门提及 TopicClient,但我假设它适用。也许这个假设是不正确的?

我可以将我的 TopicClient 存储在静态成员中以避免重新创建连接吗?有没有更好的方法来处理这个?我应该使用某种连接池机制吗?

【问题讨论】:

    标签: azure azureservicebus


    【解决方案1】:

    documentation indicates,TopicClient 的所有静态和实例成员都是线程安全的。

    "此类型的任何公共静态(在 Visual Basic 中为共享)成员都是 线程安全。实例成员也保证是线程安全的。”

    我阅读了您包含的报价,因为它确实包含 TopicClient,因为它说“队列、主题和订阅客户端”。我把它读作 QueueClient、TopicClient 和 SubscriptionClient。

    对于消息传递子系统,我倾向于使用Gateway Pattern,它可用于处理使用消息传递子系统所需的对象的生命周期。在您的情况下,网关对象将处理 TopicClient 或 MessageSender/Receivers 的生命周期。

    我想问你是否见过更通用的MessageSenderMessageReceiver 类?在发送时使用这些更通用的对象意味着执行发送的客户端代码不必知道它是发送到主题还是队列,它可以只发送到地址而不关心。

    【讨论】:

      【解决方案2】:

      只是添加来自 MS 的另一个确认,即这是线程安全的,来自 Best Practices for performance improvements using Service Bus Messaging

      您可以安全地使用 QueueClient 对象从并发异步操作和多线程发送消息。

      他们没有明确提及TopicClient,但希望TopicClient 与QueueClient 一样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 2011-07-04
        • 2014-04-26
        • 2012-11-30
        相关资源
        最近更新 更多