4

我正在尝试对包含有关发布它的用户的信息的新闻帖子进行建模。我认为最好的方法是将用户摘要信息与消息一起发送以创建新闻帖子,但是如果基础用户信息发生更改,我有点困惑如何更新该摘要信息。现在我有以下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#L45SubscribeAsync的示例代码中看到了该方法,但它是否合适在实现中使用它?这会让演员以任何理由活着吗?NewsPostActor

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

4

2 回答 2

3

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

Actor 事件提供了一种从 Actor 向客户端发送尽力而为通知的方法。Actor 事件是为 Actor-Client 通信设计的,不应用于 Actor-to-Actor 通信。

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

于 2015-10-01T10:12:59.450 回答
2

Service Fabric Actor 尚不支持发布/订阅体系结构。(有关当前状态,请参阅Azure 反馈主题。)

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

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

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

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

  • 一个更具可扩展性的解决方案是引入“消息路由器”模式。您可以在Vaughn Vernon 的优秀著作《Reactive Messaging Patterns with the Actor Model》中阅读更多关于此模式的信息。这样,您基本上可以通过向路由器发送“NameChanged”消息来设置自己的 Pub/Sub 模型。NewsPostActor 可以 - 根据您的可扩展性需求 - 直接或通过某种间接方式(可能是 NewsPostCoordinator)订阅该消息。并且还取决于您的可扩展性需求,路由器可以直接或异步转发消息(首先将其存储在队列中)。

于 2015-10-25T19:12:43.127 回答