azureservicebus - 事件中心异常 :Cannot allocate more handles to the current session or connection

标签 azureservicebus azure-eventhub

我有 C# 控制台应用程序,通过它我经常向事件中心发送数据。这个控制台应用程序基本上从 SQL 存储读取一些数据并开始将数据推送到事件中心。

整个程序以无限循环/方式运行,就像在 while 控制中一样,只要它在 SQL 中接收到任何数据,它就会从那里提取数据并开始发送到事件中心。

但在某些时候我得到了这个错误。

“无法为当前 session 或连接分配更多句柄。允许的最大句柄数为 4999。请释放资源再试一次。在 Microsoft.ServiceBus.Common......

当我重新启动此控制台应用程序时,它工作正常。但我不知道为什么会出现此错误。

请帮我。

感谢和问候,

RK

最佳答案

TLDR:在“发送到 EventHub 逻辑”中,确保您正在重用(缓存)相同的发送方实例。

为什么 :

EventHubs 旨在支持超大规模的高吞吐量低延迟事件系统。因此,我们选择依赖于所有运行时操作的高性能协议(protocol) - 即 Amqp . Amqp Protocol的善良|当构建在它之上的应用程序充分利用其优势时,它就会发挥作用。这就是 EventHubs 对象模型映射到 Amqp 工件的方式:

  • EventHubClient映射到一个 AmqpConnection。基数是 1:1。如果在创建 EventHubClient.CreateFromConnectionString 时指定了完全相同的 ConnectionString - 底层物理套接字将被共享 - 但 amqp 工件 - AmqpConnection 仍然不同。
  • 每当客户端调用 EventHubClient.Send(EventData) ,内部,EventHubClient创建 1 个 Amqp session 该 session 中的 1 个 AmqpLink EventHubClient 创建的 AmqpConnection 上.此 session 和链接只要相同 EventHubClient 就可以重复使用实例用于后续发送。
  • 每当对 EventHubClient 执行任何管理操作时- 因为,管理。操作(如 getPartitionInfo)始终是请求-响应,需要双向通信 - EventHubClient创建 1 个 Amqp session 该 session 中有 2 个 AmqpLink - 一个用于请求的链接和其他用于响应的链接(例如:想象一下 REST Get 调用的结果) .
  • 无论何时,任何子实体都是从 EventHubClient 创建的- 像 EventHubSenderEventHubReceiver - EventHubClient创建 全新的 AmqpSession && 该 session 中的 AmqpLink .

  • 使用 eventhub SDK 的客户端应用程序的关键要点是 :

    每次EventHubClient创建实例 - 在下面创建一个真实的物理套接字。

    每次EventHubSenderEventHubReceiver实例是由 EventHubClient 创建的套接字创建的被重复使用并在其之上:
    (a) 创建一个 AmqpSession - 不。 AmqpSessions 限制为每个连接 5k - 我猜这是您的客户端应用程序达到的上限 .
    (b) AmqpLink 在该 session 内创建 - 这将反过来触发 EventHubs 服务中的实体解析(与在现有的 EventHubSender 上发送相比, 稍微贵一点 )。

    More on Event Hubs.

    关于azureservicebus - 事件中心异常 :Cannot allocate more handles to the current session or connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36836828/

    相关文章:

    azure - 使用托管身份将 API 连接到服务总线的 ARM 模板

    javascript - Azure事件中心Azure功能 Node js集成不起作用

    azure - 事件中心 API POST : 40103: Invalid authorization token signature

    azure - 使用 Azure 服务总线对队列和主题/订阅进行消息排序传送

    azure - 使用 Azure DataFactory Pipeline 将已读取的 Avro 文件从一个目录移动到另一个目录

    azure - azure-eventhubs 和 spring-cloud-azure-eventhubs-stream-binder 有什么区别?

    azure-eventhub - 如何在 Eventhub 中实现过滤器?

    Azure 服务总线订阅客户端轮询间隔

    c# - 使用 .Net Framework .4.5.2 将消息发送到 Azure 服务总线队列

    c# - MassTransit 在 Azure 服务总线上创建队列