java - 将响应处理程序与 VertX 中的请求进行匹配

标签 java architecture kotlin vert.x

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

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

看这个草图:

enter image description here

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

我目前正在做的是为每个新连接生成一个 GUID,然后一旦 websocket 连接,就将 websocket 处理程序存储在 HashMap 中以对抗 GUID,然后当 BE 想要响应时,它会进行扇出对于所有 1..n 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 处理程序/post 处理程序的 GUID 映射?

另外,引用图片,V3 有没有办法使用消息,但仍然能够将响应写回到当前连接到 V2 的 websocket 处理程序?

最佳答案

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

基本上您可以假设您的 V1...Vn 是互连的:

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

假设 Va 收到了发给 Vb 的出站 Q 消息(红线)。
然后它应该使用 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
  }
});

关于java - 将响应处理程序与 VertX 中的请求进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41212534/

相关文章:

.net - 始终在 DAL 基类中使用 TransactionScope 是一个好习惯吗?

architecture - 何时使用数据传输对象和数据集

android - Kotlin 是否 100% 兼容 Android 上的 ART?

kotlin - 在kotlin中使用索引映射Arraylist的ArrayList

java - 降低 Selenium Webdriver 的速度

java - 为什么 json 不起作用?

android - 如何理解 VIPER 清洁架构?

java - 所有分区的 seekToEnd 并在 Kafka 消费者的自动重新平衡中幸存下来

java - 使用嵌套 if 语句在 while 循环中循环出现问题

java - 语句有动态表名时如何防止SQL注入(inject)?