我正在开发Azure Service Fabric应用程序,我需要某些演员需要从其他服务接收ping / hook。该应用程序是一种事件分发引擎,旨在实现以下目的:
MyEvent
的事件时,它将识别订阅者正在收听的内容以及他们希望如何传递事件。对于异步传递,将在Azure Service Bus主题中弹出一条消息。对于同步传递,路由器actor将直接调用订阅actor上的订阅方法,等待他们的响应。大部分内容相当直接,但我不完全确定如何实现这些事件的同步传递。我不希望事件路由器actor以任何方式知道订阅事件的actor中的任何内部 - 但是使用当前的ActorProxy
实现等,需要访问接口才能调用其他方法演员。
假设我订阅了一个事件类型,通知事件路由器我的地址是fabric:/MyApp/MyEventSubscriberActor
,并且我想订阅MyEvent
。在Service Fabric API中是否有任何明智的方法我可以在没有(例如OnEventAsync(MyEvent ev)
使用ActorProxy.Create<IMyEventSubscriberActor>()
方法的情况下以编程方式调用该方法的方法?这些API的源代码似乎不是公开的可用,所以我没有直接的方法来检查如何在引擎盖下完成。
答案 0 :(得分:27)
事件订阅参与者可以实现包含“事件可用”方法的事件订阅接口。它可以将该接口传递给事件路由器actor接口上的“subscribe-to-event”方法。
事件路由器actor接口可以将订阅接口的引用作为其状态的一部分。当订户感兴趣的事件发生时,它可以在之前收到并保存的接口上调用“事件可用”方法。所有这一切都可以在没有显式创建一个actor代理与事件订阅actor进行通信的情况下完成(actor序列化基础设施在幕后进行)。
这是一个非常基本的例子,它省略了事件类型,只假设一个订阅者等,但应该让你了解这种技术。
接口:
interface IEventRouter : IActor
{
void Subscribe(IEventSubscriber subscriber);
}
interface IEventSubscriber : IActor
{
void EventAvailable();
}
活动订阅者代码:
class EventSubscriber : Actor, IEventSubscriber
{
void SubscribeToEvent()
{
IEventRouter router = ActorProxy.Create<IEventRouter>("fabric:/MyApp/MyEventRouterActor");
router.Subscribe(this);
}
public void EventAvailable()
{
// Process the event
}
}
事件路由器代码:
// Define actor state
[DataContract]
class RouterState
{
[DataMember]
public IEventSubscriber Subscriber;
}
// Define actor
class EventRouter : Actor<RouterState>, IEventRouter
{
public void Subscribe(IEventSubscriber subscriber)
{
this.State.Subscriber = subscriber;
}
void OnEventAvailable()
{
this.State.Subscriber.EventAvailable();
}
}