小i约球诞生记01:为什么一开始选择微信云开发

本文是「小i约球诞生记」系列文章之一。

小i约球是一个微信小程序,主要帮乒乓球、羽毛球、台球、网球爱好者找到附近合适的球友。本文从一个具体技术或产品问题切入,记录约球小程序从 0 到 1 过程中的设计取舍。

官网:https://iyueqiu.cn

小程序:微信搜索「小i约球」

前言

做小i约球之前,我对这个项目的判断很简单:它应该是一个轻量的小程序。

用户发布约球名片,其他人查看附近球友,再打招呼联系。早期不需要复杂后台,不需要独立 App,也不需要一套很重的微服务架构。

所以第一版技术选型,我选择了微信小程序 + 微信云开发。

现在回头看,这个选择有明显的好处,也有一些后面才慢慢感受到的限制。

这篇主要聊技术选型,不展开具体代码。

一开始为什么选云开发

最直接的原因是:快。

小i约球这种产品,早期最重要的不是把架构设计得多漂亮,而是尽快验证几个关键问题:

  • 用户是否愿意发布约球名片
  • 附近球友列表是否有价值
  • 公众号提醒是否能带来回访
  • 本地群和小程序是否能形成配合

如果一开始就自建后端,需要处理服务器、数据库、部署、域名、HTTPS、鉴权、日志、运维等一堆事情。它们都重要,但不是第一阶段最需要验证的东西。

云开发的优势在这里就很明显:

  • 小程序端可以直接调用云函数
  • 云函数天然拿到微信上下文
  • 云数据库和小程序生态集成度高
  • openapi 调用比较方便
  • 定时任务配置成本低
  • 文件上传、图片存储、用户身份都能快速串起来

对于一个早期个人项目来说,这些东西能省掉大量时间。

当时的整体架构

项目整体结构比较典型:

  • `miniprogram/`:小程序页面、组件、工具方法
  • `cloudfunctions/`:后端云函数
  • 云数据库:存用户、约球名片、消息、问答、快速约球、本地群等数据

小程序端通过 `wx.cloud.callFunction` 调用云函数。云函数内部再根据 `action` 分发到不同逻辑。

大致形态是:

小程序页面,↓ wx.cloud.callFunction,云函数,云数据库 / 微信 openapi。

这套模式很适合早期快速开发。

比如用户模块、约球名片模块、附近匹配模块、消息模块、问答模块、快速约球模块,都可以拆成独立云函数。每个云函数只关心自己的业务,部署时也可以单独上传。

真实做下来遇到的限制

如果只看前面的部分,云开发听起来很省心。

但项目做深以后,也会慢慢遇到一些边界。

1. 超时时间限制会影响批处理

云函数有执行时间限制。

对于普通请求问题不大,但对批量任务, 或者AI大模型调用就比较敏感。

比如:

  • 遍历临时匹配队列
  • 批量发送公众号消息
  • 批量处理问答通知
  • 批量生成或同步数据

这些逻辑如果一次处理太多,就可能接近超时。

所以后面必须做批次控制和并发控制。比如问答通知不能一次性无限发,而是写入临时集合,再由定时任务分批消费。

4. 没有 Redis

云开发默认没有 Redis。 这会影响很多常见后端设计。

比如:

  • 短期缓存
  • 分布式锁
  • 限流
  • 去重
  • 队列状态
  • 临时会话

在自建后端里,这些很自然会想到 Redis。但在云开发里,很多时候只能用数据库字段、临时集合、时间戳来替代。

比如小i约球里,附近匹配和收藏提醒都用了临时集合: 它们本质上是在用数据库模拟队列。 这个方案能跑,但要自己处理重复、失败、删除、批量消费等问题。

5. 没有真正的消息队列

这点和没有 Redis 类似,但影响更大。

小i约球里很多场景天然适合 MQ:

  • 发布名片后异步通知附近球友
  • 收藏别人后异步通知对方
  • 问答发布后异步推送给相关用户
  • 快速约球后异步通知附近人和附近群

如果有 MQ,设计会很自然:

业务事件,消息队列,消费者,发送通知 / 写日志 / 重试。

但云开发里没有这么完整的消息队列能力,所以我用了“数据库集合 + 定时任务”的方式模拟。

这个方式的好处是简单,坏处也明显:

  • 实时性不如 MQ
  • 失败重试要自己写
  • 消费状态要自己维护
  • 并发控制要自己处理
  • 数据清理要特别注意

早期可以接受,但项目继续变大后,就会成为一个需要重点治理的模块。

6. 本地调试和工程化能力有限

这个项目主要依赖微信开发者工具调试。

小程序端、云函数、云数据库、openapi 权限,都和微信开发者工具绑定比较深。

这对快速开发是好事,但对工程化也有一些限制:

  • 没有传统后端那种完整本地启动流程
  • 云函数部署依赖开发者工具操作
  • 多环境切换容易靠配置变量手动改
  • 自动化测试和 CI 不如常规 Node 服务自然

项目早期问题不大。等功能复杂以后,就会开始希望有更清晰的本地调试、部署和测试流程。

为什么没有一开始自建后端

如果重新做,我仍然不会一开始就自建后端。

原因很简单:早期最大的不确定性不是技术,而是产品是否成立。

自建后端确实更自由:

  • 可以用 Redis
  • 可以用 MQ
  • 可以自己设计数据库
  • 可以做完整日志和监控
  • 可以更好地做 CI/CD

但这些自由也意味着更多成本。

对小i约球这种早期产品来说,先验证“附近球友匹配”这个场景,比先搭一套完整后端更重要。

所以我的判断是:

早期用云开发是对的。 但要知道它不是没有代价。

我的选型结论

如果你也在做类似的小程序项目,我会这样判断。

适合用云开发的情况:

  • 你是个人或小团队
  • 产品还在验证阶段
  • 主要场景在微信生态内
  • 后端逻辑不算特别重
  • 需要快速接入微信 openapi
  • 能接受一定的平台限制

不太适合完全依赖云开发的情况:

  • 业务有大量实时队列
  • 强依赖 Redis、MQ、复杂缓存
  • 需要大量后台批处理
  • 对可观测性和自动化部署要求很高
  • 未来可能脱离微信生态

小i约球目前还处在比较适合云开发的阶段,但已经开始遇到一些边界。比如消息队列、批量通知、定时任务、access_token 管理、跨函数重复代码,这些都需要后续慢慢治理。

总结

小i约球一开始选择云开发,核心原因是快速验证。

它让我很快把用户、约球名片、附近匹配、公众号通知、内容安全、定时任务这些能力串起来。对于一个早期微信小程序来说,这个效率很重要。

但真正做起来以后,也会发现云开发不是万能后端。

它的限制也很清楚:云函数数量和大小、超时时间、没有 Redis、没有真正的消息队列、本地工程化能力有限。

所以我的态度不是“云开发好”或者“云开发不好”,而是:

在早期,它能帮你快速把产品跑起来; 等业务变复杂以后,你要知道哪些地方是在借平台能力,哪些地方是在绕平台限制。

---

本文属于「小i约球诞生记」系列。

项目官网:https://iyueqiu.cn 微信小程序:搜索「小i约球」