使用RSocket和Project Reactor实现202 ACCEPTED-重试行为

问题描述 投票:0回答:1

我正在实现一个典型的用例,其中客户端请求将异步生成的资源。因此,将立即生成并返回一个resourceID:

1. CLIENT ---(POST /request-resource)--->  SERVER
2. SERVER (Generates resID, launches async process) ---(202 Accepted - resID)---> CLIENT

此时,服务器中有一个后台任务,该任务最终将产生结果并将其存储在与resID关联的数据库中。 CLIENT将定期请求资源,然后重试直到可用:

3. CLIENT ---(/resource/resID)--->  SERVER (checks in Postgres using reactive driver)
4. SERVER ---(404 - Retry-After 5)---> CLIENT
5. CLIENT ---(/resource/resID)--->  SERVER (checks in Postgres using reactive driver)
6. SERVER ---(200 - JSON Payload)---> CLIENT

尽管RSocket非常适合避免在资源可用之前进行无休止的CLIENT重试(步骤3.继续)。

哪个交互模型更适合此问题,我该如何实现?

考虑如下存储库:ResourceRepository.Mono<Result> getResult(String resID)

如果我选择request / response交互模型,我将与以前一样。除非有办法重试Mono,直到结果出现。这可能吗?

使用request / stream,我可以使用response.status = PROCESSING返回类似Flux<Response>的结果,直到对Postgre的查询返回结果为止,然后Flux将具有一个带有response.status = OK的元素,并且Flux将具有完成。在配置的时间内没有结果的情况下,需要最长的时间来完成助焊剂。在这种情况下,我该如何提出要求?

我需要创建一个Flux,它会周期性地发出(具有最大的周期超时),当存储库返回一个空的Mono时,它的元素没有结果,或者当te存储库拥有一个空值时,它的实际值会完成Flux。] >

我正在实现一个典型的用例,其中客户端请求将异步生成的资源。因此,将立即生成并返回一个resourceID:1.客户端---((POST / request -...

spring-webflux project-reactor rsocket rsocket-java
1个回答
0
投票

使用带有请求响应交互模型的RSocket来解决此问题的方法,该模型等待直到资源在DB中可用。关键是使用repeatWhenEmpty运算符:

© www.soinside.com 2019 - 2024. All rights reserved.