缩略图是否搬到 Go 后端的取舍(特别是 gomobile 场景)

December 14, 2025
2 min read
By devshan

Table of Contents

This is a list of all the sections in this post. Click on any of them to jump to that section.

问题背景

我们讨论过一个方案:
把图片缩略图的生成从 Flutter/Dart 侧搬到 Go 后端,由 Go 负责解密原图并生成小图。

在“远程服务端 + 多端客户端”的架构中,这个方案有明显优势:

  • 服务器统一生成缩略图,多设备复用同一份缓存;
  • 客户端只拉缩略图,减少拉原图再压缩的流量;
  • 重计算集中在服务器,减轻移动端压力。

但在当前项目的现实前提下:

  • Go 后端会通过 gomobile 打包进入客户端本地运行;
  • 等于是把 Go runtime 和 HTTP server 内嵌进 app 里,而不是独立部署在远程主机。

性能角度的分析

在 gomobile 场景下:

  • Flutter 与 Go 都跑在同一设备上,使用相同的 CPU、内存和电池;
  • 只是“谁来做 decode + resize”:Dart + image 包 vs Go + imaging/bimg

结合我们已经做的优化:

  • 缩略图生成已经放到了 Flutter 的后台 Isolate;
  • 滚动、上传/删除有 gate 控制;
  • 加上本地磁盘缩略图缓存。

在这种基础上,再把缩略图生成搬到 Go:

  • 对 UI 流畅度的提升非常有限:
    • UI 是否卡主要看主线程有没有被重计算占用;
    • 这一点 Isolate 已经解决。
  • 对 CPU/发热/续航的改善也相对有限:
    • 同一批图像,总要在本机 CPU 上解码和缩放;
    • Go 的实现可能更高效一些,但一般是 10–20% 级别的差异,而不是数量级的提升。

架构与维护角度

把缩略图逻辑搬到 Go 主要带来的好处是:

  • 在桌面/服务器/移动端之间复用一套核心逻辑;
  • 所有“解密 + 生成缩略图”的代码集中在 Go 模块中,便于测试和维护;
  • Flutter 仅负责调用和展示。

代价是:

  • 引入 gomobile 集成和图像库的跨平台依赖;
  • 增加包体积和基础内存占用;
  • 调试链路更复杂。

决策结论

  • 在当前阶段,不以“性能”为理由优先做这件事
    • Flutter 侧的优化已经解决主要卡顿问题;
    • 把缩略图搬到 gomobile-Go 不会带来“非常明显”的性能提升。
  • 把这件事定位为中长期架构演进选项
    • 当我们要把整个 Go 核心(解密、索引等)都 embed 进客户端时,再一并考虑统一缩略图逻辑;
    • 那时收益更多来自“代码复用和架构统一”,而不是单点性能。

这也是一个典型的取舍案例:
在本地 gomobile 场景下,先把 Dart/Flutter 这一侧的工程化做到位,比过早追求“后端化”更划算