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

股票报价的消息中间件是如何设计的?

  •  
  •   golangLover · 2022-04-18 22:41:32 +08:00 · 2491 次点击
    这是一个创建于 730 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果是用 kafka 作为消息中间件。

    股票的报价需要是高度实时,而且要严格的消息顺序(例如我必须先看到 12:01:01 的信息,然后再看到 12:01:02 的信息)。

    而 Kafka 只在同一个 partition 内的消息是严格顺序的,所以只有就是一个 topic 一个 partition 才能保证消息顺序。

    那用户是属于哪一个 topic 这种关联应该怎么样去绑定呢?

    要保证 exactly once,还有幂等性之类,很多细节都不清楚。哪位能赐教一下,谢谢。

    17 条回复    2022-04-20 10:55:30 +08:00
    xderam
        1
    xderam  
       2022-04-18 23:18:00 +08:00
    你说的是股票行情还是下单撮合交易?”报价“这个词没太理解。
    gabon
        2
    gabon  
       2022-04-18 23:21:15 +08:00 via iPhone
    可以找个项目读一下,最近想读一下 qmq ,你说的这几个特性基本上支持
    haozibi
        3
    haozibi  
       2022-04-18 23:29:59 +08:00
    kafka 的 Partition 保证有序,每个 Message 通过 Message.Key 字段做 Hash 决定 Message 发送给某个 Partition (默认分区器)

    所以你可以只用一个 topic ,然后 user_id 做 key ,这样就能保证同一个 user_id 的消息都只存在同一个 Partition ,即可保证 user_id 消息有序
    golangLover
        4
    golangLover  
    OP
       2022-04-18 23:59:43 +08:00 via Android
    @xderam 行情,派送给 app ,像富途牛牛
    golangLover
        5
    golangLover  
    OP
       2022-04-19 00:00:33 +08:00 via Android
    @gabon 找了一些,但觉得不是很完整。您有推荐的吗?
    neoblackcap
        6
    neoblackcap  
       2022-04-19 01:30:19 +08:00
    你这个报价有没有时效性的啊?据我了解,股票报价都是按时效算钱的。不同延迟的报价收费可不一样。
    这行里面的很多公司的解决方案都是自研的,因为一般开源解决方案满足不了他们对时效性的追求。
    levelworm
        7
    levelworm  
       2022-04-19 03:46:03 +08:00 via Android
    @neoblackcap 话说什么样的水平才能做这种系统
    gabon
        8
    gabon  
       2022-04-19 09:34:01 +08:00 via iPhone
    @golangLover 就是 qmq ,qunar 开源的
    neoblackcap
        9
    neoblackcap  
       2022-04-19 10:06:04 +08:00   ❤️ 1
    @levelworm 什么样的水平不好说,反正有很多用 C++的。如果是 Java 的,可以去看看 LMAX 写的 Disruptor 框架。那可是正经八百的金融公司写的,用于解决报价问题的框架
    levelworm
        10
    levelworm  
       2022-04-19 10:10:49 +08:00 via Android
    @neoblackcap 多谢推荐
    milkpuff
        11
    milkpuff  
       2022-04-19 11:39:46 +08:00
    这种对顺序不敏感吧,大部分数据是顺序的,少部分顺序乱了,靠客户端把旧消息过滤丢掉就好了。
    mrsatangel
        12
    mrsatangel  
       2022-04-19 16:33:46 +08:00
    关键字:tibco rv, solace
    golangLover
        13
    golangLover  
    OP
       2022-04-19 23:12:45 +08:00
    @haozibi 这个我也有了解。但实际上一个 app 上面的用户千万个,按照这说法实际操作其实是单一一个 kafka instance, 而他只有负责某类股票(例如美股) 的 topic 只有一个,而且这 topic 只有一个 partition? 那对应这个 topic 的 consumer 也只有一个。读完以后,就缓存到 redis 。那这个 redis 的 value 不停更新,大家就多线程读这个 redis 的 value 。是这样吗?
    golangLover
        14
    golangLover  
    OP
       2022-04-19 23:13:23 +08:00
    golangLover
        15
    golangLover  
    OP
       2022-04-19 23:13:55 +08:00
    @milkpuff 问题是肯定有延迟啊,你怎么知道现在这个收到的信息其实是旧的信息呢?
    milkpuff
        16
    milkpuff  
       2022-04-20 00:16:21 +08:00
    @golangLover 交易所产生的行情都是带时间戳的。每一帧行情数据推过来和上一帧比较一下。通常股票 3 秒一个数据,很小概率有乱序的丢弃。
    crazychang
        17
    crazychang  
       2022-04-20 10:55:30 +08:00
    虽然我也不太懂 但是觉得可以找个极速柜台的接口文档看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3265 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:42 · PVG 20:42 · LAX 05:42 · JFK 08:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.