我们的系统具有使用输入队列的作业,输入队列包含需要作为输入作业的项目的ID。有几千个输入队列,每个队列包含几万到几百万个ID。一份工作通常需要从一个队列中抽取一批ID(大约20,000),这是工作。另一方面,我有一些制造商将ID推入队列。这些也是分批工作的,所以我们通常会在队列中同时插入几千至几百万个ID。管理大型“工作队列”/“输入队列”的最佳方法是什么?
我们没有使用消息系统,比如Rabbit,因为我们的生产者往往会将重复项插入队列中 - 所以最好有一个设置逻辑。此外,一旦东西被推入队列中,我们的工作就会收到通知 - 所以不需要订阅它。
队列内容是暂时的,如果发生故障,数据可能会丢失。
任何人都可以推荐如何最好地解决这个问题?
我们正在使用一个RDBMS表,其中id是主键,还有第二列标识队列。插入是使用ON DUPLICATE KEY UPDATE语法完成的,因此我们可以在单个批处理语句中执行所有操作。缺点是IO负载过高。好处是,我们可以轻松查看队列内容,并在需要手动干预的情况下轻松执行手动操作(批量插入,删除等)。
我想知道Redis是否可以成为我们的选择(使用集?) - 内存限制是什么?它是否在磁盘绑定时执行?如果我们想从Set/Queue中“取”(从&中删除),会发生什么?它是否执行或承担了大量的IO负载?
欢迎任何关于技术(我们使用基于JVM的语言)或数据库的输入!
完全自动执行redis碎片,还是必须注意它不会在单个机器上放置太多大队列 - 从而超出可用RAM?我实际上可以通过提供自定义分片函数来实现这一点,因为我对每个队列大小都有很好的估计。 –