# 9. RabbitMQ 实战外卖后端系统
核心思想:
- AMQP 协议直接定义了 RabbitMQ 的内部结构和外部行为。
- 使用 RabbitMQ 本质上就是在使用 AMQP 协议。
- 发送者不能直接将消息发送给最终队列,必须发给交换机。
- 消息根据路由规则和交换机转发给队列。
- 消费者从队列将消息取走。
- 交换机数量不宜过多,一般来说同一个业务,或者同一类业务使用同一个交换机。
- 合理设置队列数量,一般来说一个微服务监听一个队列,或者一个微服务的一个业务监听一个队列。
- 合理配置交换机类型,使用 Topic 模式时仔细设置 binding key。
- 尽量使用自动化配置,将创建交换机/队列的操作固化在应用代码中,免去复杂的运维操作,高效且不易出错。
- 一般来说,交换机由双方同时声明,队列由接收方声明并配置绑定关系。
- 交换机/队列的参数一定要由双方开发团队确认,否则重复声明时,若参数不一致会导致声明失败。
# 9.1 需求分析
# 9.1.1 需求分析
- 一个外卖后端系统,用户可以在线下单外卖。
- 用户下单后,可以实时查询订单进度。
- 系统可以承受短时间的大量并发请求。
# 9.1.2 架构设计
使用微服务系统,组件之间充分解耦。
微服务架构即是将应用程序构建为松耦合的、可独立部署的一组服务。
服务:一个单一的、可独立部署的软件组件,实现了一些有用的功能。
松耦合:封装服务的实现细节,通过 API 调用。
使用消息中间件,解耦业务逻辑。
使用数据库,持久化业务数据。
# 如何拆分微服务?
1. 根据系统操作进行微服务拆分。
2. 根据业务能力进行微服务拆分。(推荐使用)
3. 根据子域进行微服务拆分。
# 9.1.3 微服务拆分
- 订单获取和履行 —— 订单微服务
- 供应商和产品管理 —— 商家微服务
- 送餐、骑手管理 —— 骑手微服务
- 记账与结算 —— 结算微服务
- 积分管理 —— 积分微服务
# 9.1.4 业务流程
# 9.1.5 接口需求
- 新建订单
- 查询订单
- 接口采用 RestFul 风格
# 9.1.6 数据库设计
- 每个微服务使用自己的数据库(至少是自己的一个数据表)。
- 不要使用外键,对于数据量非常少的表慎用索引。