从其他参与者接收事件的 Service Fabric 参与者

Service Fabric actors that receive events from other actors

我正在尝试为新闻 post 建模,其中包含有关 post 编辑它的用户的信息。我认为最好的方法是将用户摘要信息与消息一起发送以创建新闻 post,但我有点困惑如果基础用户信息发生变化,如何更新该摘要信息。现在我有以下 NewsPostActorUserActor

public interface INewsPostActor : IActor
{
    Task SetInfoAndCommitAsync(NewsPostSummary summary, UserSummary postedBy);

    Task AddCommentAsync(string content, UserSummary, postedBy);
}

public interface IUserActor : IActor, IActorEventPublisher<IUserActorEvents>
{
    Task UpdateAsync(UserSummary summary);
}

public interface IUserActorEvents : IActorEvents
{
    void UserInfoChanged();
}

我遇到困难的地方是如何让 INewsPostActor 实现订阅 IUserActor 发布的事件。我在 https://github.com/Azure/servicefabric-samples/blob/master/samples/Actors/VS2015/VoiceMailBoxAdvanced/VoicemailBoxAdvanced.Client/Program.cs#L45 的示例代码中看到了 SubscribeAsync 方法,但是在 NewsPostActor 实现中使用它是否合适?这会因为任何原因让演员活着吗?

此外,我可以向新闻 post 添加评论,那么 NewsPostActor 是否也应该为每个发表评论的唯一用户保留对每个 IUserActor 的订阅?

事件可能不是您想要为此使用的。来自事件文档 (https://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-events/)

Actor events provide a way to send best effort notifications from the Actor to the clients. Actor events are designed for Actor-Client communication and should NOT be used for Actor-to-Actor communication.

值得考虑直接通知相关参与者,或者有一个 actor/service 来管理此通信。

Service Fabric Actors 尚不支持 Publish/Subscribe 架构。 (有关当前状态,请参阅 Azure Feedback topic。)

正如 charisk 已经回答的那样,Actor-Events 也不是可行的方法,因为它们没有任何交付保证。

这意味着,UserActor必须在名称更改时发起请求。我可以想到多种选择:

  • 在 IUserAccount.ChangeNameAsync() 中,您可以直接向所有 NewsPostActor 发送请求(假设 UserAccount 拥有他的帖子列表)。但是,这会引入额外的延迟,因为客户端必须等到所有帖子都已更新。

  • 您可以异步发送请求。一种简单的方法是在 ChangeNameAsync() 中将您的 Actor 状态的 "NameChanged"-属性 设置为 true,并有一个定期检查此 属性 的计时器。如果为真,它会向所有 NewsPostActor 发送请求,然后将 属性 设置为假。这将是对以前版本的改进,但它仍然暗示着 UserAccounts 和 NewsPosts 之间的紧密联系。

  • 一种更具扩展性的解决方案是引入 "Message Router" 模式。您可以在 Vaughn Vernon's excellent book "Reactive Messaging Patterns with the Actor Model" 中阅读有关此模式的更多信息。通过这种方式,您基本上可以通过向路由器发送 "NameChanged"-Message 来设置自己的 Pub/Sub 模型。 NewsPostActors 可以——根据您的可伸缩性需求——直接或通过某种间接方式(可能是 NewsPostCoordinator)订阅该消息。此外,根据您的可扩展性需求,路由器可以直接或异步转发消息(首先将其存储在队列中)。