Pub/sub Azure Service Fabric 中的模式
Pub/sub pattern in Azure Service Fabric
我正在这里开发一个 Azure Service Fabric 应用程序,其中某些参与者需要从其他服务按需接收 pings/hooks。该应用程序是一种事件分发引擎,旨在像这样工作:
- 一个事件路由器参与者,它可以接收一个事件,然后负责将该事件分发给该事件类型的所有订阅者。
- 0..N 事件订阅参与者需要以某种方式通知路由器他们希望订阅什么类型的事件以及他们希望如何传送(同步或异步)。
- 当事件路由器 actor 接收到类型为
MyEvent
的事件时,它将识别订阅者正在侦听的内容以及他们希望如何传递事件。对于异步交付,消息将在 Azure 服务总线主题中弹出。但是对于同步交付,路由器 actor 将直接调用订阅 actor 上的订阅方法,等待他们的响应。
其中大部分内容相当简单,但我不完全确定我将如何实现这些事件的同步传送。我不希望事件路由器 actor 以任何方式知道订阅事件的 actor 中的任何内部结构 - 但是对于当前的 ActorProxy
实现和类似的,需要访问接口才能调用其他方法演员。
假设我订阅了一个事件类型,通知事件路由器我的地址是 fabric:/MyApp/MyEventSubscriberActor
并且我想订阅 MyEvent
。在 Service Fabric API 中是否有任何明智的方法我可以在不使用 OnEventAsync(MyEvent ev)
的情况下以编程方式调用该参与者的方法(例如 OnEventAsync(MyEvent ev)
使用 ActorProxy.Create<IMyEventSubscriberActor>()
方法?这些 API 的源代码似乎没有公开可用,所以我没有直接的方法来检查这是如何在幕后完成的。
事件订阅 actor 可以实现包含 "event-available" 方法的事件订阅接口。它可以将该接口传递给事件路由器参与者接口上的 "subscribe-to-event" 方法。
事件路由器参与者接口可以保留对订阅接口的引用作为其状态的一部分。当订阅者感兴趣的事件发生时,它可以调用它先前接收并保存的接口上的 "event-available" 方法。所有这一切都可以在不显式创建一个 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();
}
}
我正在这里开发一个 Azure Service Fabric 应用程序,其中某些参与者需要从其他服务按需接收 pings/hooks。该应用程序是一种事件分发引擎,旨在像这样工作:
- 一个事件路由器参与者,它可以接收一个事件,然后负责将该事件分发给该事件类型的所有订阅者。
- 0..N 事件订阅参与者需要以某种方式通知路由器他们希望订阅什么类型的事件以及他们希望如何传送(同步或异步)。
- 当事件路由器 actor 接收到类型为
MyEvent
的事件时,它将识别订阅者正在侦听的内容以及他们希望如何传递事件。对于异步交付,消息将在 Azure 服务总线主题中弹出。但是对于同步交付,路由器 actor 将直接调用订阅 actor 上的订阅方法,等待他们的响应。
其中大部分内容相当简单,但我不完全确定我将如何实现这些事件的同步传送。我不希望事件路由器 actor 以任何方式知道订阅事件的 actor 中的任何内部结构 - 但是对于当前的 ActorProxy
实现和类似的,需要访问接口才能调用其他方法演员。
假设我订阅了一个事件类型,通知事件路由器我的地址是 fabric:/MyApp/MyEventSubscriberActor
并且我想订阅 MyEvent
。在 Service Fabric API 中是否有任何明智的方法我可以在不使用 OnEventAsync(MyEvent ev)
的情况下以编程方式调用该参与者的方法(例如 OnEventAsync(MyEvent ev)
使用 ActorProxy.Create<IMyEventSubscriberActor>()
方法?这些 API 的源代码似乎没有公开可用,所以我没有直接的方法来检查这是如何在幕后完成的。
事件订阅 actor 可以实现包含 "event-available" 方法的事件订阅接口。它可以将该接口传递给事件路由器参与者接口上的 "subscribe-to-event" 方法。
事件路由器参与者接口可以保留对订阅接口的引用作为其状态的一部分。当订阅者感兴趣的事件发生时,它可以调用它先前接收并保存的接口上的 "event-available" 方法。所有这一切都可以在不显式创建一个 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();
}
}