Database Per Service模式实践:微服务多实例数据库自动同步方案咨询
Database Per Service模式的同步与实现疑问
我正在推进一个计划采用Database Per Service模式的项目,已经查阅多日资料,但仍不确定如何正确实现该模式并保持多数据库同步。
场景示例
- 我们有一个基于Spring Boot的Java REST服务:接收日期和水表状态(当前用水量数值),若传入的日期/状态晚于最后记录的用水量,则保存新上报的水表状态。
- 查询请求通过HTTP REST GET端点处理,写入/保存请求通过Kafka主题(采用消息/命令模式)送达服务。
- 该应用部署在多台主机上,每个实例使用本地数据库:
instance-A和instance-B。 - REST端点URL自动注册到服务注册中心
consul。 - Instance-A成功保存了新的用水量数据。
- 但Instance-B在尝试保存相同传入数据时抛出异常,随后启动错误处理:回滚消息、重试10次后将请求发送至dead-letter-topic或执行类似操作。
- 在此期间,同一客户ID查询最新记录的用水量,第一个请求通过服务注册中心的轮询机制路由到GET endpoint-A,返回最新用水量的有效响应。
- 同一客户的下一个请求路由到GET endpoint-B,返回旧的用水量数据,直到步骤6的问题被手动修复。
解决方案探讨
我想到的一种方案:当步骤6出现异常时,服务通过自身的断路器自动切断HTTP GET连接,服务注册中心自动注销该实例的URL,直至问题修复前不再处理GET请求。或许还需切断Kafka连接,避免数据保存顺序错误(消息顺序至关重要),但对此不确定。
小项目适用性疑问
上述流程较为复杂,资源有限的小项目可能缺乏足够的时间、人力和预算来正确实现。难道该模式仅适用于大型企业?或许小项目更适合投入更多成本使用高性能数据库服务器,让所有微服务实例共享一个集中式数据库。
核心问题
是否存在简单的方法,可自动保持同一微服务多实例背后的多个数据库同步?
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

