golangLover
V2EX  ›  程序员

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

By golangLover at 2022 年 4 月 18 日 · 3909 次点击

如果是用 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 年 4 月 18 日
你说的是股票行情还是下单撮合交易?”报价“这个词没太理解。
gabon
   2
gabon  
   2022 年 4 月 18 日 via iPhone
可以找个项目读一下,最近想读一下 qmq ,你说的这几个特性基本上支持
haozibi
   3
haozibi  
   2022 年 4 月 18 日
kafka 的 Partition 保证有序,每个 Message 通过 Message.Key 字段做 Hash 决定 Message 发送给某个 Partition (默认分区器)

所以你可以只用一个 topic ,然后 user_id 做 key ,这样就能保证同一个 user_id 的消息都只存在同一个 Partition ,即可保证 user_id 消息有序
golangLover
   4
golangLover  
OP
   2022 年 4 月 18 日 via Android
@xderam 行情,派送给 app ,像富途牛牛
golangLover
   5
golangLover  
OP
   2022 年 4 月 19 日 via Android
@gabon 找了一些,但觉得不是很完整。您有推荐的吗?
neoblackcap
   6
neoblackcap  
   2022 年 4 月 19 日
你这个报价有没有时效性的啊?据我了解,股票报价都是按时效算钱的。不同延迟的报价收费可不一样。
这行里面的很多公司的解决方案都是自研的,因为一般开源解决方案满足不了他们对时效性的追求。
levelworm
   7
levelworm  
   2022 年 4 月 19 日 via Android
@neoblackcap 话说什么样的水平才能做这种系统
gabon
   8
gabon  
   2022 年 4 月 19 日 via iPhone
@golangLover 就是 qmq ,qunar 开源的
neoblackcap
   9
neoblackcap  
   2022 年 4 月 19 日   ❤️ 1
@levelworm 什么样的水平不好说,反正有很多用 C++的。如果是 Java 的,可以去看看 LMAX 写的 Disruptor 框架。那可是正经八百的金融公司写的,用于解决报价问题的框架
levelworm
   10
levelworm  
   2022 年 4 月 19 日 via Android
@neoblackcap 多谢推荐
milkpuff
   11
milkpuff  
   2022 年 4 月 19 日
这种对顺序不敏感吧,大部分数据是顺序的,少部分顺序乱了,靠客户端把旧消息过滤丢掉就好了。
mrsatangel
   12
mrsatangel  
   2022 年 4 月 19 日
关键字:tibco rv, solace
golangLover
   13
golangLover  
OP
   2022 年 4 月 19 日
@haozibi 这个我也有了解。但实际上一个 app 上面的用户千万个,按照这说法实际操作其实是单一一个 kafka instance, 而他只有负责某类股票(例如美股) 的 topic 只有一个,而且这 topic 只有一个 partition? 那对应这个 topic 的 consumer 也只有一个。读完以后,就缓存到 redis 。那这个 redis 的 value 不停更新,大家就多线程读这个 redis 的 value 。是这样吗?
golangLover
   14
golangLover  
OP
   2022 年 4 月 19 日
golangLover
   15
golangLover  
OP
   2022 年 4 月 19 日
@milkpuff 问题是肯定有延迟啊,你怎么知道现在这个收到的信息其实是旧的信息呢?
milkpuff
   16
milkpuff  
   2022 年 4 月 20 日
@golangLover 交易所产生的行情都是带时间戳的。每一帧行情数据推过来和上一帧比较一下。通常股票 3 秒一个数据,很小概率有乱序的丢弃。
Dav1s
   17
Dav1s  
   2022 年 4 月 20 日
虽然我也不太懂 但是觉得可以找个极速柜台的接口文档看看
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 43ms · 3.9.8.5