并发更新问题
来源:5-3 提到阻塞队列,你是不是感觉到很懵
阿斯拉菲
2020-11-23
一哥,你好,
假设有一个接口(统计数据的上报),峰值是20次/s,
接口内部的逻辑执行(蛮复杂的json聚合操作)至少需要1s,
然后最终可能更新的是MySQL中同一条记录
请问一哥,这种情况下需要考虑并发的问题吗?
如果不需要请忽略下面的问题。。。
我目前的做法是在redis中设置3个list,
然后根据接口数据中属于同一条记录的字段hash到对应的list中,
开启三个线程分别从list pop去执行逻辑处理,不知道这样的设计方案是否合理?一哥有什么建议呢
写回答
1回答
-
阿斯拉菲你好:
首先来说,这样的问题是一定需要考虑并发的。但是,你有没有思考过:
(1)接口有没有可能再优化,接口 1s 的延迟真的可以被接受吗?
(2)峰值 20 QPS,而接口的单次处理需要 1s,那么,是否可以考虑异步去做呢?
我这里提供一个思路:前提是不需要考虑强一致性,考虑的是最终一致性。把所有的请求信息序列化到 Kafka 里面,或者任何一个你觉得可以作为消息队列(Redis 也可以)的容器中。然后,用单独的线程去依次消费这些 Task。这个接口访问不频繁,且计算很多。我觉得这是比较合理的做法。
你目前的做法也是可行的,不过,我个人觉得还是稍稍的麻烦一些。你只需要在 Redis 开一个队列就好了,所有的请求过来之后,队尾加入,从队列头部依次获取到每一个请求任务,然后实现更新就好了。
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
112020-11-23
相似问题