Azure Service Fabric中的发布/订阅模式

Tro*_*eim 18 azure-service-fabric

我正在开发Azure Service Fabric应用程序,我需要某些演员需要从其他服务接收ping/hook.该应用程序是一种事件分发引擎,旨在这样的工作:

  • 一个事件路由器actor,可以接收事件,然后负责将该事件分发给该事件类型的所有订户.
  • 0..N事件订阅参与者以某种方式需要通知路由器他们希望订阅哪些类型的事件以及他们希望如何传递(同步或异步).
  • 当事件路由器actor接收到该类型的事件时MyEvent,它将识别哪些订阅者正在收听以及他们希望如何传递该事件.对于异步传递,将在Azure Service Bus主题中弹出一条消息.但是对于同步传递,路由器actor将直接在订阅actor上调用订阅方法,等待它们的响应.

其中大部分都是相当直接的,但我不完全确定我将如何实现这些事件的同步传递.我不希望事件路由器actor以任何方式知道订阅事件的actor中的任何内部 - 但是对于当前的ActorProxy实现和类似,需要访问接口才能调用其他actor上的方法.

假设我订阅了一个事件类型,通知事件路由器我的地址是fabric:/MyApp/MyEventSubscriberActor我想要订阅的MyEvent.在Service Fabric API中是否有任何合理的方法我可以编程方式调用该actor上的方法(例如OnEventAsync(MyEvent ev)使用ActorProxy.Create<IMyEventSubscriberActor>()方法?这些API的源代码似乎不公开,所以我没有直接的检查方法如何在引擎盖下完成.

Abh*_*SFT 27

事件订阅者可以实现包含"事件可用"方法的事件订阅接口.它可以将该接口传递给事件路由器actor接口上的"subscribe-to-event"方法.

事件路由器actor接口可以将订阅接口的引用作为其状态的一部分.当订户感兴趣的事件发生时,它可以在之前收到并保存的接口上调用"事件可用"方法.所有这一切都可以在没有显式创建一个actor代理与事件订阅actor进行通信的情况下完成(actor序列化基础设施在幕后进行).

这是一个非常基本的例子,它省略了事件类型,只假设一个订阅者等,但应该让你了解这种技术.

接口:

interface IEventRouter : IActor
{
    void Subscribe(IEventSubscriber subscriber);
}

interface IEventSubscriber : IActor
{
    void EventAvailable();
}
Run Code Online (Sandbox Code Playgroud)

活动订户代码:

class EventSubscriber : Actor, IEventSubscriber
{
    void SubscribeToEvent()
    {
        IEventRouter router = ActorProxy.Create<IEventRouter>("fabric:/MyApp/MyEventRouterActor");
        router.Subscribe(this);
    }

    public void EventAvailable()
    {
        // Process the event
    }
}
Run Code Online (Sandbox Code Playgroud)

事件路由器代码:

// 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();
    }
}       
Run Code Online (Sandbox Code Playgroud)

  • 了解序列化基础结构处理接口到actor的代理映射非常有用.谢谢!这使得这种情况*比我担心的要容易得多. (7认同)
  • 对于pub/sub引擎/框架,您可以使用此nuget包ServiceFabric.PubSubActors.代码在github中可用:https://github.com/loekd/ServiceFabric.PubSubActors (2认同)