事件中心异常:无法为当前会话或连接分配更多句柄



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

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

但是在某个时刻,我得到了这个错误。

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

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

请帮助我。

谢谢和问候,

RK

TLDR:在"发送到事件中心逻辑"中,确保重复使用(缓存)相同的发送方实例。

原因

事件

中心旨在支持非常大规模的高通量低延迟事件系统。因此,我们选择为所有运行时操作依赖一个非常高性能的协议 - 即 Amqp。当建立在Amqp协议之上的应用程序充分利用其优势时,Amqp协议的优点就会发挥作用。以下是 EventHubs 对象模型映射到 Amqp 项目的方式:

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

使用事件中心 SDK 的客户端应用程序的关键要点包括

每次创建EventHubClient实例时,都会在其下创建一个真正的物理套接字。

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

详细了解事件中心。

问题现已解决 我只创建事件中心客户端的单个实例来发送所有消息/事件,而不是为每个消息/事件创建事件中心客户端实例。

最新更新