在VertX中匹配响应处理程序与请求

假设我在1..n个VertX(V)实例前有一个负载均衡器(LB),每个VertX实例都连接到一个队列(Q),并且我有1..m后端(BE)。

用户点击一个按钮发出一个请求,甚至打开一个Web套接字,负载平衡器将请求转发给一个VertX实例,这个实例向队列发出一个请求,其中一个后端消费这个消息并发送一个响应背部; 如果正确的VertX实例使用它,它可以查找响应处理程序并向用户写入响应,如果VertX实例使用错误,则不会有响应处理程序来写入响应,用户将无限期地等待一个回应。

看这个草图:

在这里输入图像描述

或者,V2死亡,负载平衡器将用户重新连接到V1,这意味着即使我可以将它发送回与请求完全相同的用户,也不能保证在响应返回时仍然在那里,但用户可能仍然等待通过另一个VertX实例的响应。

我现在正在做的是为每个新的连接生成一个GUID,然后只要websocket连接,将websocket处理程序存储在对照GUID的hashmap中,然后当BE想要响应时,它将扇出所有1 .. VertX实例,当前在其hashmap中具有正确GUID的实例可以向用户写入响应。 这样处理POST / GET也一样。

伪代码:

queue.handler { q -> q.handler { val handler = someMap.get(q.guid) // only respond if handler exists if (handler != null){ handler.writeResponse(someresponsemessagehere) } } } vertx.createHttpServer().websocketHandler { ws -> val guid = generateGUID() someMap.put(guid, ws) ws.writeFinalTextFrame("guid=${guid}") ws.handler { val guid = extractGuid(it) // send request to BE including generated GUID sendMessageToBE(guid, "blahblah") } }.requestHandler { router.accept(it) }.listen(port) 

但是,这意味着如果我有一个1000个VertX应用程序正在运行,则后端将需要将其消息扇出到1000个前端实例,其中只有一个将使用该消息。

VertX似乎已经很好地处理异步操作了,VertX有没有一种方法来识别每个websocket连接,而不必维护映射到websocket处理程序/后处理程序的GUID映射?

此外,参考图片,有没有一种方式使用V3消息,但仍然能够写一个响应回到当前连接到V2的websocket处理程序?

您从图表中缺少的是Vertx EventBus。

基本上你可以假设你的V1 … Vn是相互关联的:

 V1<->V2<->...<->Vn 

让我们假设Va接收到您的出站Q消息(红线),这是用于Vb。
然后它应该使用EventBus发送给Vb:

 eventBus.send("Vb UUID", "Message for Vb, also containing WebSocket UUID", ar -> { if (ar.succeeded()) { // All went well } else { // Vb died or has other problems. Your choice how to handle this } });