
Files.md每用户并发模型per-user channel串行化与细粒度锁设计【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.mdFiles.md 是一款基于 .md 文件的轻量级笔记应用支持 Telegram 机器人、网页应用双端同步。本文带你快速看懂它的并发控制核心设计——per-user channel每用户通道串行化与细粒度锁fine-grained lock这两个机制让多个用户的请求并行处理又保证每个用户的文件写入绝不紊乱。问题背景多个入口同时写同一份 md 文件先看 Files.md 的整体架构同一个用户的 .md 文件可能同时被三个入口修改——Telegram 机器人消息、网页 PWA 应用、以及定时任务 worker处理到期待办、清理已完成项如果没有并发保护两个入口同时读文件→修改→写回就会发生经典的竞态条件后写的人覆盖先写的内容你的笔记就这么丢了。那么如何设计一套方案既能让用户之间互不阻塞又能保证单个用户的数据安全Files.md 的答案是两道防线。第一道防线per-user channel一个用户一条串行流水线服务端启动时主循环从 Telegram 拉取更新然后按用户 ID 把消息投递到各自的专属 channel 中缓冲区大小 100 条不同用户之间并行每个用户有自己独立的 worker 协程A 用户消息多不会拖慢 B 用户同一用户内部串行该用户的所有消息严格按顺序逐条处理天然消除了同一用户消息间的并发崩溃自愈worker 外层包裹了 supervisor 逻辑一旦处理过程 panic会自动重启并继续消费 channel 中未处理的消息服务不会因此雪崩。这套按用户分流的串行化模式核心实现见 cmd/server/server.goTelegram 端的界面效果如下第二道防线细粒度锁锁住读-改-写关键区段只靠 channel 串行还不够——网页端和定时 worker 根本不经过 channel它们可能和 bot worker 同时改同一个用户的文件。因此 Files.md 在文件操作层再加一层每用户互斥锁userLock(用户标识) → Lock → 读文件 → 修改 → 写回 → Unlock关键设计点在于细粒度锁不是全局一把而是按用户路径分别创建、按需复用。锁表本身由一把短生命周期的大锁保护查表/建锁拿到用户锁后立刻释放因此锁竞争范围极小。这套模式在项目中多处复用模块保护对象参考位置收件箱读写Chat.md 的条目增删server/chat.go#L381-L396完成任务标记- [ ]→- [x]的改写server/bot.go#L2209-L2219日记追加当月日记文件的写入server/journal/journal.go#L24-L32用户配置时区、快捷键等设置读写server/userconfig/userconfig.go#L326-L341此外临时状态如上一条消息 ID存放在按用户隔离的sync.Map中server/db/db.go同步改名/删除的审计日志也用sync.RWMutex保护server/sync/fslog.go整体形成用户维度隔离 关键区段加锁的一致风格。两道防线如何协同工作 以一个网页端改了收件箱 → 机器人主页刷新的场景串起来网页端请求写入 Chat.md走用户锁完成读-改-写写入完成后触发sync.OnChatUpdate回调在独立协程中重建该用户的机器人主页——此时 bot worker 正在处理别的消息互不阻塞因为同一文件被锁保护同一用户的下一条 Telegram 消息仍在它的 channel 里排队顺序不乱定时 worker 扫描到期待办时同样要拿该用户的锁才能安全写入不会与在线操作冲突。用户之间零干扰用户内部零竞态——这就是 per-user channel 串行化 细粒度锁组合拳的效果。新手可借鉴的 3 个并发设计要点 ✅先隔离再加锁把大系统按用户/租户切分成独立通道能并行就并行复杂度立刻减半锁的粒度要小一把全局大锁最安全但性能最差按 key 动态取锁 短临界区是常见折中为崩溃留后路每个 worker 都套一层 supervisorpanic 只影响单个用户且自动恢复服务整体保持安静可靠——这也正是 Files.md 作为安静的思考空间private, quiet space对稳定性的追求。更多自部署细节可参考 docs/your-own-server.md想动手看同步流程可以看 docs/sync-flow.md。掌握这套channel 串行化 细粒度锁的组合你在自己的项目里也能设计出既快又稳的多用户服务。【免费下载链接】files.md Private, quiet space for thinking. Simple app for .md files.项目地址: https://gitcode.com/GitHub_Trending/fi/files.md创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考