V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
donyee
V2EX  ›  职场话题

有没有公司项目是使用 Vertx 全套的?

  •  
  •   donyee · 2019-09-20 19:41:32 +08:00 · 16615 次点击
    这是一个创建于 1889 天前的主题,其中的信息可能已经有所发展或是发生改变。
    入职一个 XX 公司,待了 3 个月,公司项目都是用 Vertx 开发的,操作数据库也是用 vertx 提供的异步操作...
    问了一圈新公司的老同事,也都不乐意使用,但是一直在用着...
    搞得敲代码都很累...
    分分钟想跑路啊,但是...
    31 条回复    2023-09-13 09:58:49 +08:00
    cgpiao
        1
    cgpiao  
       2019-09-20 19:43:59 +08:00 via iPhone
    我在用 ktor...
    donyee
        2
    donyee  
    OP
       2019-09-20 20:31:25 +08:00
    ktor 只是 web 端异步吧,其他 service dao 层呢?

    XX 公司项目的代码中没有 service dao 层,一组接口的代码都是在一个类中...
    kevinWHX
        3
    kevinWHX  
       2019-09-20 20:43:34 +08:00 via iPhone
    这个门槛还是挺好的,配合 kotlin 可以实现用同步的方式替代回调或者 future
    hantsy
        4
    hantsy  
       2019-09-20 20:49:45 +08:00
    vertx 不错啊,支持 ReactiveStream,不知道你们有没有用到 RxJava,它是支持。

    Spring 现在也推 Reactive 方式编程,主要用自己的 Reactor (同样实现了 ReactiveStream 规范) 实现,现在 Spring Data 下原来数据库,特别是 NoSQL 很多也开始用 Reactive 实现了,已经有几 Subproject 开始支持 Reactor 了。最大问题,就是传统的关系数据库,Spring 开启了另外一个项目,R2dbc,避开 Jdbc (当然下一代的异步的 Jdbc 规范已经在路上了)和 JPA,从底层重新实现数据操作,目前支持 H2,PostgreSQL,MSSQL,MySQL (有多种第三方实现)。
    lhx2008
        5
    lhx2008  
       2019-09-20 22:01:49 +08:00 via Android
    @hantsy vert.x webflux 都一样,想法很好,但是不实用,配套也不完善。

    最简单的,90%代码异步不异步性能都一样的,只有那些网络 IO 的异步才有意义。

    所以强制使用一个不完善的模式,真的很蛋疼,包括但不仅限于 N 个异步接口同时调用,结果需要合并。错误处理。重试机制。fallback 机制。跨作用域变量引用。
    fanqianger
        6
    fanqianger  
       2019-09-20 22:28:44 +08:00
    我们公司也是异步去操作数据库, 没啥实际意义,增加了很多写代码和阅读代码的成本。
    Cellei
        7
    Cellei  
       2019-09-20 22:30:06 +08:00
    vert.x 值得去了解一下,异步会提高吞吐量
    accfcx
        8
    accfcx  
       2019-09-20 22:59:41 +08:00 via iPhone
    实习公司的团队看到了一个 API 网关使用了 vertx 框架,阅读了项目大部分代码,还是很好理解的。没有具体使用它进行开发,不知道其它公司怎么样
    cgpiao
        9
    cgpiao  
       2019-09-21 08:51:11 +08:00 via iPhone
    @donyee 看设计了,能实现的。不就是注入吗。dao 层就用 exposed 了。
    hantsy
        10
    hantsy  
       2019-09-21 12:04:40 +08:00
    @lhx2008 当你用 Webflux 主要是编程思维上要改变,要接受 Stream,Pipe 这些概念。

    ReactiveStream 已经相当完善了。 前端经典的 Rxjs 也是实现这一标准,现在 Angular 内置使用 Rxjs。传统的 Redux 也是 Rxjs 实现的。后端的就多了,Java 里面就有 Rxjava, Reactor, Akka 等,Android 上也有。

    Spring WebFlux 已经相当成熟,而且也非常好用,已经在项目使用。它两种编程方式都不错,传统的 Controller,和 Functional Router 都不错。


    @kevinWHX Spring 5.0 深度集成了 Kotlin,提供了很多 Extension 简化 Kotlin 编程,也支持 Coroutines。
    kotlin:https://github.com/hantsy/spring-reactive-sample/blob/master/boot-kotlin/src/main/kotlin/com/example/demo/DemoApplication.kt
    kotlin dsl:https://github.com/hantsy/spring-reactive-sample/blob/master/boot-kotlin-dsl/src/main/kotlin/com/example/demo/DemoApplication.kt
    coroutines:https://github.com/hantsy/spring-kotlin-coroutines-sample

    @fanqianger 我不觉得异步会增加代码量。Spring 核心中很多 Reactive 特性都试用过,外围一些项目也在紧跟 Reactive,如 Spring Integration,Spring Cloud 等。
    hantsy
        11
    hantsy  
       2019-09-21 12:38:11 +08:00
    @lhx2008 你提到有一点没错,Networking 是异步一个大的 Blocking。所以要用 Reactive,就要全套上,特别是数据库连接(最大的性能问题),不然整体性能上不去。至于 exception handling, retry, fallback, 这些好像和异步没什么关系,这是在开发过程中都会面临的问题。
    hantsy
        12
    hantsy  
       2019-09-21 12:51:30 +08:00
    @Cellei 如果在 Vertx 中真正使用 Reactive 那一套,异步只是其一,就如 ReactiveStream 规范定义,它是 MessageDriven, 遵从 Pulish/Subscribe 模型,另外最大的特性就是支持 Back Pressure,当然这些在实践中都是在代码配置,调节,达到最佳效果。
    lhx2008
        13
    lhx2008  
       2019-09-21 13:32:38 +08:00   ❤️ 1
    @hantsy #10 响应式编程,没问题,但是必须和传统模式混合,比如 java stream 就非常好。但是 webflux 和 netty 接合之后,就强制要求全流程上 stream,复杂的逻辑下,代码复杂度上升不知道几个级别。

    响应式编程想把所有的输入输出都流水线化,后面的流程的输入是上一个流程的输出,想法是很好的,但是现实不总是这样。

    举个例子,
    我现在需要在 A 库查一个 List A,然后遍历 List A,在 X 库逐个查询,填充每个对象。同时,我在 B 库再查一个 List B。同时,我再在网络(另一个微服务)查一个 List C。然后把这些数据发送到一个数据库 D。

    请问你用 webflux 能优雅的写出来吗?要套多少个 zip ?如果我查 X 库有些会出错,有些不会,要 fallback,怎么加?插入 D 数据库异常了,怎么准确地 fallback 到一个 checkpoint,怎么做事务回滚?如果在 A、B、X、D 任意一步出错,我想重试流程,应该在哪里加 retry ?要加多少个 retry ?如果我想 debug,我怎么知道我执行到哪行代码?调用的堆栈是怎么样的?最后,你写出来的这种带着无数嵌套,zip 的代码,你的同事看得懂吗?

    如果用 vert.x 异步,上面的流程可以无歧义的用多个回调来表示出来,至少还看得懂,只不过是更加难看。
    lhx2008
        14
    lhx2008  
       2019-09-21 13:38:10 +08:00
    @hantsy
    至于性能问题,其实都不是大部分应用担心的,要不然 PHP 就不会在今天还在大行其道了。甚至 Mysql 都要给 MongoDB 让道。特别是现在 K8S 微服务,很多都是靠弹性伸缩就足以提供更高的性能了。

    用 netty / webflux / vert.x 高性能只有一种可能,就是全流程无阻塞调用,包括没有本地 IO 调用,没有 Mysql 调用。全部调支持异步的 Nosql,性能才能体现出来。如果调了 Mysql,压测 TPS 肯定是 Mysql 先挂了。
    runningman
        15
    runningman  
       2019-09-21 15:14:31 +08:00 via iPhone
    @lhx2008 能否大家加微信聊聊 我对性能这块很头大
    runningman
        16
    runningman  
       2019-09-21 15:15:19 +08:00 via iPhone
    @lhx2008 我的微信 270115861 如你所说 其实框架都差不多 主要问题在 mysql 这里 框架的差异影响不大
    signalas1
        17
    signalas1  
       2019-09-21 15:54:44 +08:00
    看楼主描述好像 node 啊,应该有改善异步回调的库 不可能全这样回调这写
    signalas1
        18
    signalas1  
       2019-09-21 15:57:06 +08:00
    @lhx2008 并发只会增加时延吧,整个流程全用异步回调,缓存撑不住才可能挂
    fanqianger
        19
    fanqianger  
       2019-09-21 17:50:21 +08:00
    @hantsy
    你去看看 springwebflux 的技术栈,底层如果是 MySQL,webflux 是不支持的。
    [!img]( https://docs.spring.io/spring/docs/current/spring-framework-reference/images/spring-mvc-and-webflux-venn.png)
    lhx2008
        20
    lhx2008  
       2019-09-21 18:13:03 +08:00 via Android
    @signalas1 同步和异步的区别,只是说一个排队,一个满了就关门,但是如果后端(数据库)慢的话,其实对客户来没区别,都是不能服务。只是说异步的 QPS 看起来大而已,对于用户来说,处理时间超过 30s 就基本没意义了。

    至于线程的开销,真的没那么重要,后端(数据库)的速度才是决定性的。如果只是从 redis 查缓存,那同步也可以很快。

    我说的主要是比较多写入的场景,这种对数据库要求比较高。当然,现在都是分布式数据库,想扩容都是很简单的事情。
    lhx2008
        21
    lhx2008  
       2019-09-21 18:18:15 +08:00 via Android
    我也不是否认异步对性能提高不大,中间件,数据库这种基础组件,当然应该对性能有更高的要求。也肯定是需要使用异步的架构。
    因为异步往往更难以管控,对于普通业务代码,还是要根据实际的业务量来做权衡,平衡性能和可维护性。
    hantsy
        22
    hantsy  
       2019-09-21 18:49:18 +08:00
    @fanqianger 已经说过了,Spring 开启新项目 R2dbc 解决关系数据库问题,也有相应的 Spring Data 集成,https://github.com/hantsy/spring-reactive-sample/tree/master/boot-data-r2dbc
    hantsy
        23
    hantsy  
       2019-09-21 18:52:28 +08:00
    再说了,PostgreSQL 已经有一些异步方案,安全不用 Jdbc 的 APIs。Oracle 下一代的数据库访问,https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-database
    fanqianger
        24
    fanqianger  
       2019-09-21 21:11:23 +08:00 via Android
    @hantsy 问一下这个 r2dbc 用的底层数据库驱动协议是啥?
    tairan2006
        25
    tairan2006  
       2019-09-22 19:45:22 +08:00
    异步是邪道,golang 是王道
    walter211
        26
    walter211  
       2019-11-20 16:36:44 +08:00
    求拉个群群
    xinhaiw
        27
    xinhaiw  
       2019-12-07 09:38:42 +08:00
    为什么不用 play 框架,reactive,数据库 slick,全套用起来也很方便,因为 Scala ?
    fanyingman
        28
    fanyingman  
       2020-03-03 21:36:17 +08:00
    @lhx2008 这个 Scala 处理起来会好一点,for{ a<-listA,b<-listB,c<-listC }yield a,b,c 这样玩的话特别爽。可惜很少有人用 Scala 写业务代码
    donyee
        29
    donyee  
    OP
       2021-04-09 10:50:55 +08:00
    我没有跑路,去年用 vertx-web dubbo+mybatis nacos 搞了套 api 网关架构,业务代码写起来快速方便;
    鸡汤:杀不死我的东西,只会使我更加坚强!
    duanluan
        30
    duanluan  
       2021-06-30 00:58:43 +08:00
    @donyee 很感兴趣,能交流一下吗?
    gaoyuanzong
        31
    gaoyuanzong  
       2023-09-13 09:58:49 +08:00
    有呀。几个项目就是全部 vert.x
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:40 · PVG 04:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.