Azure事件中心和多个使用者组

时间:2015-01-05 22:54:22

标签: azure publish-subscribe azure-eventhub

在以下方案中需要有关使用Azure事件中心的帮助。我认为消费者群体可能是这种情况的正确选择,但我无法在网上找到具体的例子。

以下是问题的粗略描述以及使用事件中心的建议解决方案(我不确定这是否是最佳解决方案。非常感谢您的反馈

enter image description here

我有多个事件源可以生成大量事件数据(来自传感器的遥测数据),需要保存到我们的数据库中,并且应该在并行中执行一些分析,如运行平均值,最小值 - 最大值强>

发件人只能将数据发送到单个端点,但事件中心应该将这些数据提供给两个数据处理程序。

我正在考虑使用两个消费者群体,第一个是工作者角色实例的集群,负责将数据保存到我们的键值存储,第二个消费者群体将是一个分析引擎(可能会与Azure流分析)。

首先,我如何设置消费者群体,是否需要在发送者/接收者方面做些事情,以便所有消费者群体都能看到事件副本?

我确实在线阅读了很多示例,但是他们使用client.GetDefaultConsumerGroup();和/或让所有分区都由同一个工作者角色的多个实例处理。

对于我的场景,当一个事件被触发时,它需要由两个不同的工作者角色并行处理(一个保存数据,另一个进行一些分析)

谢谢!

1 个答案:

答案 0 :(得分:30)

TLDR:看起来合理,只需使用CreateConsumerGroupIfNotExists使用不同的名称制作两个使用者组。

消费者群体主要是一个概念,因此它们的工作方式取决于您的订阅者的实施方式。如您所知,从概念上讲,它们是一组一起工作的订阅者,以便每个组都接收所有消息,并且在理想情况下(不会发生)情况可能会消耗每个消息一次。这意味着每个消费者组"所有分区都由同一工作者角色的多个实例处理。"你想要这个。

这可以通过不同方式实施。 Microsoft已经提供了两种直接使用Event Hubs消息的方法,以及使用Streaming Analytics等可能基于两种直接方式构建的选项。第一种方式是Event Hub Receiver,第二种方式是更高级别Event Processor Host

我没有直接使用Event Hub Receiver所以这个特别的评论是基于这些系统如何运作的理论和文档中的猜测:虽然它们是created来自EventHubConsumerGroups这个因为这些接收器不相互协调,所以没有什么用处。如果您使用这些,您将需要(并且可以!)自己完成所有协调和提交偏移,这在某些情况下具有优势,例如在与计算聚合相同的事务中将偏移量写入事务DB。使用这些low level receivers,使用相同的Azure使用者组的不同逻辑使用者组可能不应该(规范性而非实用的建议)特别有问题,但是如果它确实重要或者你改变了,你应该使用不同的名称到EventProcessorHosts

现在转到更有用的信息,EventProcessorHosts可能建立在EventHubReceivers之上。它们是更高级别的东西,并且支持使多台机器作为逻辑消费者组一起工作。下面我已经在我的代码中添加了一个经过精心编辑的代码片段,该代码段会在解释一些选项时留下一些评论留下EventProcessorHost

//We need an identifier for the lease. It must be unique across concurrently 
//running instances of the program. There are three main options for this. The 
//first is a static value from a config file. The second is the machine's NETBIOS
//name ie System.Environment.MachineName. The third is a random value unique per run which
//we have chosen here, if our VMs have very weak randomness bad things may happen.

string hostName = Guid.NewGuid().ToString();

//It's not clear if we want this here long term or if we prefer that the Consumer 
//Groups be created out of band. Nor are there necessarily good tools to discover 
//existing consumer groups.
NamespaceManager namespaceManager = 
    NamespaceManager.CreateFromConnectionString(eventHubConnectionString);
EventHubDescription ehd = namespaceManager.GetEventHub(eventHubPath);
namespaceManager.CreateConsumerGroupIfNotExists(ehd.Path, consumerGroupName);

host = new EventProcessorHost(hostName, eventHubPath, consumerGroupName, 
    eventHubConnectionString, storageConnectionString, leaseContainerName);
//Call something like this when you want it to start
host.RegisterEventProcessorFactoryAsync(factory)

你会注意到我告诉Azure如果它不存在就建立一个新的消费者群体,如果它没有,你会得到一个可爱的错误消息。老实说,我不知道这是什么目的,因为它没有包含需要的存储连接字符串,以便跨实例使用,以便EventProcessorHost可以使用协调(并且可能是承诺)正常工作。

在这里,我提供了Azure Storage Explorer租约的图片,这些图片来自我在11月试验的消费者群体的租约和可能的抵消。请注意,虽然我有一个testhub和一个testhub-testcg容器,但这是由于手动命名它们。如果它们在同一个容器中,那就像" $ Default / 0" vs" testcg / 0"。 Event Hub Leases

正如您所看到的,每个分区都有一个blob。我的假设是这些blob用于两件事。第一个是用于在实例之间分配分区的Blob租约,请参阅here,第二个是在已经提交的分区中存储偏移量。

消费实例不是将数据推送到消费者组,而是要求存储系统在一个分区中的某个偏移处获取数据。 EventProcessorHosts是一个很好的高级方式,拥有一个逻辑消费者组,每个分区一次只能被一个消费者读取,并且不会忘记逻辑消费者组在每个分区中所取得的进展。

请记住,每个分区的吞吐量都是经过测量的,因此,如果您最大限度地减少进入,那么您只能拥有两个完全符合速度的逻辑消费者。因此,您需要确保拥有足够的分区和吞吐量单位,您可以:

  1. 阅读您发送的所有数据。
  2. 如果由于问题而落后几个小时,请在24小时保留期内赶上。
  3. 总之:消费者群体是您所需要的。您阅读的使用特定使用者组的示例很好,在每个逻辑使用者组中使用Azure使用者组的相同名称,并且不同的逻辑使用者组使用不同的名称。

    我还没有使用过Azure流分析,但至少在预览版中你是limited to the default consumer group。因此,不要将默认的消费者群体用于其他内容,如果您需要两个单独的Azure Stream Analytics,您可能需要做一些令人讨厌的事情。但它很容易配置!