【问题标题】:How do change streams work in mongo across multiple instances?变更流如何在 mongo 中跨多个实例工作?
【发布时间】:2021-08-11 22:18:05
【问题描述】:

假设我有两个数据中心,每个数据中心有 3 个实例,运行相同的代码,连接到单个 MongoDB 和单独的 Redis 数据库。

Redis A <----> Data Center A
                            |
                            |--------> MongoDB
                            |
Redis B <-----> Data Center B

期望是,当 Mongo 中的某个集合更新时,会触发 Data Center A 和 B 中的一个 change stream 来清除 redis 缓存。它适用于变更流吗?

【问题讨论】:

    标签: mongodb spring-boot redis changestream


    【解决方案1】:

    当您在 n 个节点/实例上运行更改流代码时,每个实例都将接收更改事件,并且基于该事件和更改流中的数据,您可以进行业务逻辑/redis 清理。

    1. 假设您在数据中心 A 上运行了更改流侦听器 (CS1),并且该数据中心有 redis 服务器 A,您希望在特定条件下从 DB 更改事件中清理它。
    2. 假设您在数据中心 B 上运行了另一个更改流侦听器 (CS2),并且该数据中心有 redis 服务器 B,您希望在特定条件下从 DB 更改事件中清理它。
    3. changestream 侦听器(CS1 和 CS2)都侦听相同的 DB 和相同的集合。
    4. 当集合发生任何更改时,两个更改流侦听器(CS1 和 CS2)都会收到更改事件
    5. CS1 将具有清理 redis A 的逻辑,CS2 将具有清理 redis B 的逻辑,因此当更改事件发生且满足条件时,您的两个 redis 服务器都将被清理。

    【讨论】:

    • 他们是否有可能在某个时候停止工作。我测试了一天,它们都被清除了。第二天测试,只有一个被清除了。必须重新启动其中一个数据中心才能使一切恢复正常。
    • 您是否在 changestreamlister 应用程序日志中看到任何错误? changestream 还提供恢复令牌功能。因此,您可能会监控您的变更流应用程序日志,并且当发生错误时,您可以简单地使用恢复令牌重新启动应用程序。当您收到更改事件时,您需要将该恢复令牌存储在一些存储中,如 redis 或 DB 等,并在更改流重新启动时收听更改流并执行恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多