You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微服务设计:应采用极简无冗余模型还是带数据冗余的模型?

微服务模型的两种设计方案及问题分析

方案一:跨服务同步查询模式

我有两个分属不同微服务的模型,第一种设计如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:57:03