我们正在开发一个多租户应用程序,其中 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);
请帮助我了解我的方法有什么问题。
很简单,可能的字符串分区键的无限空间被映射到事件中心内非常有限的分区空间。除非您向 Microsoft 请求更多,否则您的 EventHub 中最多有 32 个分区。分区键被散列,然后散列空间被划分到分区空间中。这提供了保证文档 https://msdn.microsoft.com/en-us/library/azure/dn836025.aspx
事件中心确保共享相同分区键值的所有事件均按顺序传递到同一分区。重要的是,如果分区键与发布者策略一起使用(如下一节所述),则发布者的身份和分区键的值必须匹配。
在这种具有良好性能的系统中,无法保证也无法保证每个分区键都位于不同的分区。其中一些讨论见这个问题 https://stackoverflow.com/questions/25876671/how-does-azures-eventdata-partitionkey-decide-which-partition-to-write-to。通过发布商政策,您还知道
使用发布者策略时,PartitionKey 值设置为发布者名称。为了正常工作,这些值必须匹配。
这意味着来自单个发布者的所有事件都会发送到单个分区。就我个人而言,我认为这并不总是一件好事,因为最终每个发布者都会有一个吞吐量单位的硬性上限(如果你在哈希方面不走运,则更少)。
如果您需要将每个客户的数据分离在不同的分区中,并通过向客户提供直接与 EventHub 对话的凭据来强制执行此操作,我认为您唯一的选择可能是使用多个 EventHub。我believe(从某种意义上说,我还没有检查我们的账单)同一服务总线内的 EventHub 共享吞吐量单位。
但是,如果您只需要您的消费者能够知道它来自哪个发布者/客户,那么我相信您可以使用事件数据.PartitionKey https://msdn.microsoft.com/en-us/library/azure/microsoft.servicebus.messaging.eventdata.partitionkey.aspx保证是上面记录的发布者名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)