为我发送的每条消息创建 EventHubClient 是否正确?
Is it correct to create EventHubClient for every message I send?
我正在创建一个 EventHub 客户端应用程序,用于将消息发送到 Azure 上的事件中心。
现在,当我有一条消息要发送(每 5-6 秒)时,我创建了一个 class EventHubClient 的新实例,然后我用它来发送数据:
public async static void SendListOfMeasurements(string eventHubName, string connectionString, List<Measurement> measurementsList, int maxMessageSize)
{
// Create EventHubClient
EventHubClient client = EventHubClient.CreateFromConnectionString(
connectionString,
eventHubName);
...
这是一个好习惯吗?还是仅在启动时创建它然后仅使用 .Send 方法更好?
就性能而言,最佳方案是什么?以后发送量会增加,消息量也会增加
是的,它是正确的,你可以每次创建一个新的 EventHubClient
,这样就可以了。
在内部,如果连接字符串相同,它会重用相同的底层 TCP 连接。 EventHubClient
缓存其使用的 MessageFactory.Create(...)
方法的结果。
不,只有第一次需要使用 MessageFactory 创建一个新的 EventHubClient。
如果我为发送的每条消息创建一个客户端,则会创建一个新连接,而旧连接保持打开状态(使用 netstat 检查),从而导致大量 "ESTABILISHED" 个连接。
使用为第一条消息创建的单个客户端,然后为其他消息回收客户端,如果互联网连接丢失然后恢复,则自动重新创建 tcp 连接。
这是使用工厂创建客户端的示例:
var endpointUri = ServiceBusEnvironment.CreateServiceUri("sb", eventHubNamespace, string.Empty);
MessagingFactory factory = MessagingFactory.Create(endpointUri, new MessagingFactorySettings
{
TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken),
TransportType = TransportType.Amqp
});
factory.RetryPolicy = new RetryExponential(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(30), 3);
client = factory.CreateEventHubClient(eventHubName);
直接使用 EventHubClient.CreateFromConnectionString(...) 创建客户端将为每个客户端创建一个新的 tcp 连接。
但是,在使用共享 MessagingFactory
创建客户端时
var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");
客户端将重用底层的 tcp 连接。来自文档:Create an Event Hubs client
我正在创建一个 EventHub 客户端应用程序,用于将消息发送到 Azure 上的事件中心。 现在,当我有一条消息要发送(每 5-6 秒)时,我创建了一个 class EventHubClient 的新实例,然后我用它来发送数据:
public async static void SendListOfMeasurements(string eventHubName, string connectionString, List<Measurement> measurementsList, int maxMessageSize)
{
// Create EventHubClient
EventHubClient client = EventHubClient.CreateFromConnectionString(
connectionString,
eventHubName);
...
这是一个好习惯吗?还是仅在启动时创建它然后仅使用 .Send 方法更好? 就性能而言,最佳方案是什么?以后发送量会增加,消息量也会增加
是的,它是正确的,你可以每次创建一个新的 EventHubClient
,这样就可以了。
在内部,如果连接字符串相同,它会重用相同的底层 TCP 连接。 EventHubClient
缓存其使用的 MessageFactory.Create(...)
方法的结果。
不,只有第一次需要使用 MessageFactory 创建一个新的 EventHubClient。 如果我为发送的每条消息创建一个客户端,则会创建一个新连接,而旧连接保持打开状态(使用 netstat 检查),从而导致大量 "ESTABILISHED" 个连接。
使用为第一条消息创建的单个客户端,然后为其他消息回收客户端,如果互联网连接丢失然后恢复,则自动重新创建 tcp 连接。
这是使用工厂创建客户端的示例:
var endpointUri = ServiceBusEnvironment.CreateServiceUri("sb", eventHubNamespace, string.Empty);
MessagingFactory factory = MessagingFactory.Create(endpointUri, new MessagingFactorySettings
{
TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken),
TransportType = TransportType.Amqp
});
factory.RetryPolicy = new RetryExponential(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(30), 3);
client = factory.CreateEventHubClient(eventHubName);
直接使用 EventHubClient.CreateFromConnectionString(...) 创建客户端将为每个客户端创建一个新的 tcp 连接。 但是,在使用共享 MessagingFactory
创建客户端时var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");
客户端将重用底层的 tcp 连接。来自文档:Create an Event Hubs client