Architecture 共享事件总线btw客户端应用程序和服务器参与者

Architecture 共享事件总线btw客户端应用程序和服务器参与者,architecture,client-server,communication,actor,vert.x,Architecture,Client Server,Communication,Actor,Vert.x,将事件直接从客户端推送到服务器端垂直站点有哪些优点/缺点?换句话说,在客户端应用程序和服务器参与者之间共享事件总线有什么好处 正如您所知,有一个事件循环促使您使用类似smth的参与者模型。独立的参与者(垂直者)可以在计算机的帮助下相互交流 通用方法 好的,安排客户机-服务器通信的常见方法是使用下一种方案: 公开将接受客户端请求的web服务(路由器) Web服务向verticle/actor发送事件 Verticle/actor进行计算并返回结果 Web服务获取计算结果并将其发送回客户端 Ver

将事件直接从客户端推送到服务器端垂直站点有哪些优点/缺点?换句话说,在客户端应用程序和服务器参与者之间共享事件总线有什么好处


正如您所知,有一个事件循环促使您使用类似smth的参与者模型。独立的参与者(垂直者)可以在计算机的帮助下相互交流

通用方法 好的,安排客户机-服务器通信的常见方法是使用下一种方案:

  • 公开将接受客户端请求的web服务(路由器)
  • Web服务向verticle/actor发送事件
  • Verticle/actor进行计算并返回结果
  • Web服务获取计算结果并将其发送回客户端
  • Vert.x事件总线桥引道 让我感到困惑的是,客户端Javascript可以直接与服务器端的每个参与者/垂直体通信:

  • 客户端在浏览器中初始化事件总线
    const eb=new EventBus('http://localhost:8080/eventbus)
  • 客户端直接向特定服务器端参与者发送事件
    eb.send('some-address',{name:'tim',年龄:587})
  • 客户端接收来自特定服务器端参与者的应答
    eb.registerHandler('some-address',(错误,消息)=>{…})
  • 问题
  • 使用直接的客户机参与者沟通而不是传统沟通有什么好处
  • 那么安全呢?现在每个垂直点都应该安全了
  • 那么代码的简单性呢?从一方面来说,事情变得容易了一点,但你已经没有了任何单一的切入点。这种新方法是否适用于具有复杂后端的不平凡的应用程序
  • 你推荐哪一个

  • 首先,这取决于——一如既往。异步和非阻塞通信更为重要。呼叫方未被阻塞,通信松散耦合。使用事件总线,您还可以从发布/订阅通信(和其他消息传递模式)中获益。V.Vernon提供了一本关于反应式消息传递模式和参与者模型的好书

    关于安全问题,你只会。Vert.x调用这些。这样,您就不需要“保护”每个垂直站点,因为客户端无法直接访问它们

    如果您有“实时”用例,即需要在不按重新加载的情况下尽快通知客户端,那么我将使用事件总线通信(例如聊天等)。但谁说你只能做一件事?您可以通过事件总线通知重要的更改(没有数据),并让客户端通过简单的web服务端点检索更改的数据

    关于Actor模型的更多见解,我建议阅读《七个并发模型七周》一书

    编辑普通WebSocket与事件总线桥:

    Vert.xWeb附带了一个。它将Web客户端与Vert.x事件总线集成。SockJS甚至可以通过长轮询等技术在旧浏览器中实现类似WebSocket的通信:

    UndertheHood SockJS首先尝试使用原生WebSocket。如果 它可以使用各种特定于浏览器的传输协议和 通过类似WebSocket的抽象呈现它们

    Vert.x声明如下:

    像WebSocket一样的界面,可以正常工作


    因此,基本上Vert.x事件总线桥使用WebSocket(如果它在客户端浏览器中可用)。因此,我更喜欢事件总线桥而不是自己的WebSocket实现。

    编辑了我的答案。我建议对所有非notify的东西使用普通HTTP调用,对“实时”的东西使用事件总线桥。类似的框架,如SockJS和。更准确地说:我不是说WebSocket和桥不是互斥的。我的意思是,普通HTTP调用和网桥/WebSocket并不是相互排斥的。我不想说我更喜欢它,但我喜欢RESTAPI,因为它们即使在带有
    cURL
    等工具的终端中也很容易使用。正如我所说的,这取决于用例。请求/响应上类似事件的东西不会很好地工作,因此您需要消息传递WebSocket或事件总线。使用消息传递,您可以使用推送原则,使用请求/响应,您可以使用拉送原则。但是,您可以通过消息传递通知。如果客户机真的想要获取新数据,只需向REST端点发送一个普通的旧HTTP请求并获取数据。在少数事件和大量数据的情况下,这种方法更可取。如果有多个事件但数据很少,请将数据包含在事件中。