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

Share event bus btw client app and server actors

什么是pros/cons通过Event Bus Bridge将事件直接从客户端推送到服务器端verticle?换句话说,在客户端应用程序和服务器参与者之间共享事件总线有什么好处?


如你所知Vert.x is an event-loop that urge you to use smth like actors model. Separate actors (verticles) could communicate among each other with help of EventBus

常用方法

据我所知,安排客户端-服务器通信的常用方法是使用下一个方案:

  1. 公开将接受来自客户端的请求的网络服务(路由器)
  2. Web 服务将事件发送到 verticle/actor。
  3. Verticle/actor 进行计算并 return 结果
  4. Web 服务获取计算结果并将其发送回客户端

Vert.x 事件总线桥方法

让我纠结的是客户端 Javascript 可以直接与服务器端的每个 actor/verticle 通信:

  1. 客户端在浏览器中初始化事件总线 const eb = new EventBus('http://localhost:8080/eventbus')
  2. 客户端直接将事件发送到特定的服务器端参与者 eb.send('some-address', {name: 'tim', age: 587});
  3. 客户端收到来自特定服务器端参与者的回答 eb.registerHandler('some-address', (error, message) => { ... })

问题

  1. 使用直接的客户-参与者沟通代替传统沟通有什么好处?
  2. 安全性如何?现在每个 Verticle 都应该是安全的了吗?
  3. 代码简单性如何?从一方面来看,事情变得更容易了一些,但是您再也没有单一的入口点了。对于具有复杂后端的重要应用程序,这种新方法是否可以接受?
  4. 你会推荐哪一个?

首先,这取决于——一如既往。异步和非阻塞通信更多resilient than synchronous communication。调用者未被阻塞,通信松散耦合。使用事件总线,您还可以从 pub/sub 通信(和其他消息传递模式)中获益。 V. Vernon 提供了一本关于 Reactive Messaging Patterns with the Actor Model 的好书。

关于安全,你只会allow some queues to be available for clients. Vert.x calls these inbound and outbound addresses。比起您不需要“保护”每个 Verticle,因为客户端无法直接访问它们。

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

有关 Actor 模型的更多见解,我建议阅读 Concurrency Programming for Scalable Web Architectures 或《七周七个并发模型》一书。

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

Vert.x Web 带有一个 Event Bus Bridge based on SockJS。它将 Web 客户端与 Vert.x 事件总线集成。 SockJS 甚至可以通过长轮询等技术在旧版浏览器中启用类似 WebSocket 的通信:

Under the hood SockJS tries to use native WebSockets first. If that fails it can use a variety of browser-specific transport protocols and presents them through WebSocket-like abstractions.

Vert.x 声明为:

WebSocket-like interface which just works.

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