【问题标题】:Best way to manage large "work queues" / "input queues"?管理大型“工作队列”/“输入队列”的最佳方式?
【发布时间】:2016-11-27 02:54:21
【问题描述】:

我们的系统有一些作业正在使用包含需要作为作业输入的项目 ID 的输入队列。有几千个这样的输入队列,每个队列包含从几万到几百万个 id。一项工作通常从一个队列(大约 20.000)中获取一批 id 并完成它的工作。另一方面,我有一些生产者将 id 推入队列。这些也分批工作,因此我们经常将几千到几百万个 id 同时插入到队列中。

我们没有使用像 Rabbit 这样的消息传递系统,因为我们的生产者经常将副本推送到队列中 - 所以我们最好有一套逻辑。此外,一旦将内容推入队列,我们​​的工作就会收到通知 - 因此无需订阅它。

队列内容是临时的,如果失败,数据可能会丢失。

谁能推荐如何最好地解决这个问题?

我们目前正在使用一个 RDBMS 表,其中 id 是主键,还有一个用于标识队列的第二列。插入是使用 ON DUPLICATE KEY UPDATE 语法完成的,因此我们可以在单个批处理语句中完成所有操作。缺点是IO负载高。好处是我们可以很容易地查看队列内容,并且很容易地执行手动操作(批量插入、删除等),以防我们需要手动干预。

我想知道 Redis 是否可以成为我们的选择(使用 Sets?)——内存限制呢?它在磁盘绑定时执行吗?如果我们想从 Set / Queue 中“获取”(获取和删除)东西会发生什么?它是否执行或对 IO 施加了很大的负载?

欢迎提出任何意见,无论是关于技术(我们使用基于 JVM 的语言)还是数据库!

【问题讨论】:

    标签: mysql redis messaging producer-consumer


    【解决方案1】:

    如果您只存储 id,那么 redis 及其集合是完成这项工作的完美工具。它处理唯一性,没有那么慢的 sql 部分,SPOP 可以一次弹出多个项目(虽然是随机选择的)。

    但是,当数据量超过可用内存时,它就不能很好地工作,所以你应该考虑到这一点(只要获得足够的内存)。从好的方面来说,每笔交易都没有 I/O! :)

    有几千个这样的输入队列,每个队列包含从几万到几百万个 ID

    根据 id 的大小,此数据集可能无法容纳在一台机器上。由于您一次只使用一个队列(对吗?),您可以安全地部署 redis 集群,它将数据集分片到多台机器上。

    【讨论】:

    • redis 是否完全自动分片,还是我必须注意它不会在一台机器上放置太多大队列 - 从而超出可用 RAM?实际上,我可以通过提供自定义分片功能来做到这一点,因为我对每个队列大小都有很好的估计。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多