【问题标题】:How do I set partition key with batched messages in Azure Event Hub?如何在 Azure 事件中心中使用批处理消息设置分区键?
【发布时间】:2021-10-07 09:23:32
【问题描述】:

我从文件中读取行(我们称之为customers)并将它们发布到事件中心。每行包含一个customer_id 和一些数据。同一客户可能在文件中出现多次。因此,我想使用customer_id 作为分区键,以保证为同一客户保留订单,同时出于性能原因仍分批发送消息。看起来很简单...

因此,您可以使用

对消息或批处理设置分区
   var opts = new SendEventOptions() {
       PartitionKey = customer.CustomerId
   };
   client.SendAsync(messages, opts);

但这会在批次本身上设置分区键,这将使批次中的所有消息都具有相同的键

是否甚至可以在每条消息上设置分区键并仍然使用批处理以理智的方式?最好我想在每条消息上设置密钥,然后将它们添加到批处理中并发送。

我正在使用 Azure.Messaging.EventHubs 命名空间和 C#。

【问题讨论】:

    标签: c# azure azure-eventhub


    【解决方案1】:

    不幸的是,您想要做的事情是不可能的。事件中心服务要求为批处理中的所有事件分配相同的分区键。

    使用分区键的最佳选择是为您正在使用的每个分区键构建一个批处理,并在处理时添加到它们,当已满或某个刷新阈值已过时发送。

    或者,您可以将每个客户标识符分配给特定分区,然后使用上述方法为每个分区构建一个批次。这会更有效率,因为您需要管理的批次数量较少,并且可能会更快地填充每个批次。

    【讨论】:

    • 是的,我就是这么想的。我认为您的第二种方法是在我的代码中计算 partitionId 而不是使用 partitionKey(即partitionId = customerId % partitionCount)?是的,这可能行得通。我只需要以这种方式保持几批飞行。虽然有点乱。
    • 从概念上讲,这就是我的意思,以及服务在处理分区键时的作用。关键是选择一个哈希算法,它会给你一个好的事件分布。值得一提的是,该服务使用 Jenkins lookup3 的变体
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多