Go中Azure Event Hub多Consumer Client与单Client性能差异及选型咨询
问题背景与现象
我正在开发一个Go应用,用于从包含20个分区的Azure Event Hub并发拉取事件。每个分区的入口流量约为0.8MB/sec,接近Azure Event Hub的限制,因此需要及时读取这些分区的事件。
我按照Azure Event Hub Go SDK的示例实现,原本计划创建1个ConsumerClient,再用它创建20个PartitionClient分别拉取对应分区的事件。但实际测试发现,当多个PartitionClient共享同一个ConsumerClient时,每个分区的拉取速度只能达到0.5-0.7MB/sec,无法达到Event Hub每个分区2MB/s的最大出口吞吐量。
而当我为每个PartitionClient单独创建1个ConsumerClient时,演示应用轻松实现了每个分区2MB/s的处理能力。
核心疑问
- 为什么创建多个
ConsumerClient会比使用单个ConsumerClient的事件拉取速度更快?我猜测可能是单个ConsumerClient底层仅建立一条与Event Hub服务的连接,客户端会根据内部连接限制进行节流,但原以为SDK能智能处理这种情况。 - 是否应该直接为每个分区使用一个
ConsumerClient?每个Event Hub的活跃ConsumerClient是否存在数量限制?
示例代码
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) } }
内容的提问来源于stack exchange,提问作者nick Georg
相关产品推荐
相关产品推荐

