Azure Eventhub将数据发送到特定分区C#

时间:2018-05-07 07:41:20

标签: c# azure-eventhub

我正在使用azure eventhub来传输设备数据,我想确保每一个 设备数据将转到同一分区。 该流程正在向iot集线器发送数据,其中每个设备都有自己的分区密钥,并将其发送到具有与iot集线器分区密钥相同的分区密钥的eventhub(它们具有相同数量的分区)。 我试图设置eventdata.partitionkey属性等于iothub分区键,但我现在明白这个属性是哈希值,如果我设置partitionkey = 1,它不一定会去分区1。 使用此解决方案,eventhub分区分发非常糟糕(一半的分区根本没有获取任何数据)。 我也尝试使用CreatePartitionedSender来提供结果,但每次创建分区发送器时都像创建eventhub客户端一样,我得到有关连接数的错误(每个命名空间限制的AMQP连接数)。

什么是更好的解决方案:

  1. 为PartitionSender写一个工厂类(工厂是否已经写好?)所以每个分区都有一个客户端,我将不得不处理健康状况,也许还需要一些并发性。
  2. 使用eventdata.partitionkey属性并设置更好的哈希值(可能是设备ID而不是分区号),我不必再写任何额外的内容或处理连接错误。
  3. 或许有更好的解决方案?

    更新: 我试图将eventdata.partitionkey设置为设备ID,但是我收到错误“SendBatch操作中的所有事件数据必须具有相同的分区键”。 所以这是一个糟糕的解决方案,因为如果我通过分区键拆分每个发送 我将有很多小块的发送操作,而不是只有1个

    。 感谢。

1 个答案:

答案 0 :(得分:0)

当我做类似的事情时,我几乎选择了2,即每个分区键分成一个发送操作。就发送操作的数量而言,它显然并不理想,但您应该能够衡量性能影响以确定它是否存在问题。然后你当然可以决定使用你的多个分区中的多个作为单独的哈希键,这样当Azure重新进行时,你不需要担心冲突并导致不平衡。也就是说,32个分区可能使用128个(或更多个)不同的分区键值,这样一个分区最终会以25%(或更少)的增量结束,而不是100%。

我自己没有使用分区发件人,但我相信this answer的结尾可能会指向您如何避免使用多个连接。

  

此外,如果您使用的发送模式是分区发件人 - 如果您从同一个eventHubClient(.CreatePartitionedSender())实例创建所有发件人,那么他们也将使用相同的基础MessagingFactory。