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

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

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

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

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

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

    所以强制使用一个不完善的模式,真的很蛋疼,包括但不仅限于 N 个异步接口同时调用,结果需要合并。错误处理。重试机制。fallback 机制。跨作用域变量引用。
        6
    fanqianger   54 天前
    我们公司也是异步去操作数据库, 没啥实际意义,增加了很多写代码和阅读代码的成本。
        7
    Cellei   54 天前
    vert.x 值得去了解一下,异步会提高吞吐量
        8
    accfcx   54 天前 via iPhone
    实习公司的团队看到了一个 API 网关使用了 vertx 框架,阅读了项目大部分代码,还是很好理解的。没有具体使用它进行开发,不知道其它公司怎么样
        9
    cgpiao   53 天前 via iPhone
    @donyee 看设计了,能实现的。不就是注入吗。dao 层就用 exposed 了。
        10
    hantsy   53 天前
    @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 等。
        11
    hantsy   53 天前
    @lhx2008 你提到有一点没错,Networking 是异步一个大的 Blocking。所以要用 Reactive,就要全套上,特别是数据库连接(最大的性能问题),不然整体性能上不去。至于 exception handling, retry, fallback, 这些好像和异步没什么关系,这是在开发过程中都会面临的问题。
        12
    hantsy   53 天前
    @Cellei 如果在 Vertx 中真正使用 Reactive 那一套,异步只是其一,就如 ReactiveStream 规范定义,它是 MessageDriven, 遵从 Pulish/Subscribe 模型,另外最大的特性就是支持 Back Pressure,当然这些在实践中都是在代码配置,调节,达到最佳效果。
        13
    lhx2008   53 天前
    @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 异步,上面的流程可以无歧义的用多个回调来表示出来,至少还看得懂,只不过是更加难看。
        14
    lhx2008   53 天前
    @hantsy
    至于性能问题,其实都不是大部分应用担心的,要不然 PHP 就不会在今天还在大行其道了。甚至 Mysql 都要给 MongoDB 让道。特别是现在 K8S 微服务,很多都是靠弹性伸缩就足以提供更高的性能了。

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

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

    我说的主要是比较多写入的场景,这种对数据库要求比较高。当然,现在都是分布式数据库,想扩容都是很简单的事情。
        21
    lhx2008   53 天前 via Android
    我也不是否认异步对性能提高不大,中间件,数据库这种基础组件,当然应该对性能有更高的要求。也肯定是需要使用异步的架构。
    因为异步往往更难以管控,对于普通业务代码,还是要根据实际的业务量来做权衡,平衡性能和可维护性。
        22
    hantsy   53 天前
    @fanqianger 已经说过了,Spring 开启新项目 R2dbc 解决关系数据库问题,也有相应的 Spring Data 集成,https://github.com/hantsy/spring-reactive-sample/tree/master/boot-data-r2dbc
        23
    hantsy   53 天前
    再说了,PostgreSQL 已经有一些异步方案,安全不用 Jdbc 的 APIs。Oracle 下一代的数据库访问,https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-database
        24
    fanqianger   53 天前 via Android
    @hantsy 问一下这个 r2dbc 用的底层数据库驱动协议是啥?
        25
    tairan2006   52 天前
    异步是邪道,golang 是王道
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   968 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 22:35 · PVG 06:35 · LAX 14:35 · JFK 17:35
    ♥ Do have faith in what you're doing.