我有 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
创建的- 像 EventHubSender
或 EventHubReceiver
- EventHubClient
创建 全新的 AmqpSession && 该 session 中的 AmqpLink . 使用 eventhub SDK 的客户端应用程序的关键要点是 :
每次
EventHubClient
创建实例 - 在下面创建一个真实的物理套接字。每次
EventHubSender
或 EventHubReceiver
实例是由 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/