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

标签 azure nservicebus esb servicebus

我刚刚开始阅读有关服务总线体系结构的很多文章,并更加仔细地研究了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中发生的操作有关的消息。然后,工作流程可以进行:
  • 客户端进入聊天室(客户端向客户端服务发送命令)
  • ClientService将信息添加到Client对象并更新(持久性)
  • ClientService将命令发送到ChatroomService,以更新与相应聊天室关联的客户端列表。 (命令)
  • 聊天室服务更新预订客户端的列表(持久性)
  • 另一个客户端在聊天室中创建一个Post。 (客户端将命令发送到ClientService)
  • ClientService使用新的Post和创建它的客户端的ID,以及发送给(命令)
  • 的聊天室的ID将命令发送到ChatroomService。
  • ChatroomService将Post添加到相应聊天室中的Posts列表中(持久性)
  • ChatroomService为列表中的所有其他客户端生成事件,该事件订阅了相应的聊天室(发布)
  • ClientService处理ChatroomService引发的事件,并将Post分发给其他订阅的客户端。 (订阅)

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

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

    注意:将text message的所有引用更改为Post,以便在NServiceBus中的chat messageIMessage之间没有歧义。我一直在故意使用术语commandevent。在NServiceBus中,ICommand是只能发送到1个端点的消息类型,而IEvent是可以由许多端点发布和订阅的消息类型。

    如果示例不清楚,我们深表歉意。我要传达的是,您可以存储ClientChatroom之间的关系,以便当Chatroom获得新的Post时,它只能分配给与其相关的Client。假设您有一个聊天室CR和3个客户端ABC都在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创建一个PostCR,这是使用从客户端到API的HTTP调用来实现的。该API是作为ClientService的NServiceBus服务的一部分。 API调用将创建一个Post,其中包含文本,A.IdCR.Id
  • ClientService使用刚创建的NewPostCommandChatroomService发送到Post
  • ChatroomService接收NewPostCommand并将其传递给适当的处理程序。
  • 处理程序使用Chatroom上的ChatroomId在数据库中搜索相应的Post(CR)。新的Post被添加到CR.Posts并更新数据库。
  • 处理程序从CR.Clients获取Post.ClientId减去CR的列表(产生BC)。
  • 处理程序发布一个新的NewChatroomPostEvent,其中包含PostChatroomSubscribers
  • ClientService订阅NewChatroomPostEvent,接收消息并将其传递给适当的处理程序。
  • ClientService具有与客户端通信的所有功能(使用Client.Info),并将新的Post发送到NewChatroomPostEvent.Subscribers列表中的每个客户端(BC)。

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

    关于azure - 支持多个虚拟聊天室(例如,使用NServiceBus),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032522/

    相关文章:

    azure - 使用标准 LRS 存储类调整 AKS 中的 PV/PVC 大小后,Artifactory > 监控 > 存储部分仍然显示旧的存储空间。怎么修?

    nservicebus sagas - 试图理解目的和好处

    grails - 如何使用 Grails 发送持久消息?

    java - wso2 碳工作室 : uploading a class mediator to ESB

    wso2 - 如何在 wso2 esb/中创建类中介

    Azure 应用服务交换任务受应用服务 IP 白名单阻碍 : Failed to update deployment history

    azure - 如何在 Azure Cosmos DB 更改源中启用完全保真度

    Azure函数构建不生成function.json

    c# - NServiceBus批处理消息

    asp.net-web-api - 测试项目扫描我的 Controller 两次