股票报价的消息中间件是如何设计的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
golangLover
V2EX    程序员

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

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

    如果是用 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 秒一个数据,很小概率有乱序的丢弃。
    Dav1s
        17
    Dav1s  
       2022-04-20 10:55:30 +08:00
    虽然我也不太懂 但是觉得可以找个极速柜台的接口文档看看
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5231 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 09:01 PVG 17:01 LAX 01:01 JFK 04:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86