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

2020-01-10 10:49:53 +08:00
 louislivi

需求是这样:

目前我的解决方法:

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

2395 次点击
所在节点    Java
5 条回复
laravel
2020-01-10 11:08:34 +08:00
用队列吧,1 分钟之内如果加入队列的超过 150 就丢弃
snowfuck
2020-01-10 11:22:29 +08:00
这样行不行:
内存中维护一个 map,通过 id 取出用户数据,然后通过互斥锁来更新。对一个用户更新时,要先获取到这个用户的锁,获取不到则等待。对不同用户更新其实就没关系,直接从 map 中根据用户 id 取出来对应用户数据更新即可。
orzorzorzorz
2020-01-10 17:43:13 +08:00
云一下。频率那么高,不如建一个持久链接,监听服务器的全局变量,事件触发更新。用户发起操作数据,先看看全局变量是不是在被操作,如果是就返回个 pending 的状态,等操作完再从服务器发个请求过去。
KentY
2020-01-10 23:30:36 +08:00
"每个用户需要进行数据更新" 每个用户是只要更新自己的数据么? 数据是存储在数据库么?
louislivi
2020-01-13 09:07:53 +08:00
@KentY 数据是通过接口获取的,然后存在自己的数据库中 就类似一个爬虫这种。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/636730

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX