有DeferredResult(异步请求)的项目如何做集群

项目中有“/requestA"请求,返回deferredResult,等到请求”/requestB"时再执行deferredResult.setResult(requestB和requestA不是同一用户)。如果做了负载均衡,requestA和requestB可能不在一个机器上,应该要怎么处理。

DeferredResult deferredResult;

@GetMapping("/requestA")  
public DeferredResult<String> requestA() {  
  
    DeferredResult<String> result = new DeferredResult<();  
    return result;  
  
}  
  
@GetMapping("/requestB")  
public String requestB() {  
    deferredResult.setResult("success");
    return "success";  
  
阅读 4.3k
3 个回答

按照你这样的做法,你得必须让同一个用户的请求必须落在同一台机器上才行,负载均衡端使用 ip_hash 规则,这个 nginx 还有阿里云的 lsb 都可以做到, zuul 网关也可以做到。

另外你这种做法肯定是不妥的,http 是无状态的,你这种方式试图做成有状态,违反了 http 协议本身,就算你勉强实现,后续也会带来许多其它问题。

用 Redis 的通知或者 blpop 来实现或者干脆轮询数据库。这跟 DeferredResult 都不挨着。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题