我可以在使用 PartitionSender 发送到 EventHubs 时设置 EventData.PartitionKey 吗?

Dav*_*ton 2 c# azure azure-eventhub

我目前在 Azure 中设置了一个 EventHub 实例。它有5个分区。我想知道,如果有什么PartitionKey总是要成为之间的数字0,并n-1n被分区数目。

我有以下代码:

    private static async Task SendMessagesToEventHub(int numMessagesToSend)
    {
        var sender = eventHubClient.CreatePartitionSender("test1");

        for (var i = 0; i < numMessagesToSend; i++)
        {
            try
            {
                var message = $"Message {i}";
                Console.WriteLine($"Sending message: {message}");
               await  sender.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
            }
            catch (Exception exception)
            {
                Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
            }

            await Task.Delay(10);
        }

        Console.WriteLine($"{numMessagesToSend} messages sent.");
    }
Run Code Online (Sandbox Code Playgroud)

这会引发异常

指定的分区对于 EventHub 分区发送方或接收方无效。它应该在 0 到 4 之间。

在EventHub的文档中,他们是这样说的PartitionKey

EventData 类具有 PartitionKey 属性,该属性使发送方能够指定经过哈希处理的值以生成分区分配。使用分区键可确保将具有相同键的所有事件发送到事件中心的同一分区。常见的分区键包括用户会话 ID 和唯一的发送者 ID

对我来说,这意味着您不仅限于 ,int还可以使用任何string. 我错过了什么?

Sre*_*ati 5

回答

你不能混合PartitionKeyPartitionSender- 它们是两个相互排斥的概念。

不要使用PartitionSenderaka ehClient.CreatePartitionSender()- API,它旨在发送到特定分区(在这种情况下 EventHub 服务不能再使用PartitionKeyto-hash-to)。

相反,请在以下代码段中使用c#

EventData myEvent = new EventData(Encoding.UTF8.GetBytes(message));
myEvent.PartitionKey = "test1";
await eventHubClient.SendAsync(myEvent);
Run Code Online (Sandbox Code Playgroud)

我们了解到,这对于我们的客户来说有点令人困惑,然后当我们制作JavaSDK 时,我们更正/简化了我们的 API,使其看起来像这样:

EventData myEvent = new EventData(message.getBytes(Charset.defaultCharset()))
eventHubClient.SendSync(myEvent, "test1");
Run Code Online (Sandbox Code Playgroud)

事件中心公开的 3 种类型的发送模式:

当我们开发 EventHubs 服务时 - 我们希望为我们的用户提供对其事件流进行分区的多个级别的控制。我们提出了以下 3 种模式(我们的c#客户端 API):

  1. EventHubClient.Send(eventData_ Without _PartitionKey) - 当您不想控制数据的分区方式时使用它。EventHubs 服务将尝试在所有分区中均匀分布数据(尽力而为,无保证)。正如,你权衡上的分区数据的控制-你得到这里是高可用性。如果您的事件中心有 32 个分区 - 并且正在使用这种发送到事件中心的方法 - 您的事件将被传送到 32 个立即可用且数据最少的事件中心分区之一。

  2. EventHubClient.Send(eventData_ With _PartitionKey) - 当你的数据有一个属性时使用它 - 使用它来对数据进行分区。EventHubs 服务将确保所有EventData具有相同的 sPartitionKey将落在相同的EventHubs partition. 在这里 - 用户通过指定一个提示来控制分区 - 我们的服务将使用它运行散列算法并传送到散列分区。所有具有相同的事件PartitionKey都保证落在相同的Event Hubs partition.

  3. EventHub Sender .Send(eventData_Without_PartitionKey) - EventHubPartitionSender名称更适合于此 - 当您想要完全控制分区数据时使用它 - 当您需要控制时 -EventData应该落在哪个EventHubs partition. 这通常用于 - 当客户拥有自己的专有哈希算法时 - 他们认为在他们的场景中表现更好 - wrto。负载分布的公平性EventHubs partitions

你需要的是(2)。

这里有一些关于事件中心概念的一般阅读......