我正在开发一个项目,我想使用这种模式。我已经读了好几天了,但我仍然不确定如何正确实现此模式并使多个数据库保持同步。
让我们假设以下情况(这只是一个演示示例):
我们有一个简单的 REST 服务(spring-boot java 应用程序):它接收日期和水表状态(当前消耗量)。如果传入日期/状态晚于上次记录的消耗量,该服务将保存新报告的水表状态。
获取请求通过 HTTP REST GET 端点提供服务,保存/写入请求通过 Kafka 主题到达服务(使用消息/命令模式)。
此应用程序安装在多台主机上。每个应用程序都使用其本地数据库:
instance-A
和 instance-B
端点剩余 URL 自动注册到服务注册表 (
consul
)。
实例-A正确保存新的消耗。
但是实例 B 在尝试保存相同的传入数据时抛出异常。实例 B 开始处理错误:它回滚消息,重复该过程 10 次,然后将传入请求发送到死信主题或执行类似操作。
与此同时,当实例 B 正在玩错误处理游戏时,同一客户 ID 要求查看最后记录的消费。第一个请求到达 GET 端点 1(URL 来自服务注册表,循环),并且服务提供最新消耗的有效响应。
来自同一客户的下一个请求到达 GET 端点 2。这提供了不同的响应(之前的消耗),直到步骤 6 中出现的错误以某种方式修复(可能是手动修复)。
这里的解决方案是什么?
我想到的一个解决方案是: 当第 6 步中出现异常时,服务会使用自己的断路器(或其他方式)自动切断其连接,并且服务注册表会自动取消注册此特定的不可用(但仍在运行)的服务 URL。因此,在问题以某种方式解决之前,此实例将不再提供 GET 请求。
但这是一个复杂的流程,我认为资源有限的项目没有足够的时间/人员/预算来正确实施这一点。
那么也许这种模式只有大公司才能使用?
如果小型项目花更多钱购买功能强大的数据库服务器,并将这个巨大的数据库放在同一微服务的所有实例后面,那就更好了。
是否有任何简单的方法可以自动保持同一微服务的多个实例背后的多个数据库同步?
让我们检查一下您引用的模式:https://microservices.io/patterns/data/database-per-service.html
这并不是说我们应该为同一微服务的每个实例使用单独的数据库。它是“每个服务一个数据库”,而不是“每个实例一个数据库”。
如果您确实需要每个实例一个本地数据库,那么请寻找其他模式。 或者,重新考虑一下您是否真的需要本地数据库,也许您会想出更简单的架构?