
采用微服务+事件驱动架构,结合拓扑排序处理工序依赖、分布式消息队列(Kafka,配置acks=all确保消息持久化)、Redis缓存设备状态及数据库分库分表,通过异步解耦、资源隔离与容错机制,支撑每秒1000+订单请求,并保障99.9%处理成功率。
老师口吻:我们设计的系统核心是解耦与顺序性保障。订单提交后,订单调度服务先解析订单,识别设备工序的顺序依赖(如清洗后才能蚀刻),通过拓扑排序算法(如Kahn算法)将订单拆分为按工序顺序的多个阶段(例如清洗→蚀刻→光刻)。每个阶段的信息写入Kafka(主题:order-stage),设备调度服务按拓扑顺序消费并触发设备执行。
acks=all确保消息写入磁盘所有副本后才确认,避免消息丢失(影响订单处理)。device_status:D1为“空闲”),减少数据库查询压力。拓扑排序像“生产线上的工序顺序”,必须按顺序执行,否则会导致设备损坏(比如清洗未完成就蚀刻,会破坏晶圆表面)。
| 组件/策略 | 持久化配置(Kafka) | 重试机制 | 设备故障处理 |
|---|---|---|---|
| 消息队列(Kafka) | acks=all(确保消息写入磁盘后确认) | 消费失败回滚到Kafka,重试(最多3次) | 超时触发熔断,跳过任务,后续重新分配 |
| Redis缓存 | 不直接持久化,但设置随机TTL(避免雪崩) | 无(状态更新后同步) | 无,但设备状态变更后缓存同步 |
| 数据库(分库分表) | 事务支持(如分库分表的事务) | 连接失败重试(最多3次) | 事务回滚,标记设备故障 |
注意点:
订单请求示例(JSON):
{
"order_id": "WY20240401-001",
"device_ids": ["D1", "D2", "D3"],
"processes": ["cleaning", "etching", "lithography"],
"priority": "high"
}
处理流程伪代码:
order-stage,分区按设备ID哈希)。200 OK。(约90秒)
面试官您好,针对半导体晶圆制造订单调度系统,我设计的方案核心是微服务架构结合事件驱动,通过拓扑排序处理工序依赖,并利用分布式消息队列(Kafka,配置acks=all确保消息持久化)和Redis缓存设备状态,实现异步解耦与高并发处理。订单提交后,订单调度服务解析订单并拓扑排序,将阶段写入Kafka,设备调度服务按顺序消费并触发设备。消息队列解耦高并发请求与设备执行,Redis缓存设备忙闲状态减少数据库压力,数据库分库分表存储订单与设备状态。为保障99.9%成功率,消息队列配置acks=all避免消息丢失,设备故障时触发熔断降级(超时跳过任务),并重新分配到空闲设备(优先级队列)。这样系统预计可支撑每秒1000+订单请求,通过资源隔离、容错机制确保高可用。
问:如何处理设备工序的顺序性依赖?
答:通过拓扑排序算法(如Kahn算法),将订单拆分为按工序顺序的阶段,设备调度服务按拓扑顺序消费,确保工序正确性。
问:如何保证99.9%的订单处理成功率?
答:消息队列配置acks=all确保持久化,消息重试机制(最多3次),设备故障熔断降级,监控告警触发干预。
问:设备故障时如何重新分配资源?
答:设备调度服务维护空闲设备优先级队列,故障设备任务跳过,优先分配给高优先级订单,低优先级订单延迟处理。
问:系统如何水平扩容?
答:订单调度服务无状态,通过负载均衡器扩容实例;消息队列和缓存集群化,支持自动扩容。
问:如何预防消息队列积压?
答:Kafka配置足够分区数(按设备数分区),监控队列积压,当积压超过阈值时触发扩容或降级。
acks参数未设置,消息丢失影响订单处理。