跳到主要内容

项目介绍示例

项目简介

此电商项目包括用户管理,购物功能,物流跟踪等业务模块,我在项目中主要负责购物功能以及物流跟踪两个模块的核心功能开发以及测试部署。

Situation(发生了什么情况)

公司的电商系统需要实现通知功能,一般的业务流程如下:

  1. 当客户下单时,需要通知仓库系统进行取货
  2. 当仓库出货时,需要通知物流系统进行运输
  3. 物流信息有更新时,需要更新到客户端 APP 中,方便用户查询。
project example 1

Task(任务是什么?)

现在的业务流程有两个问题

  1. 耦合度高,任意子系统的不可用会影响其他系统。例如如果仓库系统挂了的话,那么物流系统无法获取包裹的最新消息。
project example 2
  1. 扩展性差,如果要新增一个监控系统,那么监控系统需要修改所有其他系统的代码
project example 3

Action(提出了什么方案,如何解决)

方案1:对每个子系统实现集群,实现高可用,同时每个子系统开发 RPC 接口,其他子系统可以对其进行查询或者调用操作.

  • 优点:解决了以上两个问题。
  • 缺点:1)开发工作量大,每个系统都需要修改。2)资源耗费多,每个子系统都需要实现高可用 3)维护成本高,需要同时维护那么多系统的集群和 RPC 接口.

方案2:使用队列服务作为中间层,每个子系统只需要订阅自己感兴趣的主题,并且等待信息推送。

  • 优点:解决了 Task 中的两个问题,开发量少。扩展性强,新增子系统只需要订阅队列服务即可
  • 缺点:需要选择合适的队列服务,此队列服务要有几个功能 1)重试机制:保证发送失败的消息能够重试。2)持久化:能够持久化发送过的部分信息 3)消息有序性:每个消息有独立的 ID,并且先发生的事件时间戳会比迟发生的时间戳小
project example 4

Result(结果如何?)

对比之后使用方案2:

  1. 对不同的队列服务进行对比,最终选择了 RabbitMQ
  2. 使用两周时间添加了中间层服务,并且成功解决了上面两个问题
  3. 原本新增模块需要一周开发时间,现在只需要两天

面试官可能提出的问题:

  1. 如何知道信息是否推送成功?
  2. 如何对信息进行持久化?
  3. 如何保证信息的有序性?
  4. 如果保证信息至少一次送达?
  5. 发送订阅信息的时候如何保证吞吐量