我刚刚开始阅读有关服务总线体系结构的很多文章,并更加仔细地研究了NServiceBus框架。对于如何设计多个私有(private)上下文(其中一组客户对同一条消息的副本感兴趣)(例如聊天室应用程序),我并没有真正的想法。
服务总线应该只存在一次,还是我将创建多个服务总线实例,每个虚拟聊天室一个,并为每个感兴趣的客户端订阅一个消息处理程序实例?
它与主题和订阅的概念有关吗?我已经在Azure上下文中阅读了这些主题和订阅?
最佳答案
Is the service bus supposed to exist only once or would I create multiple service bus instances, one for each virtual chatroom, and subscribe a message handler instance for each interested client?
使用NServiceBus时,将为您创建的每个endpoint配置一个总线。您可以将端点视为处理某些消息的服务。端点不是动态的,它们需要指定一个名称,以便可以配置其他端点向它们发送消息或从中接收消息。
这取决于系统的要求,但我假设虚拟聊天室是可以动态生成和/或在不再使用时删除的东西。
Does it have something to do with the concept of topics and subscribes which I already read about in the context of Azure?
NServiceBus和Azure Service Bus都提供了执行发布/订阅的基础结构。
I am not really getting an idea on how to design multiple private contexts where a set of clients are interested in the copies of the same message
您所说的多个私有(private)环境到底是什么意思?我正在理解您的问题,即如何在客户端和聊天室之间建立关系。您的描述中缺少的部分是持久性,即存储客户端和聊天室之间的关系。
以NServiceBus为例,您可以拥有一个ClientService处理与客户端执行的任何操作有关的消息,以及一个ChatroomService处理与在Chatroom中发生的操作有关的消息。然后,工作流程可以进行:
Post
。 (客户端将命令发送到ClientService)Post
和创建它的客户端的ID,以及发送给(命令)Post
添加到相应聊天室中的Posts
列表中(持久性)Post
分发给其他订阅的客户端。 (订阅)我实际上尚未创建聊天室应用程序,因此,这可能不是您的最佳选择,但它提供了一种描述如何使用NServiceBus创建应用程序的方法。您可以使用端点来设置服务,这些端点处理与系统中对象相对应的消息。使用这种或类似的设计,您可以将关注点分开,并且可以根据每种对象类型必须处理的流量来按需扩展服务。
编辑以根据评论中的问题添加更具体的示例
注意:将
text message
的所有引用更改为Post
,以便在NServiceBus中的chat message
和IMessage
之间没有歧义。我一直在故意使用术语command
和event
。在NServiceBus中,ICommand
是只能发送到1个端点的消息类型,而IEvent
是可以由许多端点发布和订阅的消息类型。如果示例不清楚,我们深表歉意。我要传达的是,您可以存储
Client
和Chatroom
之间的关系,以便当Chatroom
获得新的Post
时,它只能分配给与其相关的Client
。假设您有一个聊天室CR
和3个客户端A
,B
和C
都在CR
中。另外,可以说我们有以下 class :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; }
}
A
创建一个Post
到CR
,这是使用从客户端到API的HTTP调用来实现的。该API是作为ClientService的NServiceBus服务的一部分。 API调用将创建一个Post
,其中包含文本,A.Id
和CR.Id
。 NewPostCommand
将ChatroomService
发送到Post
。 NewPostCommand
并将其传递给适当的处理程序。 Chatroom
上的ChatroomId
在数据库中搜索相应的Post
(CR)。新的Post
被添加到CR.Posts
并更新数据库。 CR.Clients
获取Post.ClientId
减去CR
的列表(产生B
和C
)。 NewChatroomPostEvent
,其中包含Post
,Chatroom
和Subscribers
。 NewChatroomPostEvent
,接收消息并将其传递给适当的处理程序。 Client.Info
),并将新的Post
发送到NewChatroomPostEvent.Subscribers
列表中的每个客户端(B
和C
)。 现在,我们已经遍历了新帖子的消息流,您可以想象如何处理每个聊天室中的添加和删除订户。客户端在进入或离开聊天室时将向HTTP API发送消息,ClientService将消息向ChatroomService发送,消息将更新相应的
Chatroom.Subscribers
列表。希望这可以阐明您如何控制在新帖子到达时向哪些客户端发送更新。
关于azure - 支持多个虚拟聊天室(例如,使用NServiceBus),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032522/