同城外卖系统架构设计与高并发实践
1. 同城外卖系统开发概述同城外卖系统作为本地生活服务的核心载体已经成为城市基础设施的重要组成部分。这套系统需要同时处理高并发订单、实时地理位置追踪、多角色协同作业等复杂业务场景。我去年主导开发了一套日均处理5万订单的同城配送系统采用前后端分离架构前端使用uniapp实现多端兼容后端基于ThinkPHP构建高可用服务集群。这套系统的核心价值在于解决了三个关键问题一是将传统餐饮配送的30分钟平均响应时间缩短至90秒内二是通过智能路径规划降低15%以上的配送成本三是为商家提供可视化的运营数据看板。不同于平台型外卖系统同城方案更注重区域密度和垂直领域的深度运营这也是我们选择自研而非直接使用第三方SDK的主要原因。2. 系统架构设计解析2.1 整体架构分层我们采用经典的四层架构设计客户端层(uni-app) → 接入层(NginxAPI网关) → 业务层(ThinkPHP微服务) → 数据层(MySQLRedisElasticsearch)每层的关键设计考量客户端层uniapp跨端方案同时覆盖微信小程序、H5和Android/iOS原生应用使用条件编译处理平台差异接入层API网关实现请求路由、限流(2000QPS)和鉴权Nginx做负载均衡和静态资源缓存业务层按领域拆分为用户中心、订单服务、配送调度、支付清算等微服务模块数据层主从分离读写分离热数据用Redis集群缓存搜索用Elasticsearch构建2.2 高并发设计要点在早午晚高峰时段系统需要应对10倍于平峰的流量冲击我们通过以下设计保障稳定性异步化处理订单创建采用接收→校验→持久化→响应的异步流水线核心路径耗时控制在300ms内分级降级策略一级降级关闭推荐算法使用静态菜单二级降级暂停优惠计算默认原价结算三级降级启用本地缓存菜单保证基础下单能力热点数据隔离将商家库存数据从主库剥离使用Redis原子操作保证一致性实际压测数据显示4核8G服务器单节点可稳定支撑800QPS集群横向扩展后满足万级并发需求3. 核心功能实现细节3.1 智能订单分配系统订单与骑手的匹配算法经历了三次迭代V1.0 简单半径匹配3km内随机分配导致20%订单超时V2.0 加权评分模型考虑距离(50%)、骑手负载(30%)、历史评分(20%)V3.0 实时动态调整引入强化学习根据实时路况预测送达时间关键代码片段PHP实现class DispatchService { public function matchOrder($order) { $riders $this-getAvailableRiders($order-shop_id); $scores []; foreach ($riders as $rider) { $distanceScore $this-calcDistanceScore($order, $rider); $loadScore 1 - ($rider-active_orders / 5); // 最大负载5单 $historyScore $rider-rating / 5; $scores[$rider-id] 0.5*$distanceScore 0.3*$loadScore 0.2*$historyScore; } arsort($scores); return key($scores); } }3.2 实时位置追踪方案采用混合定位策略保证精度小程序端使用微信原生定位API5秒上报一次App端高德SDKGPS/基站/WiFi多源融合Web端H5 Geolocation API配合IP定位降级位置数据通过MQTT协议实时推送建立了三级缓存机制内存缓存存储最新位置TTL 1秒Redis地理空间索引存储最近10分钟轨迹GEOADD key longitude latitude memberMySQL持久化完整行程记录4. 多端兼容开发实践4.1 uniapp跨端适配要点我们在多端开发中总结出这些经验样式兼容使用rpx替代px通过条件编译处理平台差异// #ifdef MP-WEIXIN wx.login({...}) // #endif // #ifdef APP-PLUS uni.login({...}) // #endif性能优化长列表使用 分页加载图片启用webp格式和懒加载复杂动画使用CSS3替代JS实现常见坑点微信小程序路径长度限制1024字节iOS端Webview对localStorage有5MB限制Android端background-position百分比支持不全4.2 状态管理方案选型对比测试了三种方案后选择Vuex持久化全局变量简单但难以追踪变化EventBus适合简单通信复杂场景易混乱Vuex完善的devtools支持配合uni-simple-router实现路由守卫典型店铺数据状态设计const store new Vuex.Store({ modules: { shop: { state: { currentShop: null, menuList: [] }, mutations: { setShop(state, payload) { state.currentShop payload uni.setStorageSync(currentShop, payload) } } } } })5. 关键问题排查实录5.1 订单超时异常分析曾出现高峰期15%订单超时的问题通过全链路监控发现现象从下单到骑手接单平均耗时超过5分钟根因MySQL连接池耗尽最大连接数设置过低骑手位置更新服务未做限流挤占带宽解决方案数据库连接池从50调整为200引入Sentinel对位置服务做熔断降级增加订单状态变更的MQ异步通知5.2 地理位置漂移处理用户频繁投诉定位不准经排查发现Android机型部分设备GPS模块精度差通过加入高德SDK的辅助定位解决iOS 14隐私权限导致首次定位偏差大增加手动确认位置功能微信浏览器IP定位误差达500米改用腾讯地图JS API优化后的定位精度对比场景优化前误差优化后误差微信小程序300m50mAndroid App150m20miOS App200m10m6. 性能优化专项6.1 首屏加载时间优化通过以下措施将冷启动时间从4.2s降至1.8s资源层面图片转CDN并开启AVIF格式主包体积从3MB压缩至1.5MB渲染层面使用v-once缓存静态DOM关键路径数据预加载网络层面HTTP/2多路复用接口数据协议从JSON转为ProtoBuf6.2 内存泄漏治理在Android端发现内存持续增长问题通过以下手段解决检测工具Chrome DevTools Memory面板Android Profiler典型问题未解绑的全局事件监听循环引用的Vue组件Webview未及时销毁解决方案// 正确的事件管理示例 export default { mounted() { this.eventBus.$on(update, this.handleUpdate) }, beforeDestroy() { this.eventBus.$off(update, this.handleUpdate) } }7. 安全防护体系7.1 常见攻击防御我们构建了五层安全防护传输层全站HTTPS证书固定接口层参数过滤SQL预编译业务层验证码行为分析数据层敏感字段加密存储风控层基于规则的实时拦截7.2 支付安全实践支付环节特别处理金额采用整数存储单位分双重验证前端校验服务端复核异步通知使用签名验证class PaymentService { public function verifyNotify($data) { $sign $data[sign]; unset($data[sign]); ksort($data); $str http_build_query($data).key.$this-secret; return md5($str) $sign; } }这套系统上线后保持零重大安全事故记录日均拦截恶意请求2300余次。