
针对农产品加工供应链,采用微服务架构,将业务拆分为原料采购、生产计划、质检、销售订单及独立库存服务(避免原料采购服务职责过重,库存管理独立扩展),通过RESTful API(外部客户端)和gRPC(内部服务间)通信,结合Istio实现熔断/降级,用Kafka+Saga模式处理分布式事务(订单创建后库存减少、质检通过,失败则补偿回滚),确保数据一致性与系统稳定性。
服务拆分与职责边界:
将业务拆分为原料采购服务(聚焦原料采购订单、原料库存增减)、生产计划服务(生产任务生成与调度)、质检服务(原料/成品质检流程)、销售订单服务(订单全生命周期管理)、库存服务(独立管理原料库存,避免原料采购服务职责交叉)。
理由:库存管理需独立扩展(如多仓库、库存预警),若与原料采购服务合并,会导致职责过重,影响扩展性。类比:工厂的“采购部”只管采购和库存,“生产部”只管生产,避免一个部门管太多事。
服务间通信:
服务治理:
maxRequestsPerConnection: 100,超过则关闭接口)。分布式事务:
订单创建涉及“库存减少(原料采购服务)”和“质检通过(质检服务)”两个子事务,采用Saga模式(补偿事务),通过Kafka消息队列协调各服务状态,失败则补偿回滚(如质检失败则生产计划服务删除生产任务,库存减少失败则原料采购服务增加库存并删除生产任务)。类比:订单创建像串联电路,一个环节断掉,后续环节补偿恢复,最终达到一致。
| 特性 | RESTful API | gRPC |
|---|---|---|
| 通信协议 | HTTP/1.1/2 | HTTP/2(二进制) |
| 序列化格式 | JSON(文本) | Protobuf(二进制) |
| 性能 | 较低(JSON序列化开销大) | 高(二进制序列化,低延迟) |
| 语义 | 资源操作(GET/POST) | 方法调用(类似RPC) |
| 代码生成 | 无(需手动编写) | 代码生成工具(protoc)自动生成 |
| 适用场景 | 外部客户端(移动端、Web)、异构系统 | 内部服务间通信、高性能要求(如生产计划与质检的快速调用) |
| 注意点 | 跨域、缓存、版本控制 | 需proto文件,编译生成代码,需关注序列化字段版本 |
订单创建流程(伪代码):
POST /orders
{
"productId": "p1",
"quantity": 100,
"customer": "c1"
}
POST /production/plans
{
"productId": "p1",
"quantity": 100,
"scheduleDate": "2024-05-20"
}
POST /inventory/decrease-stock
{
"productId": "p1",
"quantity": 100
}
Saga补偿流程(若质检失败或库存减少失败):
def compensate():
for msg in kafka_consumer:
if msg.type == "质检失败":
production_plan_service.rollback_plan(msg.plan_id)
elif msg.type == "库存减少失败":
inventory_service.increase_stock(msg.product_id, msg.quantity)
production_plan_service.rollback_plan(msg.plan_id)
“面试官您好,针对农产品加工供应链管理,我设计的微服务架构是将业务拆分为原料采购、生产计划、质检、销售订单及独立库存服务(避免原料采购服务职责过重,库存管理独立扩展),通过RESTful API(用于外部移动端/Web调用)和gRPC(内部服务间高性能通信),结合Istio实现熔断(调用失败5次触发)和降级(高负载时关闭非核心接口,如查询),用Kafka+Saga模式处理分布式事务(订单创建后库存减少、质检通过,失败则补偿回滚),确保数据一致性与系统稳定性。具体来说,订单服务调用生产计划服务生成任务,质检通过后调用库存服务减少原料,若任一环节失败则通过Kafka消息触发补偿,回滚相关操作,最终保证订单创建的最终一致性。”