V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
garyxi24
V2EX  ›  数据库

关于响应式数据库连接

  •  
  •   garyxi24 · 2022-08-18 16:23:19 +08:00 · 1251 次点击
    这是一个创建于 830 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,有人在研究或者使用吗,我知道像 vertx 、quarkus 、spring 这些框架都已经对其做了集成,但是感觉相关文档很少,不了解一些内部的实现情况和原理,比如如何保证事务,数据的一致性,以及对比传统的连接方式性能提升情况。有大佬帮忙解答一下吗?
    第 1 条附言  ·  2022-08-26 11:26:43 +08:00
    谢谢大家的回复,其实我主要眼馋异步连接的性能提升,前一段时间尝试了 quarkus ,用了 async pg client ,发现跟想象中的还有很大差距,一方面是要习惯响应式编程的方式,quarkus 用的是 Smallrye Mutiny 在 vertx 封装的一套,常用的流操作都实现了,但跟同步式操作不同,主要拿不到结果就让我很难受😂;另一方面就是事务,之前可能没表述清楚,我所关注的事务是框架的实现形式,尝试了 quarkus 之后发现异步连接的事务处理非常麻烦,基本都要手动处理,还有事务传播机制,需要手动使用类似于 ThreadLocal 的东西传播上下文。所以综上,我选择放弃,至少目前的业务代码是肯定没法用的,当然看起来搞中间件网关这种还是不错的。
    3 条回复    2022-08-19 11:24:08 +08:00
    lmshl
        1
    lmshl  
       2022-08-18 16:34:00 +08:00
    没用过 async-db ,r2dbc 等方案,只用过 hikaricp 链接池 + 异步的响应式。我说下我的经验:

    事务:因为背后还是 jdbc ,所以事务必定发生在同一个 jdbc connection 当中,业务编码的时候会把整个异步代码块打上一个 transaction 标记作为边界,表示在边界内的 sql 都处于同一个事务中。

    一致性:和传统并无二致

    性能提升:业务代码部分只需要一个 n = cores 的线程池作为纤程的运行时就够了,所以几乎没有上下文切换。jdbc 部分都交给 hikaricp 管理,iowait 的线程对操作系统没什么消耗,可能会在跨线程(核心)数据交换上会浪费一点资源,但和传统阻塞式比可以忽略不计了。所以首先要满足的条件是你自己的应用也需要遵守响应式开发,不然的话可以说没有性能提升。
    kanel
        2
    kanel  
       2022-08-18 17:15:41 +08:00
    可以了解一下 Spring 的 R2DBC 規範文件。類似它們只是一個反應式的 API 連接程序和數據庫,至於內部原理不由這些框架實現,這要去查各個數據庫的文件了。我也是最近才接觸這一塊,如果我的信息有何不妥,還望大家多多指導。
    yizmaoaa
        3
    yizmaoaa  
       2022-08-19 11:24:08 +08:00
    保证事物、数据的一致性。都是数据库本身的功能,和你使用的某种 Client 没有关系。

    所有 Client 都是根据数据库官方的协议去实现,如果数据库本身支持异步,那么 Client 或许会针对这个数据库做一通到底。实际上大部分数据库也不支持异步,CLient 这边的实现只是针对 Client 部分他是异步的。

    也就是说当你客户端发送一个查询请求,链接不用一直挂着去等待响应,可以去处理其他事物
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5396 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:52 · PVG 13:52 · LAX 21:52 · JFK 00:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.