如何设计一个网约车系统?

网约车平台,核心功能是将乘客的叫车订单发送给附近的网约车司机。

司机接单后,到上车点接乘客并送往目的地,到达后,乘客支付订单。

整体架构

两个APP应用:

  • 一个是给乘客的,用来叫车。

  • 一个是给司机的,用来接单。

image-20240815125006200

网关处理叫车请求的过程是:

网关首先调用订单微服务,为用户的叫车请求创建一个订单,订单微服务将订单记录到数据库中,并将订单状态设置为创建。

然后网关调用叫车微服务,叫车微服务将用户信息、出发地、目的地等数据封装成一个消息,发送到消息队列,等待系统为订单分配司机。

面向司机的:

司机需要不停将自己的位置信息发送给平台,同时,还需要随时接收来自平台的指令。

因此,不同于用户通过HTTP发送请求给平台,司机App需要通过TCP长连接和平台服务器保持通信。

前面已经写入到消息队列的乘客叫车订单信息,分单子系统作为消息消费者,从消息队列中获取并处理。

分单子系统首先将数据库中的订单状态修改为派单中,然后调用派单引擎进行派单。

派单引擎根据用户的上车出发地点,以及司机上传的地理位置信息进行匹配,选择最合适的司机进行派单。

派单消息通过一个专门的消息推送服务进行发送,消息推送服务利用TCP长连接服务器,将消息发送给匹配到的司机,同时分单子系统更新数据库订单状态为已派单。

长连接管理

TCP是长连接,一旦建立了连接,连接通道就需要长期保持,不管是司机App发送位置信息给服务器。

  • 还是服务器推送派单信息给司机App,都需要使用这个特定的连接通道。

也就是说,司机App和服务器的连接是特定的,司机App需要知道自己连接的服务器是哪一台。

  • 而给司机App推送消息的时候,也需要知道要通过哪一台服务器才能完成推送。

司机端的TCP长连接需要进行专门管理,处理司机App和服务器的连接信息。

image-20240815125708450