实时计算用户持股金额的股票系统要怎么设计好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SelectLanguage
V2EX    Java

实时计算用户持股金额的股票系统要怎么设计好?

  •  
  •   SelectLanguage 2020-10-10 18:48:46 +08:00 3485 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一共有几千支股票,价格每秒都在变化 每个用户初始持有股票,并且随着下单变化 现在要求每支股票价格变化、或者用户持股数量变化的时候统计出用户持股总额(每支股票数量*价格的和)

    我遇到的问题是股票的价格每秒可能会有几千次变化, 每次变化都要去数据库查找这支股票被哪些用户的持有,实在太慢了,做不到实时统计 所以想来问下,大家有什么好看法,或者有什么框架可以套用这种场景?

    noahzh
        1
    noahzh  
       2020-10-10 18:53:27 +08:00
    用订阅模式,每个用户去订阅自己的股票就完了.
    SelectLanguage
        2
    SelectLanguage  
    OP
       2020-10-10 19:59:02 +08:00
    @noahzh 服务端需要计算知道每个用户的总金额,在金额达到一定条件的时候通知用户,所以不能放在客户端去计算
    huayumo
        3
    huayumo  
       2020-10-10 20:59:24 +08:00
    为是什么是"每次变化都要去数据库查找这支股票被哪些用户的持有"
    我的看法是用户打开自己的持仓界面的时候,开始获取数据,而且是根据股票代码获取股票价格,持仓数据,然后计算持仓总额.
    这个数据要求延迟低,感觉起码是 redis 这样的数据库来存储,主要股票价格变动的实时化,只要接口速度快,持仓量可以做个缓存.
    没做个这个,不过这个数据一般都会有延迟,股票的买卖是排队形式的,即使你看到了价格,你立即下单,可能排不上你,网络上的价格都是存在延迟的.
    自己平台只要时间不要差太多就可以了,如果是证券公司,估计有交易所数据接口,会更快一点吧
    纯属个人观点
    SelectLanguage
        4
    SelectLanguage  
    OP
       2020-10-10 22:15:32 +08:00
    @huayumo 需求是要实时检测 比如某个用户持仓金额超过一万 就要发短信提醒他
    所以就算用户没有打开自己的持仓界面,服务端也要计算
    Jooooooooo
        5
    Jooooooooo  
       2020-10-10 22:18:10 +08:00
    @huayumo 你没理解需求.

    需求是用户 A 对于股票 1 设定了一个通知价格 x, 到了这个价格立马通知用户 (无论是 push 还是短信)

    因为用户数量大, 股票价格的阶梯数量也大, 怎么设计数据结构很关键
    yc8332
        6
    yc8332  
       2020-10-10 22:18:44 +08:00
    那你这个逻辑不现实。每秒变化,你可能通知用户还没操作就一直在变化,一直通知?
    9LCRwvU14033RHJo
        7
    9LCRwvU14033RHJo  
       2020-10-10 23:11:03 +08:00
    一台机打算服务多少个用户?
    jones2000
        8
    jones2000  
       2020-10-10 23:21:00 +08:00
    单独做一个用户持仓信息计算的服务,
    1. 订阅行情,
    2. 用户信息放内存,
    股票有变化就实时计算用户金额
    3. 交易下单操作以后, 通知这个服务更新用户信息
    dizun
        9
    dizun  
       2020-10-10 23:25:39 +08:00 via Android   1
    场外配资??
    l00t
        10
    l00t  
       2020-10-10 23:31:44 +08:00
    首先,股票的价格不会每秒变化几千次……一秒顶多也就一到两次。

    然后,嫌慢你就别去数据库找……加载到内存里找啊。用户量多少?量大的话多搞点机器。
    SelectLanguage
        11
    SelectLanguage  
    OP
       2020-10-10 23:47:57 +08:00
    @jones2000 @l00t 放到内存中可以,但是如果数据很多,需要分割数据存到多台机器中,感觉要考虑很多问题,比如怎样通知多台机器、部分节点故障要如何处理等等。。感觉自己来实现的话会很复杂,而且不一定做得好
    想知道有没有现成的框架能处理这个事情,比如大数据 HADOOP 、SPARK 之类的(我对这些不是很清楚,想知道在这种场景下能用得上吗?)
    l00t
        12
    l00t  
       2020-10-10 23:54:11 +08:00
    @SelectLanguage #11 通知你可以用消息队列。节点故障现阶段你可以不考虑。机器挂了就是挂了。你单个机器挂了也是挂了。你如果有单个机器挂了热切备机的方案,那么同理给多个机器做上就行。
    wangbenjun5
        13
    wangbenjun5  
       2020-10-11 00:00:14 +08:00   1
    看各位说的,我感觉这个需求并不复杂,首先,用户持仓数据变化并不大,可以认为是固定的,其次股票的价格也不是每秒变化几千次。。。

    一般像同花顺这类的炒股软件,数据更新延迟好像都有 200-300ms,哪有实时这个概念!你这个需求,无非是整个定时任务,隔一段时间算一次
    jones2000
        14
    jones2000  
       2020-10-11 02:20:59 +08:00
    @SelectLanguage 像这些小的应用服务,尽力不要用 HADOOP 、SPARK 这些大型的框架, 除非你对他们的内部构架十分了解,否则都是坑,还不如自己写一个快。
    行情数据都是实时过来的,只需要存最新的快照数据就可以,不大。
    如果是用户多, 可以指定一个服务跑哪几个用户。 多部署几套服务就可以了, 用 docker 也可以。
    realpg
        15
    realpg  
    PRO
       2020-10-11 02:36:48 +08:00   1
    搞过带杠杆的超保证金强行平仓,就需要实时计算用户的市值结合杠杆是否需要强平

    如果用户不是复杂持仓(我那边估算,持有超过 17 种以下单一价格票证),有巧妙的算法解决,复杂持仓因为复杂度,就会让这个算法的效率无法接受了

    搞这种应用的,算法都是很值钱的。如果搞不定一些黑科技,那就老老实实的所有用户每个周期跑
    9LCRwvU14033RHJo
        16
    9LCRwvU14033RHJo  
       2020-10-11 04:26:14 +08:00
    @realpg 17 种以下?如果是不超过 16,听起来像是用 SIMD 优化。
    xuanbg
        17
    xuanbg  
       2020-10-11 07:48:25 +08:00
    不需要实时,进入包含持股金额的界面时读取数据,然后让用户手动刷新就完了。
    xuanbg
        18
    xuanbg  
       2020-10-11 07:50:18 +08:00
    @SelectLanguage 你这个也不需要实时,设置一个定时任务就行。1 分钟处理 1 遍也就差不多了。
    playniuniu
        19
    playniuniu  
       2020-10-11 07:50:58 +08:00 via Android
    我觉得比较简单粗暴的方式是 redis 存股票价格 和每只股票所有绑定的用户 id 然后股票价格一变化 就把所有用户 id 放入队列算持仓 再把需要通知的用户放到通知队列 当然可以加个延时 比如用户已经算过一次的 可以 5 妙内不在计算 降低点系统负担
    coyove
        20
    coyove  
       2020-10-11 10:03:19 +08:00
    秒级数据都是直接进内存的,连 redis 都没用,一个服务器服务固定的用户
    noahzh
        21
    noahzh  
       2020-10-11 10:52:22 +08:00
    @SelectLanguage 一样的的解决方法,这里不要区分什么服务端了,一个 topic 是股票代码,内容是股票价格,每个用户一个 topic 是 他持有股票总类和数量,保证金这些东西,就完全解决了.
    imn1
        22
    imn1  
       2020-10-11 10:55:50 +08:00
    1.变化的价格有实时系统就足够了
    2.客户端只是显示的话,没必要绝对实时,况且很多并非每秒变化,真的做到每秒多个数据同时刷新,看的人眼睛很累的,甚至会晕厥 应该做 server push,这样就没必要每个股票*每秒查询了
    3.至于服务端总额预警,应该另外采取一套计算,是判别价格而不是总额 为啥要每次价格变化就算一次总额?不如从预警总额反推预警价格(只计算一次就够了),比较第一条达到预警目的

    4.above all,真要做到那种极致的实时,上硬件支持
    TypeError
        23
    TypeError  
       2020-10-11 12:27:38 +08:00 via Android
    雪球在股市风暴下的高可用架构改造分享
    https://www.cnblogs.com/yudar/p/4782131.html
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2389 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:25 PVG 09:25 LAX 18:25 JFK 21:25
    Do have faith in what you're doing.
    ubao 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