spring 的接口和数据库查询有什么方法可以进行等待但不阻塞线程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rockyou12
V2EX    Java

spring 的接口和数据库查询有什么方法可以进行等待但不阻塞线程

  •  
  •   rockyou12 2020-06-10 16:46:27 +08:00 2740 次点击
    这是一个创建于 1957 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有个业务,A 服务提供接口来对 iot 设备上的信息进行查询。但实际的查询流程是 A 调用 B 服务,B 服务去给 iot 设备发指令,然后 iot 的响应是异步返回通过其它服务写近了数据库。

    所以 A 服务要在调用 B 后,又进行等待并查询数据库中是否有这条服务,这个过程由于暂时不知道设备的响应是何时返回的并写入完成的,所以一定要等待甚至进行重试。

    我看了下 spring 的 controller 可以用 CompletableFuture 来做异步响应,这样不会阻塞 servlet 那里的 io,但查询数据的等待那里(也就是 future 的 callback )除了 Thread.sleep 我好像想不到很好的等待方法。

    用 redis 的 sub 或者类似的通知机制就算了,大幅加大了系统复杂度,暂时不考虑的

    7 条回复    2020-06-11 14:07:04 +08:00
    yyyfor
        1
    yyyfor  
       2020-06-10 17:00:26 +08:00
    completableFuture 的 whenComplete 方法?
    vitoliu
        2
    vitoliu  
       2020-06-10 17:14:29 +08:00
    DefferedResult
    vitoliu
        3
    vitoliu  
       2020-06-10 17:15:17 +08:00
    DeferredResult
    royan
        4
    royan  
       2020-06-10 17:54:07 +08:00
    你这已经是标准的异转同(异步转同步)方案了,即使引入消息通知机制也还要考虑被通知后如何唤醒当前这个业务线程(其实不太靠谱,参考分布式消息通知,被通知的都不一定是当前服务进程)。
    如果对业务接口有控制权,不如考虑将当前业务接口调整为两个接口,一个负责接收业务指令,一个负责查询这个业务指令的执行结果。
    即使对业务接口没有控制权,也建议增加一个负责查询业务指令执行结果的接口,谁能保证你那个同步等待不异常(比如超时,比如被 kill )呢?
    rockyou12
        5
    rockyou12  
    OP
       2020-06-10 18:57:40 +08:00
    @vitoliu 你这和 Future 是一样的
    @royan 其实我也想过给调用者一个 201,然后让对方自己去等待然后掉另外一个查询接口,但这样把复杂度暴露出去了,我不太喜欢
    RichardYyf
        6
    RichardYyf  
       2020-06-10 19:42:54 +08:00
    这个不就是我最近刚做的一个需求吗,异步转同步,如果 A 调 B 和 iot 异步返回可以透传一个唯一性的 ID 的话,可以参考 Dubbo 的 DefaultFuture,我是简化了 Dubbo 那个类的设计,还没时间总结,楼主可以看下 https://juejin.im/post/5e5c4b6d51882549236f8233 这篇文章
    royan
        7
    < href="/member/royan" class="dark">royan  
       2020-06-11 14:07:04 +08:00
    @rockyou12 理解。我是觉得 功能完整性 > 系统性能 > 设计优雅,类似微信统一支付也是单独提供一个查询接口来确保功能的最终完整性,同时避免了许多系统性能上的问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3594 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 05:06 PVG 13:06 LAX 22:06 JFK 01:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86