【问题标题】:Redis Enterprise (sharding) reliable queueRedis Enterprise(分片)可靠队列
【发布时间】:2017-12-28 22:51:30
【问题描述】:

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

我打算使用队列将记录批量插入数据库。生产者是接收请求并生成记录的 Web 服务器。但是在流量高峰期,数据库将无法跟上单行插入的速度。我不能只缓冲 Web 服务器上的请求,因为当 Web 服务器出现故障时,所有缓冲的记录都会丢失。由于复制,Redis 队列提供了容错能力。消费者可以在执行插入之前从队列中弹出多条记录,以减轻数据库的负载。但它的规模不够大。我缺少更好的 Redis 解决方案吗?还是 Redis 不合适?

任何建议将不胜感激!

编辑:

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

【问题讨论】:

    标签: architecture redis queue software-design


    【解决方案1】:

    单个 Redis 数据结构,例如 List,确实不能分片。需要问的第一个问题是您的扩展问题是否合理 - 单个 Redis 分片可以轻松地执行 10 秒(如果不是 100 秒)的 1000 秒操作/秒,并且这种吞吐量可以有很长的路要走。

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

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

    实际上,这有点过头了。默认散列函数通常足够好,因此如果您选择合理数量的键/队列(例如 10 或 42),您很可能会在插槽中获得可靠的分布。

    但这需要在 Redis 重新分片时更改生产者、消费者和队列键,这并不理想。

    我不同意。首先,您需要记住,特别是重新分片和集群拓扑通常发生变化是非常罕见的。我并不是说它们不会发生,但它们通常是由人计划和管理的。其次,更重要的是,即使发生此类更改并且哈希槽在分片之间穿梭,所有/大多数/许多队列在同一节点上结束的机会仍然非常低(见上文)。最后,如果您的所有密钥确实都在一个分片上,您可以随时手动重新洗牌/迁移它们以平衡负载(使用 Redis Enterprise 的 UI/CLI/API 非常容易)。

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

    意见:我认为 Redis 非常适合在另一个较慢且无法处理峰值的数据库/存储之前的更新缓冲区。

    免责声明:我在 Redis Labs 工作,这是开源 Redis 的发源地和 Redis Enterprise 的提供者。

    【讨论】:

    • 集群需要每秒处理 10,000 次插入。所以至少有 30,000 笔交易(lpush、rpoplpush、lrem)。大约 2,000,000 次非队列相关事务/秒。
    • 每个队列确实需要 2 个队列。那么对于 Redis Enterprise 分片,是否需要使用花括号来命名 2 个队列,以确保它们映射到同一个分片以使 rpoplpush 工作?
    • 另外,希望在接下来的几周内开始使用 Redis Enterprise :)
    • 所以有了多个队列,我需要一个队列列表来分配负载。这意味着如果我想更改队列的数量,我需要更新我的消费者和生产者中的代码。或者我可以使用 Redis 集来存储队列。但这会产生另一个热点问题。同样在删除队列时,我需要在删除队列之前继续处理旧记录。可能为消费者设置一组队列,为生产者设置另一组队列。并在每个客户端缓存一段时间,以消除热键问题。
    • wrt througput - 听起来很理智。 wrt curlies - 没错,在 OSS 和 Enterprise 中。 wrt Enterprise - 如果需要,请随时联系我们的支持。 wrt 最后评论 - 我不清楚,cmets 是一种糟糕的交流方式。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2015-06-25
    • 1970-01-01
    • 2017-03-28
    • 2015-03-15
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多