【问题标题】:Best architecture for designing a system with Redis & DBMS使用 Redis 和 DBMS 设计系统的最佳架构
【发布时间】:2013-12-20 22:22:22
【问题描述】:

我有一个 Web 实例,它提供大量数据和高流量。我想使用 Redis 缓存所有数据。我也想保持更新我的数据库。在“选择”请求期间,请求将被发送到一个 Redis。如果请求是“更新”或“删除”,它将同时发送 redis 和 db。

我决定放置一个“请求处理程序”层(例如 Web 服务、Web 实例、具有套接字结构的独立应用程序等)来处理所有类型的请求并将它们发送到适当的应用程序(redis 或 DBMS)。但是,如果我把那一层放在上面,我认为我不能很好地使用 Redis 的强大功能。例如,如果我的请求处理层出现故障,Redis 的平衡系统和数据保持(最小丢失)技能就变得毫无意义。另一方面,Redis 提供处理如此多的并发请求,那么我的“请求处理程序”层呢?我的系统的健康状况将取决于我的请求处理层?

我只需要您对此类系统的架构提出建议和想法。

(user1, user2, user3 ... userN) ---> 请求处理程序 ----> (Redis 或/和 DBMS)

【问题讨论】:

    标签: java architecture redis


    【解决方案1】:

    您的要求中的关键点是:

    1. 需要存储大量数据。
    2. 在 redis 上选择,在 redis 和数据库上更新/删除。
    3. 可以将消息路由到 redis 或数据库的处理程序。

    应用级别要求:

    1. 坚持
    2. 吞吐量
    3. 可伸缩性

    为了实现上述所有要点,我将应用程序分成 3 个部分:

    1. 生产者(提供大量数据)
    2. 消费者(将数据存储在 redis 或数据库上)
    3. 消息队列/代理接受大量数据,为消费者提供持久性和路由。 (如 RabbitMq)

    通过引入消息队列,我们​​将生产者和消费者分离。两者都不知道彼此的存在。

    假设消息队列为 RabbitMQ,这将是应用程序进一步工作的方式。

    生产者使用一些路由键在队列上发布消息。消费者被绑定到具有特定路由键的队列。消费者消费者消息及其路由键并执行他们的操作。

    路由键可能是:选择、更新、删除

    消费者:RedisSelectConsumer、RedisUpdateDeleteConsumer、DatabaseUpdateDeleteConsumer

    通过这种方式,我们在模块之间划分了职责。

    如果传入消息的速率很高,则增加消费者的数量。

    在主服务器出现故障时使用 REDIS 中的复制进行故障转移。

    【讨论】:

      【解决方案2】:

      我认为问题与 Redis 的能力无关。 如果您有一些不同的数据端点,则必须将它们正确路由到 redis 和/或 dbms。它们的通信方式不同,因此您应该具有路由和/或翻译层。但它不会是一个那么聪明的层。你可以这样做:

      • 如果存在,则从 redis 读取,如果不存在,则从 dbms 获取,存储在 redis 上,返回给客户端
      • 关于在 redis 上写入删除条目并在 dbms 上更新

      你可以使用redis上的复制系统来获得更强大的功能:

      master redis 链接到 dbms -> 多个 redis slave 回馈给客户端

      【讨论】:

        猜你喜欢
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 2011-10-05
        • 2012-02-24
        相关资源
        最近更新 更多