目录
一、需求分析 1
功能需求 1
质量需求 2
二、设计 2
业务逻辑设计 2
分布式架构设计 4
三、实现 9
业务逻辑实现 9
分布式架构实现 9
四、测试与节点估算 10
五、问题分析 11
- 代码解耦程度不够 11
- 可变数据的存储 11
- 消息推送的弹性设置 11
- 分布式数据库 11
六、心得体会 11
一、需求分析
功能需求
用户系统
包括普通用户和司机的注册、登录、退出。
会员积分
普通用户支持按照打车里程进行积分,并升级为不同的会员等级。
约车服务
司机可以设置开始/结束接单,用户可以发起/取消约车请求
派单服务
系统向距离用户较近的若干个司机发送约车信息,司机自行选择接单。
订单服务
用户上车后形成订单,用户到达目的地,司机提交费用,用户支付后订单结束,订单可查询
评价服务
用户可以查看接单司机的评价,在订单完成后可以对接单司机进行评价。
消息推送服务
系统向用户推送司机接单消息 系统向司机推送用户约单消息。
质量需求
系统规模
一年内注册用户数可达5000万,日均订单800万,高峰时段每小时200万订单。
分布式需求
可以通过扩展部署多台服务器的方式达到预期容量需求
用户体验
95%的用户请求响应时间不超过1秒钟
二、设计
业务逻辑设计
数据库实体设计
实体设计较为简洁,包括顾客,请求订单,订单,司机,司机评价,司机请求订单。 顾客只有一个请求订单,本文转载自http://www.biyezuopin.vip/onews.asp?id=14918 可以有多个订单(订单列表)。 司机可有个司机评价,多个订单,多个请求订单。
package cn.bupt.driverserver.entity;
import com.fasterxml.jackson.annotation.JsonView;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Data
@Entity
public class Driver implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
// @ManyToMany(fetch = FetchType.EAGER)
// @JoinTable(name="driver_rOrder",joinColumns = {@JoinColumn(name = "d_id")},inverseJoinColumns = {@JoinColumn(name = "r_id")})
// @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
// private List<RequestOrder> requestOrderList;
// private List<RequestOrder> requestOrderList = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL)
private List<OrderForUser> orderForUserList;
// @JoinColumn(name = "driver_id")
@OneToMany(cascade = CascadeType.ALL)
private List<RequestOrderForDriver> requestOrderForDriverList;
// private List<Order> orderList = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "driver_id")
private List<Comment> commentList;
// private List<Comment> commentList = new ArrayList<>();
private int ifLogin;
// private Order curOrder;
private Long curOrderId;
private String curCustomerName;
@JsonView(Views.Public.class)
private String driverName;
@JsonView(Views.Internal.class)
private String email;
@JsonView(Views.Public.class)
private String password;
// 司机完成订单次数 完成订单总里程
@JsonView(Views.Public.class)
private int finishCount;
@JsonView(Views.Public.class)
private int finishDistance;
@JsonView(Views.Public.class)
private int serviceLevel;
@JsonView(Views.Public.class)
private int driverPoint;
// @JsonView(Views.Public.class)
// private int driverDistance;
@JsonView(Views.Public.class)
private int driverLevel;
@JsonView(Views.Public.class)
private double stars;
// private String driverLevel;
@JsonView(Views.Internal.class)
private int ifBusy;
@JsonView(Views.Internal.class)
private int curX;
@JsonView(Views.Internal.class)
private int curY;
@JsonView(Views.Internal.class)
private int desX;
@JsonView(Views.Internal.class)
private int desY;
// @JsonView(Views.Internal.class)
// private double curX;
// @JsonView(Views.Internal.class)
// private double curY;
// @JsonView(Views.Internal.class)
// private double desX;
// @JsonView(Views.Internal.class)
// private double desY;
// public Driver()
// {
// this.ifLogin = 0;
// this.curCustomerName = "";
// this.driverLevel = 0;
// this.email = "";
// this.password = "";
// this.finishCount = 0;
// this.finishDistance = 0;
// this.serviceLevel = 0;
// this.driverPoint =0;
// this.driverLevel = 0;
// this.stars = 0;
// this.ifBusy= 0;
// this.curX = 25;
// this.curY = 25;
// this.desX = 25;
// this.desY = 25;
this.requestOrderList = new ArrayList<RequestOrder>();
this.orderList = new ArrayList<Order>();
this.commentList = new ArrayList<Comment>();
// }
}