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

时间:2021-03-18 18:05:35

标签: azure azure-eventhub azure-node-sdk

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

我在同一个 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)
        }        
      },
    }
  );

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

所以我的问题是:

  • 我是否正确理解只有 1 个消费者应该收到消息?
  • 这里有什么我遗漏的吗?

1 个答案:

答案 0 :(得分:3)

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

@azure/eventhubs-checkpointstore-blob 使用 Azure 存储 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 为您处理协调,最好不要设置它。