反应流:Spring WebFlux - 订阅现有发布者
Reactive Streams: Spring WebFlux - subscribe to existing publisher
我目前正在将我们现有的 Spring 异步 REST 架构迁移到 Spring 的新 WebFlux 库,并且对加入多个请求以便它们可以监听相同的已发布响应有疑问。
用例如下:
- 客户端 A 连接到我们的网络服务器并请求数据
- 我们访问缓存以检查是否有数据
- 我们没有,所以我们去检索这些数据(客户端 A 已经订阅并等待响应)
- 客户端 B 连接到我们的 Web 服务器并请求相同的数据(命中相同的端点)
- 我们检查缓存,数据仍然不存在
- 由于我们已经在为客户 A 获取此数据,因此我们不想再发出一个请求,但是,我们也不想让客户 B 离开。客户端 B 应该能够收听相同的信息
客户端 B 如何订阅客户端 A 正在等待的相同响应流?
"Client A has subscribed and waits for a response"
我想该请求被编码为 Mono
并且客户端 A 直译为:
Subscriber<Response> clientA = ...
Mono<Response> request = makeRequest(...);
request.subscribe(clientA);
那么clientB应该以同样的方式订阅:
Subscriber<Response> clientB = ...
request.subscribe(clientB);
此外,缓存不应包含先前保存的响应数据,而应包含 Mono<Response>
类型的请求本身。然后,如果在缓存中找到这样的请求,新客户端只需订阅它,而不管该请求是否已经完成。
我目前正在将我们现有的 Spring 异步 REST 架构迁移到 Spring 的新 WebFlux 库,并且对加入多个请求以便它们可以监听相同的已发布响应有疑问。
用例如下:
- 客户端 A 连接到我们的网络服务器并请求数据
- 我们访问缓存以检查是否有数据
- 我们没有,所以我们去检索这些数据(客户端 A 已经订阅并等待响应)
- 客户端 B 连接到我们的 Web 服务器并请求相同的数据(命中相同的端点)
- 我们检查缓存,数据仍然不存在
- 由于我们已经在为客户 A 获取此数据,因此我们不想再发出一个请求,但是,我们也不想让客户 B 离开。客户端 B 应该能够收听相同的信息
客户端 B 如何订阅客户端 A 正在等待的相同响应流?
"Client A has subscribed and waits for a response"
我想该请求被编码为 Mono
并且客户端 A 直译为:
Subscriber<Response> clientA = ...
Mono<Response> request = makeRequest(...);
request.subscribe(clientA);
那么clientB应该以同样的方式订阅:
Subscriber<Response> clientB = ...
request.subscribe(clientB);
此外,缓存不应包含先前保存的响应数据,而应包含 Mono<Response>
类型的请求本身。然后,如果在缓存中找到这样的请求,新客户端只需订阅它,而不管该请求是否已经完成。