背景:
我正在构建一个应用程序,拟议的架构是基于微服务的事件/消息驱动。
做事的传统方式是,我有一个用户/HTTP请求
,它执行一些命令,具有直接的同步响应
。因此,对同一用户/HTTP请求
进行响应是“无需麻烦”的。
问题:
用户向UI服务(有多个UI服务)发送HTTP请求
,该请求触发将某些事件发送到队列(Kafka / RabbitMQ / 任何其他)。 N个服务接收该事件/消息,在途中进行某些操作,然后在某个时刻,同一UI服务应该接收该响应并将其返回给发起HTTP请求的用户。这样,处理请求就是异步
的,但根据您典型的HTTP交互,用户/HTTP请求->响应
是同步
的。
问题: 在这个通用的/事件驱动的世界中,如何将响应发送到发起操作的同一UI服务(与用户通过HTTP交互的服务)?
我迄今为止的研究工作 我一直在寻找解决此问题的人,似乎有些人正在使用WebSockets解决该问题。
但是,复杂性的层面是需要有一些表来映射(RequestId-> Websocket(客户端 - 服务器))
,用于“发现”网关中哪个节点具有某个特定响应的websocket连接。但即使我理解了问题和复杂性,我仍然无法找到任何文章,可以让我获得有关如何在实现层面解决此问题的信息。并且,由于第三方集成(例如期望请求/响应
的付款提供者(WorldPay)),这仍然不是可行的选项-特别是在3DS验证中。
因此,我有些不情愿认为WebSockets是一个选项。但即使WebSockets适用于Web面向应用程序,在连接到外部系统的API方面也不是很好的架构。
** ** ** 更新: ** ** **
即使长轮询对于具有202 Accepted
,Location头
和重试后头
的WebService API是可能的解决方案,但对于高并发和高能力的网站来说性能不够好。想象一下大量人试图在他们进行的每个请求上获取交易状态更新,并且您必须无效化CDN缓存(现在去解决那个问题吧!哈)。
但最重要的是与我的情况相关的是,我有第三方API,例如付款系统,其中3DS系统具有由付款提供者系统处理的自动重定向,它们期望典型的请求/响应流
,因此,此模型将不适用于我,也不适用于套接字模型。
由于这种用例,HTTP请求/响应
应该以典型方式处理,在这种方式中
POST /user
Payload {userdata}
RETURNs:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Mon, 27 Nov 2018 17:25:55 GMT
Location: https://mydomain/user/transaction/status/:transaction_id
Retry-After: 10
GET
https://mydomain/user/transaction/status/:transaction_id