我正在尝试对包含发布它的用户信息的新闻帖子进行建模。我认为最好的方法是发送用户摘要信息和消息以创建新闻帖,但是如果基础用户信息发生变化,我有点困惑如何更新摘要信息。现在我有以下NewsPostActor
和UserActor
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
的订阅?
答案 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)订阅该消息。此外,根据您的可扩展性需求,路由器可以直接或异步转发消息(首先将其存储在队列中)。