主要观点:
- 作为 Karafka 生态系统的维护者,作者多年来目睹开发者因 rdkafka 安装缓慢而苦恼,决定解决这一问题。
- 由于兼容性问题,之前没人解决 rdkafka 的安装问题,其依赖复杂的 C 库和多种系统库,不同平台版本差异大。
- 作者借鉴其他 Ruby gems 的方法,开始研究如何解决问题,最终决定采用静态链接,将所有依赖编译成自包含的二进制文件。
- 过程中遇到各种平台特定的挑战,如 Alpine Linux 的 musl 库、macOS ARM64 的架构差异等,构建过程复杂且需处理安全问题。
- 测试和发布 native 扩展也面临巨大挑战,需要构建多个平台的二进制文件并进行测试和协调发布。
- 经过数月努力,终于实现所有主要平台的 native 扩展,带来了安装速度加快、Docker 构建和 CI 管道响应更快等积极影响,同时也遇到一些新挑战并加以解决。
关键信息:
- rdkafka 每月下载量超 100 万次,安装需 60 秒左右,浪费大量 CPU 时间。
- 其他 Ruby gems 如 nokogiri 采用预编译二进制文件解决编译问题。
- 不同平台系统库差异大,如 Ubuntu、CentOS、Alpine Linux、macOS 等。
- 构建 native 扩展的复杂过程,包括下载、验证、编译依赖等,脚本长达 2000 多行。
- 安全方面,实现 SHA256 验证、加密证明、可重现构建等。
- CI/CD 过程复杂,需多个平台的运行器和不同 Ruby 版本的测试。
- 发布 native 扩展涉及多平台构建、测试和协调发布。
- 最终实现所有主要平台的 native 扩展,带来诸多好处,同时也有新挑战。
重要细节:
- 作者在帮助开发者解决 rdkafka 安装问题时意识到问题的严重性和浪费的资源。
- 之前尝试动态链接系统库失败,导致部署到不同库版本系统时出现问题。
- 在 Linux x86_64 GNU 系统上取得成功,安装时间从 60 秒以上降至 5 秒以下,但在 Alpine Linux 上失败。
- 每个平台都有特定挑战,如 Alpine Linux 的系统调用、库约定和编译器行为不同,macOS ARM64 的架构差异等。
- 构建系统需要处理各种依赖的编译顺序和标志,以确保成功构建。
- 安全方面的措施包括对每个依赖进行 SHA256 验证、RubyGems 可信发布等。
- CI/CD 管道需要多个阶段和不同平台的运行器,以测试 native 扩展。
- 发布 native 扩展需要重建整个发布过程,采用 RubyGems 可信发布。
- 最终实现 native 扩展后,安装速度大幅提升,Docker 构建和 CI 管道响应更快,节省大量 CPU 时间和能源。
- 遇到新挑战,如用户需要源编译和验证预编译二进制文件的等效性等,并加以解决。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。