架构入门感悟总结
1、通达同城快递业务系统架构设计
需求背景
通达是某上市公司全资投资成立的一家物流快递公司,目前需要开发一套同城快递系统。该系统分为用户端、快递员端、服务端几个部分,可以由用户自助下单,抢单成功的快递员会负责上门完成用户的递送需求。
公司现有开发人员 20 人,系统预计在两个月后上线。
功能需求
1、用户通过 app 发起快递下单请求并支付
2、快递员通过自己的 App 上报自己的地理位置,每 30 秒上报一次
3、用户支付成功后,系统收到快递请求后,向距离用户直线距离 5km 内的所有快递员发送通知
4、快递员可以抢单,抢到单的快递员将会由系统下发用户的取件地址
5、系统将得到配单的快递员信息发送给用户,用户可以查看该快递员的位置、联系方式
6、快递员取件后在快递员端 APP 标注订单状态为已收件
7、快件运送过程中,用户可以持续查看快递员的位置、联系方式
8、快递员将快件送达后在快递员端 APP 标注订单状态为已送达
9、用户可以查询三个月内的历史订单
非功能需求
1、系统预计上线后三个月日订单超过 1 万,一年后日订单超过 50 万
2、支持接入第三方支付
3、数据使用加密传输
4、用户单次查询响应时间<500ms,95%响应时间<1000ms,单机 TPS>20
5、下单响应时间<500ms,95%响应时间<1000ms,单机 TPS>20
6、系统核心可用性目标 99.99%
用例图
部署图
1、CDN 用于加快用户图片访问速度
2、负载均衡服务器早期采用 nginx 部署,将来并发量大的时候改用 LVS 部署
3、网关服务器早期采用双机部署,未来根据业务量持续扩容
4、微服务框架使用 Dubbo
5、消息队列采用 Active MQ
6、早期不准备部署 Redis,快递员位置直接记录在配单微服务中
7、数据库采用 MySQL,并启用主从复制
下单抢单场景动态模型
业务活动图
关键算法思路
订单位置匹配
1、早期快递员少的情况下,采用全部遍历法,用取件地址经纬度与快递员最新经纬度,根据欧式距离公式计算直线距离,进行匹配
2、中期,合并快递员位置,用经纬度精度为小数点后两位(距离误差 1KM)做区域定位,先选定区域,后进行区域内快递员位置匹配
3、后期,在中期区域定位基础上,根据导航路线距离及预估上门时间进行匹配
抢单加锁
1、早期使用 Redis 实现抢单加锁
2、未来计划使用 zookeeper 实现分布式锁
2、脑图
版权声明: 本文为 InfoQ 作者【莫问】的原创文章。
原文链接:【http://xie.infoq.cn/article/ae2744c8241c89ecc8c1c15e1】。未经作者许可,禁止转载。
评论