支持多个虚拟聊天室(例如使用NServiceBus)

age*_*ris 2 esb nservicebus servicebus azure

我刚刚开始阅读很多关于服务总线架构的内容,并且更密切地关注NServiceBus框架.我并没有真正了解如何设计多个私有上下文,其中一组客户端对同一消息的副本感兴趣(例如聊天室应用程序).

服务总线应该只存在一次,还是我会为每个虚拟聊天室创建多个服务总线实例,并为每个感兴趣的客户端订阅消息处理程序实例?

它是否与我在Azure上下文中已经阅读过的主题和订阅概念有关?

Lar*_*rry 5

服务总线应该只存在一次,还是我会为每个虚拟聊天室创建多个服务总线实例,并为每个感兴趣的客户端订阅消息处理程序实例?

使用NServiceBus时,您将为您创建的每个端点配置总线.您可以将端点视为处理某些消息的服务.端点不是动态的,它们需要指定名称,以便可以将其他端点配置为向其发送消息或从中接收消息.

这取决于你的系统的要求是什么,但我假设虚拟聊天室是你可以动态生成和/或当它不再使用时删除的东西.

它是否与我在Azure上下文中已经阅读过的主题和订阅概念有关?

NServiceBus和Azure Service Bus都提供了执行pub/sub的基础结构.

我真的不知道如何设计多个私有上下文,其中一组客户端对同一消息的副本感兴趣

多个私人环境究竟是什么意思?我理解你的问题是如何在客户和聊天室之间建立关系.描述中缺少的部分是持久性,即存储客户端和聊天室之间的关系.

使用NServiceBus作为示例,您可以使用ClientService来处理有关客户端执行的任何操作的消息,以及处理有关Chatroom中发生的操作的消息的ChatroomService.然后工作流程可以:

  1. 客户端进入聊天室(客户端向客户端服务发送命令)
  2. ClientService向Client对象添加信息并对其进行更新(持久性)
  3. ClientService向ChatroomService发送命令以更新与相应聊天室关联的客户端列表.(命令)
  4. 聊天室服务更新订阅客户端列表(持久性)
  5. 另一个客户Post在聊天室中创建了一个.(客户端向ClientService发送命令)
  6. ClientService向ChatroomService发送命令,其中包含Post创建它的客户端的新ID和ID,以及发送给它的聊天室的ID(命令)
  7. ChatroomService添加PostPosts相应聊天室中的列表(持久性)
  8. ChatroomService为订阅相应聊天室的列表中的所有其他客户端生成事件(发布)
  9. ClientService处理ChatroomService引发的事件,并将其分Post发给其他订阅的客户端.(订阅)

我实际上并没有创建一个聊天室应用程序,因此这可能不是您想法的最佳设计,但它提供了一种描述如何使用NServiceBus创建应用程序的方法.您可以使用端点设置服务,以处理与系统中的对象相对应的消息.使用此设计或类似设计,您可以分离关注点,并根据每个对象类型必须处理的流量,根据需要扩展服务.

编辑以根据评论中的问题添加更具体的示例

注:改变所有引用text message,以Post使那里有间没有歧义chat message,并IMessage在NServiceBus.我一直在使用条款commandevent故意.在NServiceBus中,ICommand是一种只能发送到1个端点IEvent的消息,而是一种可以由许多端点发布和订阅的消息.

如果示例不清楚,请道歉.我试图传达的是你可以存储Clients和Chatrooms 之间的关系,这样当Chatroom一个新的时候Post,它就可以只分发给Client与之相关的s.假设你有一个聊天室CR和3个客户端A,B以及C是全部CR.另外,假设我们有以下类:

class Chatroom
{
    Guid Id { get; set; }
    List<Client> Subscribers { get; set; }
    List<Posts> Posts { get; set; }
}


class Client
{
    Guid Id { get; set; }
    List<Chatroom> Chatrooms { get; set; }
    ConnectionInfo Info { get; set; }
}

class Post
{
    Guid Id { get; set; }
    Guid ClientId { get; set; }
    Guid ChatroomId { get; set; }
    string Text { get; set; } 
}

class NewPostCommand : ICommand
{
    Post NewPost { get; set; }
}

class NewChatroomPostEvent : IEvent
{
    Post NewPost { get; set; }
    Chatroom Chatroom { get; set; }
    List<Client> Subscribers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  1. A创建一个Postto CR,这是使用从客户端到API的HTTP调用实现的.API是用作ClientService的NServiceBus服务的一部分.API调用创建一个Post包含文本的文本A.Id,和CR.Id.
  2. ClientService 使用刚刚创建的NewPostCommandto 发送to .ChatroomServicePost
  3. ChatroomService接收NewPostCommand并将其传递给适当的处理程序.
  4. 处理程序Chatroom使用ChatroomIdon来搜索数据库中的相应(CR)Post.新Post增加到CR.Posts并更新数据库.
  5. 处理程序从(得到和)中获取CR.Clients减号列表.Post.ClientIdCRBC
  6. 处理器发布一个新的NewChatroomPostEvent包含Post,ChatroomSubscribers.
  7. ClientService订阅NewChatroomPostEvent,接收消息并将其传递给approriate处理程序.
  8. ClientService具有与客户端(使用Client.Info)通信的所有功能,并将新内容发送PostNewChatroomPostEvent.Subscribers列表中的每个客户端(BC).

现在我们已经浏览了新帖子的消息流,您可以想象如何处理从每个聊天室添加和删除订阅者的方法.客户端在进入或离开聊天室时会向HTTP API发送消息,ClientService会向ChatroomService发送消息,该消息将更新相应的Chatroom.Subscribers列表.希望这能说明您在新帖到达时如何控制哪些客户端发送更新.