EventHub异常:无法为当前会话或连接分配更多句柄

JAR*_*VIS 7 azureservicebus azure-eventhub

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

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

但是有一刻我得到了这个错误.

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

当我重新启动这个控制台应用程序时它工作正常.但我不知道为什么我得到这个错误.

请帮我.

感谢和问候,

RK

Sre*_*ati 13

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

为什么:

EventHubs旨在支持超大规模的高吞吐量低延迟事件系统.因此,我们选择依靠一个非常高性能的协议来进行所有运行时操作 - 即Amqp.Amqp协议的优点在构建于其上的应用程序充分利用其优势时发挥作用.这就是EventHubs对象模型映射到Amqp工件的方式:

  1. EventHubClient映射到一个AmqpConnection.基数为1:1.如果在创建时指定完全相同的ConnectionString EventHubClient.CreateFromConnectionString- 将共享底层物理套接字 - 但amqp工件 - AmqpConnection仍然不同.
  2. 每当客户端调用EventHubClient.Send(EventData),在内部,EventHubClient造成1个AmqpSession在该届会议1个AmqpLink上所创造的AmqpConnection EventHubClient.只要将相同的EventHubClient实例用于后续发送,就会重新使用此会话和链接.
  3. 每当执行任何管理操作时,EventHubClient- ,mgmt.操作(如getPartitionInfo)始终是请求 - 响应并且需要双向通信 - 在该会话中EventHubClient创建1个AmqpSession2个AmqpLink - 一个用于请求的链接和用于响应的其他链接(例如:想象一下REST Get调用的结果).
  4. 无论何时,任何子实体都是从EventHubClient- 创建- EventHubSender或者EventHubReceiver- 在该会话中EventHubClient创建全新的AmqpSession && AmqpLink.

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

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

每次创建一个EventHubSender或一个EventHubReceiver实例时,创建的套接字EventHubClient被重新使用并在其上面:(a)创建一个AmqpSession - no.每个连接的AmqpSessions限制为5k - 我想这是您的客户端应用程序达到的限制.(b)AmqpLink是在Session内部创建的 - 它将在EventHubs服务中触发实体解析(与在现有服务上发送相比,这有点贵EventHubSender).