通过Event Bus Bridge将事件从客户端直接推送到服务器端Verticle的优缺点是什么?换句话说,在客户端应用程序和服务器角色之间共享事件总线有什么好处?
如你所知Vert.x是一个事件循环,它促使你像演员模型一样使用smth。在EventBus的帮助下,单独的演员(Verticle)可以相互通信。
AFAIK,安排客户端 - 服务器通信的常用方法是使用下一个方案:
让我感到困惑的是,客户端Javascript可以直接与服务器端的每个actor / Verticle进行通信:
const eb = new EventBus('http://localhost:8080/eventbus')
eb.send('some-address', {name: 'tim', age: 587});
eb.registerHandler('some-address', (error, message) => { ... })
答案 0 :(得分:2)
首先,它取决于 - 一如既往。异步和非阻塞通信更resilient than synchronous communication。呼叫者没有被阻止,通信松散耦合。使用事件总线,您还可以从发布/订阅通信(以及其他消息传递模式)中受益。有一本关于反应性消息传递模式的好书,可以使用V. Vernon的Actor模型。
关于安全性,您只需allow some queues to be available for clients。 Vert.x调用这些inbound and outbound addresses。您不需要“保护”每个Verticle,因为客户端无法直接访问它们。
如果你有“实时”用例,从某种意义上说,客户需要尽快通知,而不是按重新加载,而不是我会使用事件总线通信(例如聊天等)。但谁说你只能做一件事?您可以通过事件总线通知重要的更改(没有数据),并让客户端通过简单的&简单的Web服务端点。
有关Actor模型的更多见解,我建议阅读Concurrency Programming for Scalable Web Architectures或七周内的Seven Concurrency Models一书。
编辑Plain WebSocket与事件总线桥:
Vert.x网络附带Event Bus Bridge based on SockJS。它将Web客户端与Vert.x事件总线集成在一起。 SockJS甚至可以通过长轮询等技术在旧浏览器中实现类似WebSocket的通信:
引擎盖下SockJS首先尝试使用本机WebSockets。如果说 失败,它可以使用各种浏览器特定的传输协议和 通过类似WebSocket的抽象来呈现它们。
Vert.x声明如下:
类似WebSocket的界面。
因此,如果Vert.x事件总线桥在客户端浏览器中可用,它基本上使用WebSocket。因此,我更喜欢事件总线桥,而不是自己的WebSocket实现。