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

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

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

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

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

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

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

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

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

    0 0
相关问答

1

回答

代码执行顺序如何查看?

2022-05-30 23:40:08 165浏览量 回答数 1

1

回答

数据制作过程中,如何能从Kafka得到准确的信息?

2021-12-12 09:51:29 91浏览量 回答数 1

1

回答

在性能优化中,如何查看每个进程的上下文切换详情?

2021-10-18 19:02:12 228浏览量 回答数 1

1

回答

iBATIS 查询多个实例的配置 - iBATIS报错

2020-06-03 13:05:39 394浏览量 回答数 1

1

回答

如何查找被云盾删除的后门程序?

2020-03-27 17:23:43 328浏览量 回答数 1

1

回答

您如何确定流程父级的PID

2020-01-03 16:03:49 617浏览量 回答数 1

1

回答

在程序中this和super调用构造方法时可以同时出现。

2019-11-21 14:28:02 226浏览量 回答数 1

1

回答

IIS如何配置缓存规则?

2018-02-06 17:25:03 728浏览量 回答数 1

0

回答

搜索引擎人工智能让网站优化如何自处

2017-12-01 10:02:05 2862浏览量 回答数 0

1

回答

C++如何简单读取顺序文件

2016-03-06 15:53:01 2006浏览量 回答数 1
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
文章
问答
问答排行榜
最热
最新
相关电子书
更多
多IO线程优化版
立即下载
用户态高速块缓存方案
立即下载
低代码开发师(初级)实战教程
立即下载