2016-07-23 73 views
0

我们的系统具有使用输入队列的作业,输入队列包含需要作为输入作业的项目的ID。有几千个输入队列,每个队列包含几万到几百万个ID。一份工作通常需要从一个队列中抽取一批ID(大约20,000),这是工作。另一方面,我有一些制造商将ID推入队列。这些也是分批工作的,所以我们通常会在队列中同时插入几千至几百万个ID。管理大型“工作队列”/“输入队列”的最佳方法是什么?

我们没有使用消息系统,比如Rabbit,因为我们的生产者往往会将重复项插入队列中 - 所以最好有一个设置逻辑。此外,一旦东西被推入队列中,我们的工作就会收到通知 - 所以不需要订阅它。

队列内容是暂时的,如果发生故障,数据可能会丢失。

任何人都可以推荐如何最好地解决这个问题?

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

我想知道Redis是否可以成为我们的选择(使用集?) - 内存限制是什么?它是否在磁盘绑定时执行?如果我们想从Set/Queue中“取”(从&中删除),会发生什么?它是否执行或承担了大量的IO负载?

欢迎任何关于技术(我们使用基于JVM的语言)或数据库的输入!

回答

0

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

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

还有那些输入队列几千元,并且每个队列从几十到几千包含多达几百万IDS

取决于大小的id,这个数据集可能在单台机器上安装会有问题。由于您一次只能使用一个队列(正确?),因此可以安全地部署redis群集,这将在多台机器上分割数据集。

+0

完全自动执行redis碎片,还是必须注意它不会在单个机器上放置太多大队列 - 从而超出可用RAM?我实际上可以通过提供自定义分片函数来实现这一点,因为我对每个队列大小都有很好的估计。 –