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

号称“能够在一个线程里每秒处理 6 百万订单”的 disruptor 框架,大家有在项目中使用吗?

  •  2
     
  •   SparkMan · 2015-12-18 15:40:42 +08:00 · 12233 次点击
    这是一个创建于 3298 天前的主题,其中的信息可能已经有所发展或是发生改变。

    disruptor 号称"能够在一个线程里每秒处理 6 百万订单",好厉害,用过的使用场景是什么样的? RingBuffer 的效率如何?

    19 条回复    2015-12-23 11:54:56 +08:00
    liangzhi102292
        1
    liangzhi102292  
       2015-12-18 16:37:30 +08:00
    The best way to understand what the Disruptor is, is to compare it to something well understood and quite similar in purpose. In the case of the Disruptor this would be Java's BlockingQueue. Like a queue the purpose of the Disruptor is to move data (e.g. messages or events) between threads within the same process. However there are some key features that the Disruptor provides that distinguish it from a queue. They are:

    Multicast events to consumers, with consumer dependency graph.
    Pre-allocate memory for events.
    Optionally lock-free.

    来源: https://github.com/LMAX-Exchange/disruptor/wiki/Introduction
    slixurd
        2
    slixurd  
       2015-12-18 16:40:04 +08:00
    同理,还有 Reactor 和 Akka 。但是实际上业务代码能用上这些的不多
    RxJava 倒是在 Android 上被应用了。服务器端没见到有人敢用。(虽然我用来写 utils ,但也只是边缘应用
    SparkMan
        3
    SparkMan  
    OP
       2015-12-18 16:52:43 +08:00
    @liangzhi102292
    @slixurd 部门其他项目也有用 disruptor 的,主要是日志的发送。不容易摸透的东西,不好使用在生产中,所以还是得多摸索摸索
    est
        4
    est  
       2015-12-18 17:13:36 +08:00
    每秒处理 6 百万订单。。。我一个订单有 1024 字节的 payload ,这就是 45G 的带宽。那么问题来了,你们服务器是万兆网卡互联吗?集群的交换机背板带宽有多大?
    SparkMan
        5
    SparkMan  
    OP
       2015-12-18 17:28:41 +08:00
    @est 额, 6000000/1024/1024*8=45.7G 额,这个不是我们服务器,这个是 disruptor 官方的测试数据 https://lmax-exchange.github.io/disruptor/
    zacard
        6
    zacard  
       2015-12-18 17:30:14 +08:00
    还真用了。效率刚刚的。
    SparkMan
        7
    SparkMan  
    OP
       2015-12-18 17:36:43 +08:00
    @est 也要看他所谓的订单是什么内容吧,如果 200 字节,再加上双网卡应该还是可以的
    SparkMan
        8
    SparkMan  
    OP
       2015-12-18 17:38:02 +08:00
    @zacard 你什么公司什么项目什么场景用到了?
    letuslinux
        9
    letuslinux  
       2015-12-18 17:40:05 +08:00
    @est 处理 6 百万不用想就知道肯定是纯内存计算,无 io 的
    SparkMan
        10
    SparkMan  
    OP
       2015-12-18 17:45:16 +08:00
    @letuslinux 恩,底层用的是数组而不是链表,可以直接让 CPU 友好的缓存,所以还省了很多读内存的开销
    Midnight
        11
    Midnight  
       2015-12-18 17:55:26 +08:00
    能够在一个线程里每秒处理 6 百万订单

    是指在超算上跑吗?
    c742435
        12
    c742435  
       2015-12-18 18:17:11 +08:00 via Android
    @Midnight 超算的一个线程未必有你家的一个线程快。
    est
        13
    est  
       2015-12-18 22:16:34 +08:00
    @SparkMan inter-thread library 。。。。。。。。。这效率也是醉了。有些机器内存带宽也就 10G 。
    hantsy
        14
    hantsy  
       2015-12-19 00:02:51 +08:00
    @slixurd 服务端应用应该有很多, 之前我用过 Reactor 。下一代的 Spring 5 会基于 Reactive Stream ,首先集成 Reactor , RxJava 。现在已经 Github 已经有一个项目了 spring-reactive 项目,作为 Spring 5 的前奏。
    hantsy
        15
    hantsy  
       2015-12-19 00:04:09 +08:00
    disruptor 算法有一个论文,看了半天,比较晕,真的老了,静不下心看这些了。
    kozora
        16
    kozora  
       2015-12-19 00:06:22 +08:00
    认识北京一家做 P2P 的在用这个框架= =
    liangzhi102292
        17
    liangzhi102292  
       2015-12-21 16:15:25 +08:00
    @SparkMan 主要是应用在 传统的 PCP (生产者消费者问题)场景。传统的 blockingqueue 此类都需要加锁操作,而 disruptor 使用了 CAS 指令和 ringbuffer 使得效率变得非常高。具体可 google
    SparkMan
        18
    SparkMan  
    OP
       2015-12-22 09:51:34 +08:00
    @liangzhi102292 额,我倒不是问你什么是 disruptor ,你说这些官方文档我肯定都看过,肯定也 google 过;我其实是问具体使用场景,比如我们其他项目组是日志收集项目中使用了,或者用 ringbuffer 重写了 logback 组件
    liangzhi102292
        19
    liangzhi102292  
       2015-12-23 11:54:56 +08:00
    @SparkMan 都说了嘛, PCP 场景为了追求高性能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1569 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.