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