【问题标题】:How to store shared-by-same-instances data in spring microservices architecture如何在 Spring 微服务架构中存储相同实例共享的数据
【发布时间】:2016-02-21 16:29:58
【问题描述】:

以下情况:我正在构建一个需要冗余微服务以进行故障转移或负载平衡的系统。因此,我正在启动两个(或多个服务实例),例如提供数据的简单核心休息服务。

我的问题是:您将如何存储数据?使用两个 JPA 实例访问同一个数据库(写入和读取)会导致问题,尤其是在第 2 层缓存和一致性方面。由于数据库本身必须是冗余的(要求),因此可以让每个服务实例访问自己的数据库,但是您将如何同步它们呢?有什么通用的解决方案吗?

提前致谢!

【问题讨论】:

    标签: jpa database-design architecture spring-cloud microservices


    【解决方案1】:

    如果你真的需要一个多主一致的数据库,那么你几乎肯定需要在数据库层实现它。

    我不会缓存事务敏感的东西。如果您确实需要这样做,并且无法指定合理的 TTL 以使内容过时,那么您将需要设置 pub/sub 类型的机制来使修改的实体过期。很多这真的取决于你的数据,它多久改变一次,你能区分可缓存数据和不可缓存数据吗?这些问题会严重影响您的缓存决策。

    【讨论】:

      【解决方案2】:

      如果您不想重新发明主-主复制(这将非常重要),我建议您选择一个开箱即用支持此功能的数据库系统。

      这不会立即解决您的所有问题,但至少可以解决问题的难点。您仍然需要做的是例如定义和实施冲突解决策略。

      主-主数据库系统的一个不错的选择是CouchDB。它是开源的,也有可用的服务提供商,以防您不想自己托管数据库。我敢肯定还有其他数据库系统也提供主-主复制。

      【讨论】:

        【解决方案3】:

        在您的情况下,有两个完全独立的层。 一个用于应用程序服务器,另一个用于数据库。 如果你真的需要一个可扩展的系统——我认为你需要,因为你提到了负载平衡——那么你应该从你的应用程序中删除所有状态。 例如,您不应在应用程序实例中使用第 2 层缓存,而应使用一些外部服务,如 redis 或 memcache。

        您应该只使用一个主数据库实例进行写入,另一个复制等待故障转移。为此,我们使用了 Amazon RDS MultiAZ 实例。只有一个主数据库被复制到另一个实例。如果发生崩溃或其他情况,第二个数据库会在几秒钟内自动设置为主数据库。

        【讨论】:

        • 我同意主/从数据库系统。但是我将至少有两个访问相同数据的微服务实例。使用jpa如何实现?
        • 什么意思?您正在将两个实例部署到不同的机器上,对吗?那么这只是两个不同的实例访问同一个数据库,这是很正常的情况。
        猜你喜欢
        • 2015-06-10
        • 2020-01-26
        • 2019-05-10
        • 1970-01-01
        • 2019-02-01
        • 2019-08-19
        • 2016-05-22
        • 1970-01-01
        • 2019-06-11
        相关资源
        最近更新 更多