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

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

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

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

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

请帮我。

感谢和问候,

RK

最佳答案

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

为什么 :

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

  • EventHubClient.CreateFromConnectionString映射到一个单独的AmqpConnection。基数是 1:1。如果在创建 More on Event Hubs. 时指定了完全相同的 ConnectionString - 底层物理套接字将被共享 - 但 amqp Artifact - AmqpConnection 仍然不同。
  • 每当客户端调用 EventHubClient.Send(EventData) 时,EventHubClient 在内部创建 1 AmqpSession 1 AmqpLink session 在由 EventHubClient 创建的 AmqpConnection 上。只要相同的 EventHubClient 实例用于后续发送,就会重新使用此 Session 和 Link。
  • 每当对 EventHubClient 执行任何管理操作时 - 因为,管理。操作(如 getPartitionInfo)始终是请求-响应,并且需要 2 路通信 - EventHubClient 在该 session 中创建 1 AmqpSession 2 AmqpLink - 一个用于请求的链接和用于响应的其他链接(例如:想象 REST 的结果Get 调用)
  • 任何时候,任何子实体都是从 EventHubClient 创建的 - 比如 EventHubSenderEventHubReceiver - EventHubClient 创建 一个全新的 AmqpSession && 在那个 session 中创建一个 AmqpLink。

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

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

    每次创建 EventHubSenderEventHubReceiver 实例时,都会重新使用由 EventHubClient 创建的套接字并在其之上:
    (a) 创建了 AmqpSession - 否。 AmqpSessions 限制为每个连接 5k - 我想这是您的客户端应用程序在 之上达到的限制。
    (b) AmqpLink 是在该 session 中创建的 - 这将触发 EventHubs 服务中的实体解析(与发送现有 EventHubSender 相比, 有点贵 )。

    ojit_a

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

    10-13 05:15