Tina: 一种无共享、每核一线程的并发框架
Tina 并发框架总结
项目地址:https://github.com/pmbanugo/tina
项目简介
Tina 是一个严格有界(strictly bounded)、线程每核(thread-per-core)的并发框架,专为大规模并发、安全性和容错性设计。项目名称取自 "There Is No Alternative"(别无选择)的缩写。
核心设计哲学
Tina 通过架构约束而非语言特性来解决问题,实现 C 级别的性能和 Erlang 级别的可靠性:
-
无垃圾回收(No GC):使用类型化内存竞技场(typed arenas)和分片(Shard)拥有的内存池管理内存,无 GC 暂停,无手动释放,生命周期由结构保证。
-
无 async/await:避免有色函数(colored functions)对生态的分割。Tina 使用协作式用户空间调度器,处理器(Handler)是返回
Effect值的标准函数。 -
无互斥锁(No Mutexes):采用**共享无物(Shared-Nothing)**架构。Tina 运行在线程每核模式,Isolate(隔离体)间永不共享内存。跨核通信使用无锁环形缓冲区(邮箱)。
-
无隐藏分配(No Hidden Allocations):所有内存在启动时根据静态引导规范(boot spec)预先分配大小。如果工作负载超出容量,Tina 会可预测地丢弃负载,而不是因内存溢出而崩溃。
-
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 的容错能力,适用于构建高吞吐、低延迟、高可靠性的基础设施服务。
加入开源交流群
请加站长微信,免费进入交流群,和开源爱好者一起讨论。