我有 C# 控制台应用程序,通过它经常向事件中心发送数据。这个控制台应用程序基本上从 SQL 存储中读取一些数据,并开始将数据推送到事件中心。
整个程序以无限循环/方式运行,就像在 while 控制中一样,每当它收到 SQL 中的任何数据时,它就会从那里提取数据并开始发送到事件中心。
但在某个时刻我收到了这个错误。
“无法为当前会话或连接分配更多句柄。允许的最大句柄数为 4999。请释放资源再试一次。在 Microsoft.ServiceBus.Common......
当我重新启动此控制台应用程序时,它工作正常。但我不知道为什么会出现此错误。
请帮我。
感谢和问候,
RK
TLDR: 在“发送到 EventHub 逻辑”中,确保您正在重用(缓存)同一发送者实例。
The Why:
EventHubs 旨在支持超大规模高吞吐量低延迟事件系统。因此,我们选择依赖一个非常高性能的协议来执行所有运行时操作 - 即Amqp。的好处Amqp协议当构建在其之上的应用程序充分利用其优势时,它就会发挥作用。这是 EventHubs 对象模型映射到 Amqp 工件的方式:
-
EventHubClient
映射到一个 AmqpConnection。基数为 1:1。如果创建时指定了完全相同的 ConnectionStringEventHubClient.CreateFromConnectionString- 底层物理套接字将被共享 - 但 amqp 工件 - AmqpConnection 仍然不同。
- 每当客户端调用
EventHubClient.Send(EventData)
,内部,EventHubClient
创造1 Amqp 会话 and 该会话中有 1 个 AmqpLink在创建的 AmqpConnection 上EventHubClient
。此Session和Link只要相同就可以重复使用EventHubClient
实例用于后续发送。
- 每当对系统执行任何管理操作时
EventHubClient
- 因为,管理。操作(如 getPartitionInfo)始终是请求-响应并且需要 2 路通信 -EventHubClient
创造1 Amqp 会话 and 该会话中有 2 个 AmqpLink - 一个用于请求的链接,另一个用于响应的链接(例如:想象 REST 的结果Get
call).
- 每当任何时候,任何子实体都是从创建的
EventHubClient
- like EventHubSender
or EventHubReceiver
- EventHubClient
创造一个全新的 AmqpSession&&该会话中的 AmqpLink.
使用 eventhub SDK 的客户端应用程序的主要要点是:
每次EventHubClient
创建实例 - 在下面创建一个真实的物理套接字。
每次EventHubSender
or an EventHubReceiver
创建了该套接字创建的实例EventHubClient
被重用并在其之上:(a)创建一个 Amqp 会话 - 否。每个连接的 Amqp 会话数限制为 5k -我想这是您的客户端应用程序所达到的限制。
(b) AmqpLink 在该会话内创建 - 这将反过来触发 EventHubs 服务中的实体解析(即有点贵与现有的发送相比EventHubSender
).
有关事件中心的更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)