接收来自其他角色的事件的Service Fabric角色

时间:2015-09-30 17:50:58

标签: azure actor azure-service-fabric

我正在尝试对包含发布它的用户信息的新闻帖子进行建模。我认为最好的方法是发送用户摘要信息和消息以创建新闻帖,但是如果基础用户信息发生变化,我有点困惑如何更新摘要信息。现在我有以下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实现中使用它是否合适?会不会因为某种原因让一个演员活着?

此外,我可以在新闻帖子中添加评论,那么NewsPostActor是否还要为每个评论的唯一用户保留每个IUserActor的订阅?

2 个答案:

答案 0 :(得分:2)

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

  

Actor事件提供了一种从中发送尽力通知的方法   演员给客户。 Actor活动是为Actor-Client设计的   沟通,不应该用于演员与演员的沟通。

值得考虑直接通知相关参与者或拥有管理此沟通的演员/服务。

答案 1 :(得分:1)

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

正如charisk已经回答的那样,演员活动也不是可行的方式,因为他们没有任何交付保证。

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

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

  • 您可以异步发送请求。一种简单的方法是在ChangeNameAsync()中将Actor状态的“NameChanged”属性设置为true,并让Timer定期检查此属性。如果为true,它会向所有NewsPostActors发送请求,然后将该属性设置为false。这将是对以前版本的改进,但它仍然意味着UserAccounts和NewsPosts之间存在非常强大的联系。

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