我正在构建一个 Go 应用程序,以从具有 20 个分区的 Azure 事件中心同时获取事件。每个分区的入口约为 0.8mb/秒,这接近 Azure 事件中心的限制,因此我想及时从这些分区读取事件。
我遵循了 this 示例,根据文档,我假设我需要 1 个 ConsumerClient,然后使用此客户端分别创建 20 个 Partitionclient 和获取事件。 尽管我很快注意到,当分区客户端共享相同的 ConsumerClient 时,我无法从 Azure 事件中心实现每个分区 2mb/s 出口的最大吞吐量。我每个分区最多只能达到 0.5-0.7mb/s。
当我为每个 PartitionClient 创建 1 ConsumerClient 时,我的演示应用程序可以轻松处理每个分区 2mb/s。
与使用单个消费者客户端相比,为什么创建多个消费者客户端会导致更快的事件获取? 我知道这可能是由于与事件中心服务的单个底层连接造成的,并且客户端可能会根据内部连接限制在内部限制请求,但我猜测 SDK 会足够智能来处理这种情况。
我应该为每个分区使用 1 个消费者客户端吗?每个事件中心的活跃消费者客户端是否有任何限制?
示例代码片段
func main() {
startTime := time.Now()
consumerClient, _ := azeventhubs.NewConsumerClientFromConnectionString("blah")
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
totalBytes := 0
partitionClient, _ := consumerClient.NewPartitionClient(strconv.Itoa(i), &azeventhubs.PartitionClientOptions{})
defer partitionClient.Close(context.Background())
for {
events, _ := partitionClient.ReceiveEvents(context.Background(), 10, nil)
if len(events) == 0 {
mbPerSec := float64(totalBytes) / time.Since(startTime).Seconds() / 1024 / 1024
fmt.Printf("Partition %d mb/s: %f\n", i, mbPerSec)
break
}
for _, event := range events {
totalBytes += len(event.Body)
}
}
}(i)
}
}
A
ConsumerClient
拥有底层 AMQP 连接,从它生成的任何分区客户端都将共享该连接。 通过创建多个消费者客户端,您将打开多个返回服务的连接。
性能会根据许多因素而变化,例如执行的处理、数据的结构和大小、批量大小和预取计数、主机网络环境以及应用程序/主机执行的其他活动。 我们建议针对您的特定应用测试各种配置和调整。