如果是用 kafka 作为消息中间件。
股票的报价需要是高度实时,而且要严格的消息顺序(例如我必须先看到 12:01:01 的信息,然后再看到 12:01:02 的信息)。
而 Kafka 只在同一个 partition 内的消息是严格顺序的,所以只有就是一个 topic 一个 partition 才能保证消息顺序。
那用户是属于哪一个 topic 这种关联应该怎么样去绑定呢?
要保证 exactly once,还有幂等性之类,很多细节都不清楚。哪位能赐教一下,谢谢。
1
xderam 2022-04-18 23:18:00 +08:00
你说的是股票行情还是下单撮合交易?”报价“这个词没太理解。
|
2
gabon 2022-04-18 23:21:15 +08:00 via iPhone
可以找个项目读一下,最近想读一下 qmq ,你说的这几个特性基本上支持
|
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 消息有序 |
4
golangLover OP @xderam 行情,派送给 app ,像富途牛牛
|
5
golangLover OP @gabon 找了一些,但觉得不是很完整。您有推荐的吗?
|
6
neoblackcap 2022-04-19 01:30:19 +08:00
你这个报价有没有时效性的啊?据我了解,股票报价都是按时效算钱的。不同延迟的报价收费可不一样。
这行里面的很多公司的解决方案都是自研的,因为一般开源解决方案满足不了他们对时效性的追求。 |
7
levelworm 2022-04-19 03:46:03 +08:00 via Android
@neoblackcap 话说什么样的水平才能做这种系统
|
8
gabon 2022-04-19 09:34:01 +08:00 via iPhone
@golangLover 就是 qmq ,qunar 开源的
|
9
neoblackcap 2022-04-19 10:06:04 +08:00 1
@levelworm 什么样的水平不好说,反正有很多用 C++的。如果是 Java 的,可以去看看 LMAX 写的 Disruptor 框架。那可是正经八百的金融公司写的,用于解决报价问题的框架
|
10
levelworm 2022-04-19 10:10:49 +08:00 via Android
@neoblackcap 多谢推荐
|
11
milkpuff 2022-04-19 11:39:46 +08:00
这种对顺序不敏感吧,大部分数据是顺序的,少部分顺序乱了,靠客户端把旧消息过滤丢掉就好了。
|
12
mrsatangel 2022-04-19 16:33:46 +08:00
关键字:tibco rv, solace
|
13
golangLover OP @haozibi 这个我也有了解。但实际上一个 app 上面的用户千万个,按照这说法实际操作其实是单一一个 kafka instance, 而他只有负责某类股票(例如美股) 的 topic 只有一个,而且这 topic 只有一个 partition? 那对应这个 topic 的 consumer 也只有一个。读完以后,就缓存到 redis 。那这个 redis 的 value 不停更新,大家就多线程读这个 redis 的 value 。是这样吗?
|
14
golangLover OP |
15
golangLover OP @milkpuff 问题是肯定有延迟啊,你怎么知道现在这个收到的信息其实是旧的信息呢?
|
16
milkpuff 2022-04-20 00:16:21 +08:00
@golangLover 交易所产生的行情都是带时间戳的。每一帧行情数据推过来和上一帧比较一下。通常股票 3 秒一个数据,很小概率有乱序的丢弃。
|
17
crazychang 2022-04-20 10:55:30 +08:00
虽然我也不太懂 但是觉得可以找个极速柜台的接口文档看看
|