I have C# console application through which I am sending data to event hub frequently.This console application basically read some data from SQL storage and start pushing data to event hub.
This entire program run in endless loop/fashion like in while control whenever it receive any data in SQL it pulls data from there and start sending to Event hub.
But at some moment I got this error.
"Cannot allocate more handles to the current session or connection.The maximum number of handles allowed is 4999.Please free up resources any try again. at Microsoft.ServiceBus.Common......
When I restarted this console application its working fine.But I don't know why I got this error .
Please help me.
Thanks & Regards,
RK
答案 0 :(得分:11)
TLDR:在'发送到EventHub逻辑'中,确保您正在重复使用(缓存)相同的发件人实例。
为什么:
EventHubs旨在支持超大规模的高吞吐量低延迟事件发送系统。因此,我们选择依靠一个非常高性能的协议来进行所有运行时操作 - 即Amqp。 Amqp Protocol的优点在构建于其上的应用程序充分利用其优势时发挥作用。这就是EventHubs对象模型映射到Amqp工件的方式:
EventHubClient
映射到一个AmqpConnection。基数为1:1。如果在创建EventHubClient.CreateFromConnectionString
时指定了完全相同的ConnectionString - 底层物理套接字将被共享 - 但是amqp Artifact - AmqpConnection仍然不同。EventHubClient.Send(EventData)
时,EventHubClient
会在{{1}创建的AmqpConnection上创建 1 AmqpSession 并在该会话中 1 AmqpLink }}。只要将相同的EventHubClient
实例用于后续发送,就会重新使用此会话和链接。EventHubClient
上执行任何管理操作时 - 从,mgmt。操作(如getPartitionInfo)始终是请求 - 响应并且需要双向通信 - EventHubClient
在该会话中创建 1 AmqpSession 和 2 AmqpLink - 请求的一个链接&响应的其他链接(例如:想象一下REST EventHubClient
调用的结果)。Get
创建任何子实体时 - 例如EventHubClient
或EventHubSender
- EventHubReceiver
创建全新的AmqpSession && ; 该会话中的AmqpLink 。使用eventhub SDK的客户端应用程序的主要内容是:
每次创建EventHubClient
实例时,都会在下面创建一个真实的物理套接字。
每次创建EventHubClient
或EventHubSender
实例时,EventHubReceiver
创建的套接字将被重复使用并位于其上:
(a)创建AmqpSession - 没有。每个连接的AmqpSessions限制为5k - 我想这是您的客户端应用程序达到上限的限制。
(b)AmqpLink是在Session内部创建的 - 它将在EventHubs服务中触发实体解析(与在现有EventHubClient
上发送相比,稍微贵一点)。
答案 1 :(得分:0)
现在已解决问题我只创建了用于发送所有消息/事件的事件中心客户端的单个实例,而不是为每个消息/事件创建事件中心客户端实例。