在郑州同城小程序做本地生活服务那会儿,我先从商家入驻和配送匹配的痛点切入:商家信息参差、地址坐标偏差、配送半径动态变化,这些问题直接影响到订单转化和用户体验。遇到问题时,我通常不是先加功能,而是先把边界条件列清楚,重现流程,再定位最可能的节点。
技术栈上我们选了微信小程序原生 + TypeScript + Node.js 微服务,后端用 Koa 做网关,微服务之间用 gRPC 走内网,数据库采用 MySQL 存储关系数据,Redis 做缓存与 geo 功能,Elasticsearch 做模糊检索。部署在腾讯云容器服务(TKE),镜像用 Docker,流水线用 GitLab CI/CD。这样的组合我用了两年,利弊都看得清楚:快速迭代方便,运维复杂度也随之上来。
定位和附近搜索是核心。实践里我放弃了单纯 SQL 的 radius 计算,改用 Redis GEOADD+GEORADIUS 做一层热数据过滤,返回后再用 MySQL 的空间索引或 ES 做二次筛选。注意坐标系转换(GCJ-02 与 WGS-84),在郑州地图常见偏差会导致商家被“搜不到”。另外,按服务半径做分区缓存:把地理格子划分为 geohash 级别,更新只影响两个相邻格子,能把热点查询压在内存层。
订单链路我强调幂等与可观测性。下单接口用幂等 key,支付回调做双重验签,消息异步通过 RabbitMQ 或 Redis stream 保底。遇到库存并发问题,我用乐观锁结合延迟队列来确保最终一致;复杂补偿场景写成幂等的补偿任务,而不是多端回滚。部署时把关键链路的 trace 打点,结合 Jaeger 能迅速定位 200ms 之外的瓶颈。
前端优化不能靠闪光词。小程序端做代码分包、路由懒加载和列表虚拟化,图片接入对象存储并走 CDN,使用 WebP 并在上传时做两端压缩。对搜索做防抖、对输入结果做本地缓存;遇到冷启动卡顿,我习惯先分析 bundle size,再通过把公用库抽成 subpackage 解决。
运维和排查工具是常写在笔记里的东西:微信开发者工具的 network、timeline,抓包用 Charles,服务端用 tcpdump 排查网络抖动,日志集中到 ELK,指标入 Prometheus,告警走 Grafana。实操感悟是——别等线上事故再补监控,关键链路要有 SLO 与回滚预案。
商家后台要支持断网重试与差异同步。我用版本号+变更流来做增量同步,客户端用最后一次同步时间拉变更集,冲突通过最后写入时间或人工复核解决。权限控制以 RBAC 为主,对敏感接口加速率限制,外加 API 网关的熔断策略,避免单点抖动扩大成链路故障。
最后一点是合规与安全:个人数据最小化存储,重要字段加密,支付链路严格留痕。我的建议是先把最小可用产品做稳,然后用灰度、Feature Flag 逐步打开复杂功能。技术展望不会太玄:多做可观察性和自动化,迭代速度与稳定性才能并行。
咨询在线QQ客服