V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
louislivi
V2EX  ›  Java

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

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

    需求是这样:

    • 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   ·   实用小工具   ·   3457 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:56 · PVG 18:56 · LAX 02:56 · JFK 05:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.