微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在一个微服务域中使用 redis master 并在不同的微服务中使用 redis slave 作为一种共享数据的方式吗?

如何解决我可以在一个微服务域中使用 redis master 并在不同的微服务中使用 redis slave 作为一种共享数据的方式吗?

我有三个需要相互通信的微服务。 Microservice-1 负责数据和数据库(他对其进行写入和读取)。我将为 Microservice-1 添加一个 redis 缓存存储来缓存数据。如果数据已经在缓存存储中,我想为其他 2 个微服务放置一个 redis-slave,以减少与实际微服务的通信。由于对数据的所有更新都必须通过 Microservice-1 并且他将始终更新缓存,因此 redis 复制将确保其他两个微服务也会得到它。当然,如果数据不在缓存中,它会为数据调用Microservice-1,它会更新缓存。

我是否遗漏了什么,使用这种方法

解决方法

这肯定适用于“晴天”的情况。

但有时会有风暴,在风暴中有可能会失去缓存一致性(即 DB 和 Redis 在数据上存在分歧)。

例如,假设您让 Microservice-1 更新数据库,然后更新 Redis。如果在更新 DB 和更新 Redis 之间发生崩溃会怎样?

另一方面,如果您颠倒顺序(更新 Redis 然后更新数据库)怎么办?现在可以更新 Redis 而不是更新数据库。

这些都不是不可逾越的,但如果没有一种确保 Redis 和 DB 的 0 或 2 更新的事务方法,总会有一个时间窗口,其中更改发生在一个而不是另一个。在这种情况下,可能值得接受最终一致性(例如,定期扫描数据库并使用最近更新的记录更新 redis)。

作为对此的详细说明,带有事件溯源的命令查询职责分离 (CQRS/ES) 方法可能被证明是有用的:Microservice-1 被拆分为两个服务,一个接受命令(更新请求),另一个处理查询.现在命令服务不再更新 DB 中的一行,而是附加(在典型的 DB 中,INSERT)一个描述更改内容的事件。查询服务可以订阅这些事件并更新 Redis。其他微服务也可以订阅事件流并更新他们自己的 Microservice-1 状态视图(可以以他们想要的任何方式重新混合)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。