内容提要
作者Eltrac介绍其用Clojure开发的Webmention接收器weepinbell:最初为学习Clojure而写,后因webmention.io重写、缺乏易用替代品,决定将其发展为可自托管、可横向扩展的公共服务。他重构架构,加入SQLite异步存储,并通过WebAssembly调用Go微格式解析器,以弥补Clojure生态的缺失。他还主张独立网络应去中心化,建立更多元社区。
延伸解读
从学习项目到公共服务:weepinbell 的定位转变
作者最初为学习 Clojure 而开发 weepinbell,仅作为个人工具运行数月。直到 webmention.io 重写引发替代品讨论,他发现现有自托管方案对非技术用户门槛较高,才决定将其发展为可自托管、也可横向扩展的公共服务。这一转变意味着项目目标从“能用”升级为“可靠且可规模化”,也解释了后续在数据库、并发和解析器上的投入。
架构取舍:轻量自托管与横向扩展如何兼得
weepinbell 通过通道将接收、处理和存储解耦,存储层以 vtable 形式可替换,新增 SQLite 异步存储后业务逻辑几乎未动。自托管者可将 pipeline-concurrency 设为 1,控制资源占用;公共实例则调高并发数即可横向扩展。所有组件打包为单个 .jar,降低了部署复杂度。这种设计让同一代码库覆盖个人和小型社区两种场景。
微格式解析的务实解法与遗留问题
Clojure 生态缺乏可用的微格式解析器,作者没有重写解析器,而是用 TinyGo 将 Go 解析库编译为 WebAssembly,再通过 Chicory 在 JVM 内调用,仅增加约 2 MB 体积。不过解析输出结构复杂且不确定,他额外写了“微格式归约”层来简化数据。作者也坦言多数 bug 与微格式相关,并半开玩笑地建议考虑 Open Graph 和 JSON-LD。
去中心化主张:更多社区而非单一入口
作者区分“独立”与“去中心化”:前者是脱离企业平台,后者是不依赖任何单一点。他认为 IndieWeb camp 是良好入口,但独立网络应容纳更多元社区,例如 omg.lol、folk.zone,甚至按兴趣划分的 LispyWeb、ArtsyWeb 等。对非技术用户而言,关键是有能力的运营者提供公共实例并服务小社区。即将推出的 Ringabell 计划采用更主流的 Go 技术栈,以降低参与门槛。
Q&A
weepinbell 是什么?为什么作者要开发它?
weepinbell 是一个用 Clojure 编写的 Webmention 接收器。作者最初为了学习 Clojure 而开发它,后来因为 webmention.io 被重写,且缺乏易用的自托管替代品,决定将其发展为可自托管、可横向扩展的公共服务。
weepinbell 如何实现横向扩展?
weepinbell 通过异步存储和通道机制实现横向扩展。处理器将操作对象放入通道,存储工作器异步处理 I/O,无需互斥锁。通过调整 pipeline-concurrency 配置,可以增加处理器数量以并发处理 Webmention,实现横向扩展。
weepinbell 如何处理 microformats 解析?
由于 Clojure 缺乏可用的 microformats 解析器,作者将 Go 的解析器库编译为 WebAssembly,并使用 chicory 在 JVM 上运行,创建了 mf2clj 库。此外,还实现了 microformats reduction 来简化解析输出。
作者对独立网络的发展有什么建议?
作者认为独立网络应该去中心化,不依赖单一节点,并建立更多元化的社区,例如 omg.lol、folk.zone 等,为不同兴趣群体提供替代 IndieWeb camp 的选择。
weepinbell 的 v1.0.0 版本计划包含哪些功能?
v1.0.0 计划包含合适的数据库(SQLite)、横向扩展能力、最新的 microformats 解析器。公共实例的认证和仪表盘将作为单独项目 Ringabell 开发。
为什么作者要开发 Ringabell?它和 weepinbell 有什么关系?
Ringabell 是一个计划中的前端服务,负责处理用户登录和管理 Webmention,以保持 weepinbell 核心最小化。它将使用更主流的 Go 语言开发,便于更多人参与。