微服务设计:应采用极简无冗余模型还是带数据冗余的模型?
微服务模型的两种设计方案及问题分析
方案一:跨服务同步查询模式
我有两个分属不同微服务的模型,第一种设计如下:
public class Order { public Guid Id { get; set; } public Guid ItemId { get; set; } public int Quantity { get; set; } public DateTime CreatedAt { get; set; } public OrderStatus Status { get; set; } } public class Delivery { public Guid OrderId { get; set; } public string Address { get; set; } = null!; public Guid WarehouseId { get; set; } = null!; public DeliveryStatus Status { get; set; } }
这种设计下,如果Delivery微服务需要获取特定订单的详情,必须通过Rest等方式同步查询Order微服务,存在高耦合、同步性能瓶颈的问题。
方案二:数据冗余+异步事件同步模式
另一种设计方式是让每个微服务存储自身运行所需的全部信息,无需跨服务查询:
public class Order { public Guid Id { get; set; } public Guid ItemId { get; set; } public int Quantity { get; set; } public DateTime CreatedAt { get; set; } public string Address { get; set; } = null!; public string WarehouseName { get; set; } = null!; public OrderStatus Status { get; set; } public DeliveryStatus DeliveryStatus {get;set;} } public class Delivery { public Guid OrderId { get; set; } public Guid ItemId { get; set; } public int Quantity { get; set; } public DateTime CreatedAt { get; set; } public string Address { get; set; } = null!; public Guid WarehouseId { get; set; } = null!; public DeliveryStatus Status { get; set; } }
当DeliveryStatus这类共享属性发生变更时,执行变更的微服务会发布OrderDeliveryDetailsChanges事件,携带最新的DeliveryStatus,其他微服务通过消息代理异步同步数据。
但这种方案存在两个明显问题:
- 事件投递失败可能导致数据不一致;
- 存在数据冗余:比如Delivery服务存储
WarehouseId更节省内存,而Order服务存储WarehouseName效率更低——毕竟仓库信息只是数据库里的字典条目。
内容的提问来源于stack exchange,提问作者Nathan Ikazuyir
相关产品推荐
相关产品推荐

