我们的系统的作业正在消耗输入队列,其中包含需要作为作业输入的项目ID。这些输入队列中有几千个,每个队列包含几万到几百万个ID。作业通常从一个队列(大约20.000)中获取一批ID并完成它的工作。另一方面,我有一些生产者将ID推入队列。它们也可以批量工作,所以我们经常在队列中同时插入几千个到几百万个ID。
我们没有像Rabbit一样使用消息传递系统,因为我们的生产者经常将重复数据推送到队列中 - 所以我们最好有一个设置逻辑。此外,一旦将内容推送到队列中,我们的作业就会收到通知 - 因此无需订阅它。
队列内容是临时的,如果发生故障,数据可能会丢失。
有人可以推荐如何最好地解决这个问题吗?
我们目前正在使用一个RDBMS表,其中id是主键,还有第二列标识队列。插入是使用ON DUPLICATE KEY UPDATE语法完成的,因此我们可以在单个批处理语句中完成所有操作。缺点是高IO负载。优点是我们可以轻松查看队列内容,并且非常容易执行手动操作(批量插入,删除等等),以防我们需要手动干预。
我想知道Redis是否可以成为我们的选择(使用套装?) - 内存限制怎么样?它是否在磁盘绑定时执行?如果我们想从Set / Queue中“获取”(获取和删除)内容会发生什么?它是否会对IO执行或承担大量负载?
欢迎任何输入,无论技术(我们使用基于JVM的语言)或数据库,都欢迎!
答案 0 :(得分:0)
如果您只存储ID,那么redis及其设置就是完美的工具。它处理唯一性,没有慢速sql部分,SPOP
可以一次弹出多个项目(但是随机选择)。
但是,当数据量超过可用内存时,它不能很好地工作,因此您应该考虑到这一点(只需获得足够的RAM)。从好的方面来说,每笔交易都没有I / O! :)
这些输入队列中有几千个,每个队列包含几万到几百万个ID
根据ID的大小,此数据集可能存在问题,无法放在一台计算机上。由于您一次只使用一个队列(正确吗?),因此您可以安全地部署redis群集,这将在多台计算机上对数据集进行分片。