有这样一个业务场景,如何设计更合理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
louislivi
V2EX    Java

有这样一个业务场景,如何设计更合理?

  •  
  •   louislivi 2020-01-10 10:49:53 +08:00 2881 次点击
    这是一个创建于 2115 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是这样:

    • 1.有多个用户。
    • 2.每个用户需要进行数据更新,频率为每分钟 150 次。
    • 3.每个用户需要异步更新,互不阻塞。
    • 4.每时每刻都有可能新增或删除用户。
    • 5.每个用户中的更新分为两种 [更新|新增] (接口不同),其频率共享 150 次。

    目前我的解决方法:

    采用了定时器 1(1 分钟)将用户需要更新的数据投递至一个全局变量,随后另一个定时器 2(100ms)取出全局变量以用户分组并锁住对应用户状态,异执行,每个异步线程中采用同步保持每分钟 150 次的频率,执行完成后解除用户锁状态。因最初没有发现该频率问题所以最初为并发模式,但是现在看来需要重新设计,大家有什么好的方案吗?

    5 条回复    2020-01-13 09:07:53 +08:00
    laravel
        1
    laravel  
       2020-01-10 11:08:34 +08:00
    用队列吧,1 分钟之内如果加入队列的超过 150 就丢弃
    snowfuck
        2
    snowfuck  
       2020-01-10 11:22:29 +08:00
    这样行不行:
    内存中维护一个 map,通过 id 取出用户数据,然后通过互斥锁来更新。对一个用户更新时,要先获取到这个用户的锁,获取不到则等待。对不同用户更新其实就没关系,直接从 map 中根据用户 id 取出来对应用户数据更新即可。
    orzorzorzorz
        3
    orzorzorzorz  
       2020-01-10 17:43:13 +08:00
    云一下。频率那么高,不如建一个持久链接,监听服务器的全局变量,事件触发更新。用户发起操作数据,先看看全局变量是不是在被操作,如果是就返回个 pending 的状态,等操作完再从服务器发个请求过去。
    KentY
        4
    KentY  
       2020-01-10 23:30:36 +08:00
    "每个用户需要进行数据更新" 每个用户是只要更新自己的数据么? 数据是存储在数据库么?
    louislivi
        5
    louislivi  
    OP
       2020-01-13 09:07:53 +08:00
    @KentY 数据是通过接口获取的,然后存在自己的数据库中 就类似一个爬虫这种。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     844 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 20:25 PVG 04:25 LAX 13:25 JFK 16:25
    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