极客时间《架构师训练营》大作业

背景

通达是一款本地即时配送平台。公司秉承“通派无障,使命必达”的信念,专注于用移动和众包的方式解决 O2O 领域最大的痛点:居民的最后 5 公里配送。
公司刚成立,已组建了 20 人的技术部门,准备两个月后系统开发完成上线。第一季目标日订单 1 万。

功能概述

  • 用户通过 app 发起快递下单请求并支付
  • 快递员通过自己的 APP 上报自己的物理地位,每 30 秒上报一次
  • 系统收到快递请求后,向距离用户直线距离 5km 内的所有快递员发送通知
  • 快递员需要进行抢单,第一个抢单的快递员得到配单,系统向其发送用户详细地址
  • 快递员用户处收到快递,并记录到系统中:已收件
  • 快递员将快递送到目的地,并记录到系统中:已送达
用例图

非功能性需求

系统预计上线三个月,日订单超过 1 万;一年后,日单超过 50 万

  • 查询性能:平均响应时间 < 500ms, 95%响应时间 < 800ms
  • 下单性能:平均响应时间 < 800ms, 95%响应时间 < 1000s
  • 系统核心功能可用性: > 99%
  • 系统安全性目标:可拦截 XSS 攻击,SQL 注入,CSRF 攻击,密码数据散列加密,客户端数据 HTTPS 加密,外部系统间通信加密。

系统部署图与整体设计

  • 先上线 ios 和 Android 客户端,采用混合应用开发
  • 后端系统使用微服务架构——Spring cloud,以适应日后的弹性伸缩
  • 由于系统上线时间紧,现阶段运维成本较高,系统将直接部署在阿里云容器镜像服务上
  • 直接使用阿里云提供的 DNS、CDN、Load Balance、API GateWay、Redis、Object Storage,Rocket MQ,短信服务,以及 MySql 主从服务
  • 用户 Auth 服务通过微信授权登陆
  • 客户端集成支付宝和微信支付
部署图

系统第一版(三月版)业务相对简单,流量有限——峰值 QPS 预计不超过 10,所以保证尽快上线为第一目标。如上有色区域为核心业务,分成三个独立的微服务:订单服务、定位服务、推送服务:

  • 订单服务:主要包括订单的创建、销毁、进度更新,发起抢单,派单等等服务

  • 定位服务:主要用途是通过 Redis 记录快递员位置信息;并提供位置匹配算法

  • 推送服务:顾名思义,与客户端保持长连接的服务:推送抢单,推送订单进度等等

订单服务活动图

活动图

该场景的主要流程如下:

  1. 寄件人下单并支付
  2. 系统向附近 5km 内的快递员发起抢单
  3. 快递员抢单
  4. 抢单成功后,系统给寄件人发送寄件码;快递员收到订单详细信息,并上门取件
  5. 快递员上门取件后,输入取件码,开始派件;系统给收件人发送收件码
  6. 快递员派送成功,输入收件码
  7. 订单完成

订单状态图

状态图

下单抢单时序图

下单前

快递员 APP 每 30 秒上报一次位置,并存于 Redis;用户打开 APP 即可看到附近骑手定位。

用户

定位匹配算法:

  • 早期,快递员少的情况下,订单位置匹配采用全部遍历法,用取件地址经纬度和快递员最新经纬度,根据欧氏距离公式计算直线距离,进行匹配

  • 中期,合并快递员位置,用经纬度精度为小数点后两位(距离误差 1KM)做区域定位,先选定区域,后进行区域内快递员位置匹配

  • 后期,在中期区域定位的基础上,根据导航路线距离及预估上门时间进行匹配

下单时

下单过程如下所示:

  1. 用户提交订单,服务器创建订单
  2. 用户完成支付,通知服务器开始抢单
  3. 推送服务向附近 5 公里以内的快递员广播抢单(快递员抢单见下图)
  4. 抢单成功,用户收到寄件码
订单时序图

快递员抢单过程

快递员的抢单流程如下所示:

  1. 接上图,推送服务向附近快递员发起抢单
  2. 快递员收到抢单通知后,立即抢单
  3. 抢单成功,系统返回订单详情
  4. 推送服务同时给用户发送寄件码
骑手

抢单规则:

  • 早期仅使用 DB 锁,先到先得

  • 中期将订单状态置于 Redis,使用分布式锁

  • 后期再增加预估匹配算法

三个月后系统升级

第一版计划是尽快上线,因此只是设计的移动端的部署图。三个月后,若业务稳定,系统需要进一步升级,实现日订单 50 万的目标。改造计划如下:

  1. 同时上线 PC 端和移动端;并增加 BFF 层,解耦前后端部署设计

  2. 后台系统由先前简单的读写分离模式,细分更多的微服务应用集群,包括用户服务、骑手服务、订单服务、推送服务、支付服务、后台系统、评价系统、通讯系统等等

  3. 订单结束后,设计基于 MySql 到 MongoDB 的冷热分离

  4. 建立后台系统的大数据分析平台

升级计划
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342