Pra*_*tic 2 azure azure-eventhub
我们正在开发一个多租户应用程序,其中 eventhub 将在不同租户之间共享。我们将在租户之间分配分区。每个租户都会在不同的分区上发送消息。我们想在分区级别对租户进行身份验证。如 Microsoft 站点所述,我们根据租户 ID 定义了分区键。但问题不止一个分区键在同一分区上发送消息。这不应该是这种情况。理想情况下,每个分区键都应该映射到不同的分区。
var serviceNamespace = "namespace name here";
var hubName = "hub name here";
var deviceName = "device name here";
var sasToken = "SAS TOKEN HERE";
Mymessage subGroup1 = CreateMessage();
var factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, ""), new MessagingFactorySettings
{
TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken),
TransportType = TransportType.Amqp
});
var client = factory.CreateEventHubClient(String.Format("{0}/publishers/{1}", hubName, deviceName));
var data = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(subGroup1)));
data.PartitionKey = "jeep";
client.Send(data);
Run Code Online (Sandbox Code Playgroud)
请帮助我了解我的方法有什么问题。
很简单,可能的字符串分区键的无限空间被映射到事件中心内非常有限的分区空间。除非您向 Microsoft 询问更多信息,否则您的 EventHub 中最多有 32 个分区。分区键被散列,然后散列空间在分区空间之间划分。这提供了文档中的保证
事件中心确保共享相同分区键值的任何和所有事件按顺序传递到同一个分区。重要的是,如果分区键与发布者策略一起使用(在下一节中描述),那么发布者的身份和分区键的值必须匹配。
在这种具有良好性能的系统中不能保证并且不能保证的是每个分区键都转到不同的分区。在这个问题中讨论了其中的一些内容。通过发布商政策,您还知道
使用发布者策略时,PartitionKey 值设置为发布者名称。为了正常工作,这些值必须匹配。
这意味着来自单个发布者的所有事件都转到单个分区。就我个人而言,我认为这并不总是一件好事,因为您最终会得到每个发布者一个吞吐量单位的硬上限(如果您在散列方面不走运,则更少)。
如果您需要将每个客户的数据隔离在不同的分区中,并通过授予客户直接与 EventHub 对话的凭据强制执行此操作,我认为您唯一的选择可能是使用多个 EventHub。我相信(从某种意义上说,我还没有检查我们的账单)同一服务总线中的 EventHub 共享吞吐量单位。
但是,如果您只需要您的消费者能够告诉它来自哪个发布者/客户,那么我相信您可以使用EventData.PartitionKey,它保证是上面记录的发布者名称。
| 归档时间: |
|
| 查看次数: |
3772 次 |
| 最近记录: |