【发布时间】: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