我正在创建一个EventHub客户端应用程序,该应用程序将消息发送到Azure上的事件中心。 现在,当我有一个要发送的消息(每5-6秒)我创建一个EventHubClient类的新实例,然后我用它来发送数据:
public async static void SendListOfMeasurements(string eventHubName, string connectionString, List<Measurement> measurementsList, int maxMessageSize)
{
// Create EventHubClient
EventHubClient client = EventHubClient.CreateFromConnectionString(
connectionString,
eventHubName);
...
这是一个好习惯吗?或者最好只在启动时创建它,然后只使用.Send方法? 在性能方面最好的情况是什么?将来,发送的数量可能会增加,消息数量也会增加
答案 0 :(得分:4)
使用EventHubClient.CreateFromConnectionString(...)直接创建客户端将为每个客户端创建一个新的tcp连接。 但是,使用共享MessagingFactory
创建客户端时var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");
客户端将重用底层tcp连接。来自文档:Create an Event Hubs client
答案 1 :(得分:3)
不,第一次使用MessageFactory创建新的EventHubClient是必要的。 如果我为我发送的每条消息创建一个客户端,那么就会创建一个新连接并保持打开旧连接(使用netstat检查),从而产生大量“ESTABILISHED”连接。
使用为第一条消息创建的单个客户端,然后为其他消息回收客户端,如果互联网连接丢失然后返回,则会自动重新创建tcp连接。
答案 2 :(得分:1)
以下是使用工厂创建客户端的示例:
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);
答案 3 :(得分:-1)
是的,它是正确的,你可以每次创建一个新的EventHubClient
,没关系。
在内部,如果连接字符串相同,它将重用相同的底层TCP连接。 EventHubClient
缓存了它使用的MessageFactory.Create(...)
方法的结果。