在 Azure Fabric 可靠参与者之间共享 EventHub
Sharing EventHub between Azure Fabric reliable actors
我有一个应用程序,可以将物理世界的设备映射到 Reliable Actors in Azure Fabric。每次从设备收到消息时,我都想将消息推送到事件中心。
我现在正在做的是 creating/using/closing 每条消息的 EventHubClient 对象。
这非常低效(大约需要 1500 毫秒),但它解决了我过去在内存中保存 EventHubClient 时遇到的问题。当我有很多设备时,底层虚拟机可以快速 运行 断开网络连接。
我正在考虑创建一个新的参与者,负责将数据推送到 EventHub(通过使 EventHubClient 保持活动状态)。由于 Reliable Actors 的基于转向的并发模型,我不确定这是个好主意。如果我有 10 000 个设备推送数据 "at the same time",它们的每个 actor 都会阻止将消息推送到将消息推送到 EventHub 的新 actor。
对于这种情况,推荐的方法是什么?
谢谢,
您可以在此处使用 pub/sub 模式(使用 BrokerService
)。
通过将事件发布与事件处理解耦,您无需担心基于回合的并发模型。
出版商:
Actor 通过简单地 publishing 将消息发送到 BrokerService
。
订阅者
然后您使用一个或多个 Stateless Services or (different) Actors 作为事件的订阅者。
他们会按照自己的节奏将它们发送到 EventHub。
事件中心客户端
使用这种方法,您可以完全控制 EventHubClient
实例计数和生命周期。
您可以通过简单地添加更多订阅者来提高事件处理能力。
一种方法是创建负责将消息推送到 EventHub 的无状态服务。每次 Actor 从设备接收到消息(顺便说一句,他们如何与 Actor 通信?)时,Actor 调用无状态服务。反过来,无状态服务将负责为每个服务创建、维护和处理一个 EventHubClient。在处理传入消息时,Reliable Service 不会引入与 Reliable Actor 相同的 'overhead'。如果对于您的应用程序而言,消息以与它们生成时严格相同的顺序到达 EventHub 很重要,那么您将必须使用有状态服务和可靠队列来做到这一点。 (请注意,另一方面,不能保证 Actor 能够以与生成消息相同的顺序完成处理传入消息)
然后您可以通过试验 instance count
(https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-availability-services) 来微调解决方案,以确保您有足够的实例来处理传入消息的吞吐量。多少个实例大致取决于节点数和每个节点的核心数,尽管其他因素也可能影响。
设备与您的 Actors
通信,Actors
又与 Service
通信(如果您想排队消息,可以是无状态或有状态的,见下文),每个服务管理一个 EventHubClient
可以将消息推送到 EventHub
.
如果您的集群无法支持足够高的此服务的实例计数(稍微简化:更多实例 = 更高的吞吐量),那么您可能需要将其创建为有状态服务并将消息放入服务中的可靠队列,然后让服务按顺序处理队列的 RunAsync
。这可能会承受性能峰值的压力。
Service Fabric Azure-Samples WordCount 展示了如何使用不同的分区来使来自 Actors 的消息针对不同的实例(或真正的分区)。
一个一般的提示是不要尝试将 Actors 用于所有事情(但对于正确的事情它们很棒并且可以大大降低复杂性),Reliable Services 模型支持更多的场景和需求并且可以真正补充您的Actor(而不是试图让 Actor 做一些他们不是真正为之设计的事情)。
在我看来,您应该在具有内部内存队列的后台线程中直接从您的 actor 调用事件中心。您应该聚合消息并使用 SendBatch 来提高性能。
事件中心可以自己接收负载。
我有一个应用程序,可以将物理世界的设备映射到 Reliable Actors in Azure Fabric。每次从设备收到消息时,我都想将消息推送到事件中心。
我现在正在做的是 creating/using/closing 每条消息的 EventHubClient 对象。
这非常低效(大约需要 1500 毫秒),但它解决了我过去在内存中保存 EventHubClient 时遇到的问题。当我有很多设备时,底层虚拟机可以快速 运行 断开网络连接。
我正在考虑创建一个新的参与者,负责将数据推送到 EventHub(通过使 EventHubClient 保持活动状态)。由于 Reliable Actors 的基于转向的并发模型,我不确定这是个好主意。如果我有 10 000 个设备推送数据 "at the same time",它们的每个 actor 都会阻止将消息推送到将消息推送到 EventHub 的新 actor。
对于这种情况,推荐的方法是什么? 谢谢,
您可以在此处使用 pub/sub 模式(使用 BrokerService
)。
通过将事件发布与事件处理解耦,您无需担心基于回合的并发模型。
出版商:
Actor 通过简单地 publishing 将消息发送到 BrokerService
。
订阅者
然后您使用一个或多个 Stateless Services or (different) Actors 作为事件的订阅者。 他们会按照自己的节奏将它们发送到 EventHub。
事件中心客户端
使用这种方法,您可以完全控制 EventHubClient
实例计数和生命周期。
您可以通过简单地添加更多订阅者来提高事件处理能力。
一种方法是创建负责将消息推送到 EventHub 的无状态服务。每次 Actor 从设备接收到消息(顺便说一句,他们如何与 Actor 通信?)时,Actor 调用无状态服务。反过来,无状态服务将负责为每个服务创建、维护和处理一个 EventHubClient。在处理传入消息时,Reliable Service 不会引入与 Reliable Actor 相同的 'overhead'。如果对于您的应用程序而言,消息以与它们生成时严格相同的顺序到达 EventHub 很重要,那么您将必须使用有状态服务和可靠队列来做到这一点。 (请注意,另一方面,不能保证 Actor 能够以与生成消息相同的顺序完成处理传入消息)
然后您可以通过试验 instance count
(https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-availability-services) 来微调解决方案,以确保您有足够的实例来处理传入消息的吞吐量。多少个实例大致取决于节点数和每个节点的核心数,尽管其他因素也可能影响。
Actors
通信,Actors
又与 Service
通信(如果您想排队消息,可以是无状态或有状态的,见下文),每个服务管理一个 EventHubClient
可以将消息推送到 EventHub
.
如果您的集群无法支持足够高的此服务的实例计数(稍微简化:更多实例 = 更高的吞吐量),那么您可能需要将其创建为有状态服务并将消息放入服务中的可靠队列,然后让服务按顺序处理队列的 RunAsync
。这可能会承受性能峰值的压力。
Service Fabric Azure-Samples WordCount 展示了如何使用不同的分区来使来自 Actors 的消息针对不同的实例(或真正的分区)。
一个一般的提示是不要尝试将 Actors 用于所有事情(但对于正确的事情它们很棒并且可以大大降低复杂性),Reliable Services 模型支持更多的场景和需求并且可以真正补充您的Actor(而不是试图让 Actor 做一些他们不是真正为之设计的事情)。
在我看来,您应该在具有内部内存队列的后台线程中直接从您的 actor 调用事件中心。您应该聚合消息并使用 SendBatch 来提高性能。
事件中心可以自己接收负载。