以下情况:我正在构建一个需要冗余微服务进行故障转移或负载均衡的系统。所以我开始提供两个(或更多服务实例),例如提供数据的简单核心休息服务。
我的问题是:您将如何存储数据?使用两个JPA实例访问同一个数据库(写入和读取)将导致问题,特别是在第2层缓存和一致性方面。由于数据库必须是redundent本身(要求),因此可以使每个服务实例访问自己的数据库,但是如何同步它们呢?对此有什么共同的解决方案吗?
提前致谢!
答案 0 :(得分:0)
如果您真的需要一个多主一致的数据库,那么您几乎肯定需要在数据库层实现它。
我不会缓存事务敏感的内容。如果您确实需要这样做,并且无法指定内容可能过时的合理TTL,那么您将需要设置发布/子类型机制以使修改后的实体到期。这很大程度上取决于您的数据,它改变的频率,您可以分离可缓存数据与不可缓存数据吗?这些问题会严重影响您的缓存决策。
答案 1 :(得分:0)
如果你不想重新发明master-master复制(这将是非常重要的),我建议你选择一个支持开箱即用的数据库系统。
这不会解决您开箱即用的所有问题,但至少它解决了问题的难点。你还需要做的是例如确定并实施冲突解决策略。
主 - 主数据库系统的一个很好的选择是CouchDB。它是开源的,如果您不想自己托管数据库,也可以使用服务提供商。我确定还有其他数据库系统也提供主 - 主复制。
答案 2 :(得分:0)
您的案例中有两个完全独立的图层。 一个用于应用程序服务器,另一个用于数据库 如果你真的需要一个可扩展的系统 - 我认为你需要因为你提到负载平衡 - 那么你应该从你的应用程序中删除所有状态。 例如,您不应在应用程序实例中使用第2层缓存,而应使用某些外部服务,如redis或memcache。
您应该只使用一个主数据库实例进行写入,而另一个复制则等待故障转移。为此,我们使用的是Amazon RDS MultiAZ实例。只有一个主数据库被复制到另一个实例。在发生崩溃或其他情况下,第二个数据库会在几秒钟内自动设置为主数据库。