我们使用 Redis 2.8.17 作为 JobQueue。
我们使用 RPUSH 和 BRPOPLPUSH 来创建可靠的队列。
根据我们当前的设计,多个应用程序服务器将(RPUSH)作业推送到单个作业队列。由于 BRPOPLPUSH 操作在 Redis 中是原子操作,因此作业稍后将被弹出 (BRPOPLPUSH) 并由任何服务器的使用者进行处理。
由于应用服务器能够横向扩展,我有点担心 REDIS 将来可能会成为瓶颈。
我从有关 redis 分区的文档中了解到以下内容: “不可能像非常大的排序集那样使用单个大键对数据集进行分片”
我想知道对应用服务器的队列进行预分片是否是横向扩展的唯一选择。
上面的设计中,集群有什么作用吗?
最佳答案
您需要考虑的主要事情是是否需要分片。整个 StackExchange 网络(不仅仅是 StackOverflow——所有网络)运行于 2 个 Redis 服务器(我很确定其中一个服务器只是为了冗余而存在),它非常积极地使用它。看看http://nickcraver.com/blog/2013/11/22/what-it-takes-to-run-stack-overflow/
Redis 的速度快得离谱(并且非常节省空间),但只有一个警告:删除整个列表/集合/排序集/哈希的时间复杂度为O(n)
,其中 n
是它包含的元素数量。只要您不这样做(诸如 RPOP
、BRPOP
、BRPOPLPUSH
等操作不算 - 这些都是常量时间),你应该是金色的。
TLDR:除非您计划比 StackOverflow 更大,否则不需要分片,尤其是对于简单的作业队列。
关于java - 用于分发(分片)集合(如列表、集合等)键的任何解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013866/