Odin / 推荐项目

Tina: 一种无共享、每核一线程的并发框架

约 2 小时前发布

Tina 并发框架总结

项目地址:https://github.com/pmbanugo/tina

项目简介

Tina 是一个严格有界(strictly bounded)、线程每核(thread-per-core)的并发框架,专为大规模并发、安全性和容错性设计。项目名称取自 "There Is No Alternative"(别无选择)的缩写。

核心设计哲学

Tina 通过架构约束而非语言特性来解决问题,实现 C 级别的性能和 Erlang 级别的可靠性:

  1. 无垃圾回收(No GC):使用类型化内存竞技场(typed arenas)和分片(Shard)拥有的内存池管理内存,无 GC 暂停,无手动释放,生命周期由结构保证。

  2. 无 async/await:避免有色函数(colored functions)对生态的分割。Tina 使用协作式用户空间调度器,处理器(Handler)是返回 Effect 值的标准函数。

  3. 无互斥锁(No Mutexes):采用**共享无物(Shared-Nothing)**架构。Tina 运行在线程每核模式,Isolate(隔离体)间永不共享内存。跨核通信使用无锁环形缓冲区(邮箱)。

  4. 无隐藏分配(No Hidden Allocations):所有内存在启动时根据静态引导规范(boot spec)预先分配大小。如果工作负载超出容量,Tina 会可预测地丢弃负载,而不是因内存溢出而崩溃。

  5. 100% 确定性模拟测试:时钟、网络和 I/O 由调度器抽象,支持 TigerBeetle 风格的确定性模拟测试。相同种子 + 相同配置 = 相同执行结果

关键概念

  • Shard(分片):绑定到每个 CPU 核心的 OS 线程,永久固定。每个分片拥有其接触的一切:竞技场、调度器、邮箱、I/O 反应器、定时器。分片间不共享内存。

  • Isolate(隔离体):存在于分片内密集、缓存友好的竞技场中的类型化结构体。由代际句柄(generational handles)引用,通过调度器执行处理器函数。可安全失效,无悬空引用。

  • 消息传递(Messaging):跨核心边界的唯一方式——单生产者、单消费者、无锁邮箱。分片内路径无原子操作。

  • Grand Arena(大竞技场):启动时,每个分片向 OS 请求一个连续内存块。每个 Isolate、消息信封、I/O 缓冲区均从此块中划分。启动后永不调用 malloc

架构示意

Tina 架构为每个 CPU 核心运行一个 Shard(OS 线程),每个 Shard 内部包含:

  • 类型化竞技场(Typed Arenas),用于存储 Isolate 实例。
  • 调度器(Scheduler)和消息池(Message Pool)。
  • I/O 反应器(支持 kqueue / io_uring / IOCP)。
  • 定时器、日志和监管(Supervision)系统。
  • 跨核心通信通过无锁邮箱(Mailboxes)进行。

简单 TCP 回显服务器示例

在 Tina 中,不编写有色的 async/await 函数,也不锁定互斥量。而是编写 Isolates——轻量级状态机,响应消息并返回 Effects。框架处理其余部分。

示例代码展示了:

  • 每个连接是一个独立的 Isolate(无共享套接字表,无锁)。
  • 初始化、接收数据、发送回显、关闭连接的完整状态机。
  • 如果 Isolate 崩溃甚至发生段错误,分片的陷阱边界(trap boundary)会捕获错误,清除 Isolate,监管者(supervisor)会重启它。同一核心上的其他 Isolate 完全不受影响。

扩展与工具

  • Tina HTTP:HTTP/1.1 Web 服务器库。
  • Datastar:用于 Datastar 超媒体框架的实验性 SDK,支持构建响应式 Web 应用。

项目状态与路线

状态:早期但功能稳定(Early but Functionally Stable)。核心架构已实现并可工作,包括:

  • 线程每核调度器,支持自适应批处理执行。
  • 故障隔离(陷阱边界可捕获 panic 和段错误)。
  • 监管树,包含重启预算和分片隔离。
  • 异步 I/O(macOS 的 kqueue、Linux 的 io_uring、Windows 的 IOCP)。
  • 跨分片、多核消息传递。
  • 两个工作示例,演示负载下的故障恢复。
  • 确定性模拟测试,支持故障注入和基于种子的重放。
  • 提供概念指南、操作指南和 API 参考文档。

已在 macOS(Apple Silicon)上主要测试,CI 测试在 Linux 和 Windows 上通过。

灵感来源

Tina 综合了以下思想:

  • 监管树、"让它崩溃"、错误内核:来自 Joe Armstrong(Erlang/OTP)。
  • 线程每核、共享无物、反应器循环:来自 Seastar(ScyllaDB)。
  • 确定性模拟测试、静态分配、"Tiger Style":来自 TigerBeetle 和 FoundationDB。
  • 环形缓冲区设计、机械共鸣:来自 Martin Thompson(LMAX Disruptor, Aeron)。
  • 内存生命周期:来自 Casey Muratori。
  • 数据导向设计:来自 Mike Acton(C++)和 Andrew Kelly(Zig)。
  • 大型软件项目架构:来自 Eskil Steenberg(C 开发者)。

技术栈与许可证

  • 语言:Odin(98.7%),其他(1.3%)。
  • 许可证:Apache 2.0。
  • GitHub 数据:282 星标,3 个关注,11 个复刻,4 位贡献者。

总结

Tina 是一个追求极致性能、可靠性和可测试性的并发框架。它通过严格的架构约束(共享无物、线程每核、预分配内存、确定性模拟)来简化并发编程,避免传统并发模型(如锁、回调、异步函数)带来的复杂性。其目标是结合 C 语言的性能与 Erlang/OTP 的容错能力,适用于构建高吞吐、低延迟、高可靠性的基础设施服务。

加入开源交流群

请加站长微信,免费进入交流群,和开源爱好者一起讨论。

站长微信二维码