带有 NodeJS SDK 的 EventHub - ConsumerGroup 中的所有消费者都收到消息

EventHub with NodeJS SDK - All consumers in ConsumerGroup getting the message

我希望有人能为我澄清一下:

我在同一个 ConsumerGroup 中有 2 个消费者,我的理解是他们应该在他们之间进行协调,但我遇到的问题是 两个消费者都收到了所有消息。我的代码非常简单:

const connectionString =...";
const eventHubName = "my-hub-dev";
const consumerGroup = "processor"; 

async function main() {
  const consumerClient = new EventHubConsumerClient(consumerGroup, connectionString, eventHubName);
  const subscription = consumerClient.subscribe({
      processEvents: async (events, context) => {
        for (const event of events) {
          console.log(`Received event...`, event)
        }        
      },
    }
  );

如果我 运行 这个消费者代码的两个实例并发布一个事件,两个实例都会收到该事件。

所以我的问题是:

EventHubConsumerClient 需要一个 CheckpointStore 来促进多个客户端之间的协调。您可以在实例化时将其传递给 EventHubConsumerClient 构造函数。

@azure/eventhubs-checkpointstore-blob 使用 Azure Storage Blob 来存储元数据,并且需要协调使用同一消费者组的多个消费者。它还存储检查点数据:您可以调用 context.updateCheckpoint 事件,如果您停止并启动一个新的接收器,它将从该事件关联的分区中的最后一个检查点事件继续。

这里有一个使用 @azure/eventhubs-checkpointstore-blob 的完整示例:https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/eventhub/eventhubs-checkpointstore-blob/samples/javascript/receiveEventsUsingCheckpointStore.js

说明:事件中心服务在从使用者组读取数据时不会强制分区的单一所有者除非客户端指定了ownerLevel。最高 ownerLevel“获胜”。您可以在传递给 subscribe 的选项包中设置它,但是如果您希望 CheckpointStore 为您处理协调,最好不要设置它。