2017-02-20 82 views
0

我已经在2个分区(0和1)的Azure门户中创建了一个事件中心。由于在服务总线等事件中心没有任何主题概念。我试图存储在分区0和分区1不同的数据使用Azure Event Hub中是否有类似于Azure Service Bus Topics的内容?

ehClient = EventHubClient.createFromConnectionStringSync(eventHubConnectionString.toString()); 
byte[] payload = "Storing data in partion 0".getBytes("UTF-8"); 
/** Storing data in partion 0*/ 
EventData data = new EventData(payload); 
ehClient .send(data, "0"); 

即使我试图存储在分区0是默认的数据得到存储在分区1.

我recieiver逻辑是:

eventHubClient = EventHubClient.create(Constant.EVENTHUB_SASKEYNAME, 
      Constant.EVENTHUB_SASKEY, Constant.EVENTHUB_NAMESPACE, Constant.EVENTHUB_NAME); 

EventHubConsumerGroup eventHubConsumerGroup = eventHubClient.getConsumerGroup("$Default"); 
eventHubReceiver = eventHubConsumerGroup.createReceiver("0", null, -1); 

while (true) { 
    message = eventHubReceiver.receive(-1); 

    if (null != message) 
     System.out.println("The message that is delivered is : " + message.getPayload()); 
    else 
     System.out.println("No message in the hub"); 
} 

这是将数据存储在分区中的正确方法吗?我们可以使用分区等同于Azure服务总线主题吗?

+0

没有,看http://stackoverflow.com/questions/42255265/how-are-different-events-handled-in-azure-event-hubs –

回答

0

对于你的标题问题,如@PeterBons说,没有任何东西EventHubs类似Azure的服务总线主题。

根据您的描述&代码,您想通过使用方法EventHubClient.send(EventData, PartitionKey)将事件数据发送到指定的分区。但是,如您所见,第二个参数是PartitionKey,而不是PartitionId。官方的API参考文献如下所述,从here开始,对于您的代码来说,按分区存储数据是不正确的。

多个PartitionKey可以映射到一个分区。 EventHubs服务使用专有散列算法将PartitionKey映射到PartitionId。使用这种类型的发送(使用特定partitionKey发送)有时可能会导致分区不均匀分布。

请参阅公文Publishing Events with the Java client for Azure Event Hubs & Consuming Events with the Java client for Azure Event Hubs创建PartitionSender & PartitionReceiver发送/从指定的分区接收事件数据/,如下图所示。

对于PartitionSender

String partitionId = "0"; 
EventHubClient ehClient = EventHubClient.createFromConnectionString(str).get(); 
EventHubSender sender = ehClient.createPartitionSender(partitionId).get(); 
EventData sendEvent = new EventData(payloadBytes); 
sender.send(sendEvent).get(); 

对于PartitionReceiver

String partitionId = "0"; // API to get PartitionIds will be released soon 
PartitionReceiver receiver = ehClient.createReceiver(
      EventHubClient.DefaultConsumerGroupName, 
      partitionId, 
      PartitionReceiver.StartOfStream, 
      false).get(); 

我不知道为什么要使用分区等同于Azure的服务总线主题。根据我的经验,模拟Azure Service Bus Topic的行为的解决方法是使用JSON格式在事件数据中添加topic等属性,并在接收时过滤&在topic属性中分派数据。

希望它有帮助。任何问题,请随时让我知道。

相关问题