我正在使用azure eventhub来传输设备数据,我想确保每一个 设备数据将转到同一分区。 该流程正在向iot集线器发送数据,其中每个设备都有自己的分区密钥,并将其发送到具有与iot集线器分区密钥相同的分区密钥的eventhub(它们具有相同数量的分区)。 我试图设置eventdata.partitionkey属性等于iothub分区键,但我现在明白这个属性是哈希值,如果我设置partitionkey = 1,它不一定会去分区1。 使用此解决方案,eventhub分区分发非常糟糕(一半的分区根本没有获取任何数据)。 我也尝试使用CreatePartitionedSender来提供结果,但每次创建分区发送器时都像创建eventhub客户端一样,我得到有关连接数的错误(每个命名空间限制的AMQP连接数)。
什么是更好的解决方案:
或许有更好的解决方案?
更新: 我试图将eventdata.partitionkey设置为设备ID,但是我收到错误“SendBatch操作中的所有事件数据必须具有相同的分区键”。 所以这是一个糟糕的解决方案,因为如果我通过分区键拆分每个发送 我将有很多小块的发送操作,而不是只有1个
。 感谢。
答案 0 :(得分:0)
当我做类似的事情时,我几乎选择了2,即每个分区键分成一个发送操作。就发送操作的数量而言,它显然并不理想,但您应该能够衡量性能影响以确定它是否存在问题。然后你当然可以决定使用你的多个分区中的多个作为单独的哈希键,这样当Azure重新进行时,你不需要担心冲突并导致不平衡。也就是说,32个分区可能使用128个(或更多个)不同的分区键值,这样一个分区最终会以25%(或更少)的增量结束,而不是100%。
我自己没有使用分区发件人,但我相信this answer的结尾可能会指向您如何避免使用多个连接。
此外,如果您使用的发送模式是分区发件人 - 如果您从同一个eventHubClient(.CreatePartitionedSender())实例创建所有发件人,那么他们也将使用相同的基础MessagingFactory。