如何用多个线程顺序读取缓存队列? -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

如何用多个线程顺序读取缓存队列?

2016-02-29 17:01:05 2854 1

我定义了一个数据缓存(ArrayBlockQueue),用多个线程去读取缓存,并将数据写入到数据库中。 现在的问题是这样的:由于缓存中存放的是用户的行为数据,所以入库的时候每个用户各自的数据需要严格按照时间来入库,但多线程下是无法保证这种顺序性的。
思考了一下,想用这种方式来做:队列中不同用户的数据不需要考虑顺序,两个线程随意读取;但一个用户的数据只能由某个特定线程去读取,这样数据进入队列时的时序性就能够保证入库的时序性了。
有没有比较简单的方法来实现呢?

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:50:35

    这其实是一个生产/消费模型中的一个问题: 顺序消费的问题.(假定生产者已将数据按照顺序放入队列)
    最开始能想到的方法:
    单线程消费, 这样就严格保证了顺序.
    但带来的问题是消费速度慢, 特别是这种插入关系型数据库(耗IO)的行为, 这样就会导致队列全满, 从而有可能影响到生产者, 或者是丢失数据, 消耗内存.
    可以从两个方面解决:

    仍然保持单线程消费, 而提高后端的消费速度, 从题主的case看, 记录的只是用户的行为日志, 很多时候, 日志只需要进行append即可, 即顺序写磁盘, 或者写类似于HBase等LSM tree的数据库.(当然也会带来查询上的问题).

    单线程换成多线程, 题注的case中,只关注单个用户的顺序性, 所以可以对用户进行分区(比如简单的hash).
    可以对队列进行分区, 也可以对消费线程进行分区, 从而达到并行的效果.
    另外, 从题主的描述来看, 我猜想可能是个 web 应用, 并且使用了内存队列作为操作日志的缓存, 再通过异步线程去写入这些日志.
    这里需要注意的是, 如果你的部署结果是 N台web + 前端负载, 那么还需要注意前端负载对用户的路由策略, 如果全局的用户操作日志已经没有顺序了, 那么单机再怎么严格顺序, 也没有意义.

    0 0
相关问答

1

回答

一个broker开一个queue可不可以保证他的数据顺序一制呢?

2022-10-27 19:48:55 85浏览量 回答数 1

1

回答

延迟队列与线程池的组合使用,存在疑问

2022-03-10 09:24:17 684浏览量 回答数 1

1

回答

异步队列复制怎么理解?

2022-01-11 15:40:09 121浏览量 回答数 1

1

回答

Apache中如果不在对齐过程中阻塞已收到barrier的数据管道,会发生什么?

2021-12-07 22:11:38 552浏览量 回答数 1

1

回答

数据队列是什么意思?

2021-12-04 22:32:09 310浏览量 回答数 1

1

回答

一直往阻塞队列阻塞放数据会发生什么?? 400 报错

2020-06-05 16:38:31 309浏览量 回答数 1

1

回答

有三个线程T1,T2,T3,怎么确保它们按顺序执行?

2020-04-10 14:06:32 1694浏览量 回答数 1

1

回答

多线程如何处理读写数据问题呀,求解答一个大概思路?

2019-12-23 10:05:05 596浏览量 回答数 1

5

回答

请教一个Java并发的问题:volatile变量的读取每次都是从主内存中获取么?

2019-03-20 00:21:30 4364浏览量 回答数 5

2

回答

如何验证Greenplum的资源队列对于不同优先级的队列的cpu的限制,我把相同语句同时放入不同级别的队列里发现耗时都差不多,验证好久都没看出什么效果?

2019-01-13 18:40:59 2028浏览量 回答数 2
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
文章
问答
问答排行榜
最热
最新
相关电子书
更多
AGit-flow:新一代高效Git协同模型
立即下载
云时代开发者能力模型与提升之道
立即下载
云+通信:智能通信服务
立即下载