Ruby 3的主要关注点之一是并行性和并发性。这一领域的先驱是使用红宝石纤维。光纤是一种并发机制,允许我们暂停、循环和恢复执行,同时使用少得多的上下文切换。它比线程消耗更少的内存,同时让开发人员控制代码段的执行。
光纤是可扩展的无阻塞客户端和服务器的最佳解决方案。然而,Rails花了一段时间来利用它。
随着Rails继续用光纤取代线程的使用,性能只会变得更好。开发的一个领域是ActiveRecord,尽管配置了ActiveSupport的隔离级别,但到目前为止它仍然依赖于线程。隔离级别决定了数据库跟踪如何传播到其他用户和系统。
为什么这很重要?为此,我们需要了解ActiveRecord的ConnectionPool是什么。连接池管理多个ActiveRecord连接。连接实质上是在数据库上执行事务。为了执行这个事务,Rails将I/O操作卸载到一个线程,其中每个线程都维护一个单独的DB连接(在Puma的情况下)。否则,与数据库的单独对话可能会混淆。现在有了一个性能更好的线程替代方案,ActiveRecord应该可以切换了!可悲的是,事实并非如此。
幸运的是,该PR将整个ConnectionPool的对话迁移到使用线程或光纤。
太棒了但是,这意味着什么?理想情况下,在可预见的未来,我们可以期待Rails I/O操作的良好性能改进。目前,Rails使用IsolatedExecutionState抽象执行,至少它应该这样做。然而,当我们环顾Rails代码库时,似乎有很多代码是硬连接到以线程为中心的实现的。所以Rails核心团队有很多工作要做,现在就投入进来并做出贡献吧!