事件集线器发送器的发送和发送批处理延迟不一致



我们使用EventHubSender.Send和EventHubSendr.SendBatch API方法在Azure Event Hub上发送数据包。每个数据包的大小通常为6KB,并且每秒有13个这样的数据包来自13个不同的客户端机器(每台机器每秒发送一个数据包)。我们在单个命名空间中有两个事件集线器,每个集线器都有[6KB*13]个数据包作为入口和出口。由于总入口和出口远低于一个吞吐量单元的容量,因此没有观察到节流。

但是,对于每秒发送的数据包,发送延迟并不保持一致。有时发送延迟会高达3到4秒。此行为已针对内部部署客户端机器以及Azure数据中心中的客户端机器进行了测试(仅用于测试目的)。

客户端初始化代码片段:

var factory = MessagingFactory.CreateFromConnectionString(EventHubConnectionString);
EventHubClient eventHubClient = this.factory.CreateEventHubClient(EventHubName);
this.eventHubSender = eventHubClient.CreatePartitionedSender(EventHubPartitionId);

发件人代码片段:

using (EventData eventData = CreateEventDataPacket(data, settings))
{
      this.eventHubSender.Send(eventData);
} 

请注意:eventHubSender实例将被重复用于每个后续发送请求,EventHubConnectionString中使用的传输类型为AMQP。

请建议是否可以减少延迟并使Send和SendBatch方法保持一致。

您正在创建PartitionedSender,它将事件发送到特定分区。在服务端,执行服务升级时,分区可能会从一个后端移动到另一个后端,这将使分区在几秒钟内不可用,并可能导致发送延迟。如果您不使用partitionedSender,事件集线器客户端将以循环方式向每个分区发送,这将缓解分区移动时的情况。

除此之外,发送延迟还受到许多因素的影响,如网络、负载平衡、服务可用性等。

最新更新