首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis企业(分片)可靠队列

Redis企业(分片)可靠队列
EN

Stack Overflow用户
提问于 2017-07-23 06:24:06
回答 1查看 561关注 0票数 0

我正在处理一个我认为需要排队的应用程序。我已经打算在应用程序中使用Redis Enterprise,所以在队列中使用Redis是有意义的。Redis为队列提供了一些有用的命令:https://redis.io/commands/rpoplpush#pattern-reliable-queue。我有插入记录的生产者和处理和删除记录的使用者。我可以很容易地使生产者和消费者的规模水平。因此,在规模上,瓶颈将是Redis,因为队列只能存储在单个碎片上。是否有一种在多个碎片之间分发队列的好方法?我能想出的唯一解决方案是建立多个队列,并以某种方式确保每个队列散列到一个不同的碎片。但是,这将需要在Redis被重发时更改生产者、消费者和队列密钥,这并不理想。

我打算使用队列对数据库中的插入记录进行批处理。生产者是接收请求和生成记录的web服务器。但是,在流量高峰期间,数据库将无法跟上单行插入的速度。我不能仅仅在web服务器上缓冲请求,因为当web服务器失败时,所有缓冲记录都会丢失。由于复制,Redis队列提供了容错功能。使用者可以在执行插入之前从队列中弹出多条记录,以减少数据库的负载。但规模还不够大。有没有更好的解决方案,我错过了?还是雷迪斯不是个合适的人选?

任何建议都将不胜感激!

编辑:

我已经开始使用与@Itamar讨论的方法创建一个库。可在此获得:https://github.com/fenichelar/BQueue

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 08:28:17

一个单一的Redis数据结构,例如一个列表,确实不能被切分。需要问的第一个问题是,您的缩放关注点是否合理--一个Redis shard可以轻松地执行10 s(如果不是1000 s/秒的话),而这种吞吐量可以发挥很大的作用。

假设单个键/数据结构/碎片不足以满足您的需要(就吞吐量而言),那么您使用多个键的直觉确实是实现水平扩展的方法。

以某种方式确保每个队列散列到不同的碎片。

实际上,这有点过头了,海事组织。默认的哈希函数通常是足够好的,因此如果您选择一个合理数量的键/队列(例如10或42),则大多数情况下您将得到跨时隙的可靠分布。

但是,这将需要在Redis被重发时更改生产者、消费者和队列密钥,这并不理想。

我不同意。首先,您需要记住,重新分配和集群拓扑在一般情况下都是非常罕见的。我不是说它们不会发生,但它们通常是由人们计划和管理的。其次,更重要的是,即使发生了这样的更改,并且散列槽在碎片之间穿梭,在同一个节点上结束的所有/大部分/许多队列的概率仍然很低(参见上文)。最后,如果您的所有键最终都放在一个碎片上,那么您以后总是可以手动地重新洗牌/迁移它们,以便平衡负载(使用Redis Enterprise的UI/CLI/API非常容易)。

最重要的是,您不需要更改密钥名称、生产者和/消费者。

观点:我认为Redis非常适合在另一个db/存储区前面使用更新缓冲区,因为它速度较慢,无法处理峰值。

免责声明:我在Redis实验室工作,这里是开源Redis的家,也是Redis Enterprise的供应商。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45262173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档