主要观点:Rails 7 中异步查询是备受关注的特性,能大幅提升应用性能,通过在后台执行长时间或复杂查询来实现。异步查询与同步查询相对,同步是任务依次执行,异步是任务可同时进行,如杂货店的人工收银线是同步,自助收银区是异步。
关键信息:
- Rails 7 前利用多线程需使用
concurrent-ruby
等 gems 且需了解线程内部工作原理。 - 在 Rails 7+中,只需在 Active Record 关系对象后添加
.load_async
,即可通过Concurrent::ThreadPoolExecutor
在后台异步执行查询,不阻塞主线程。 - 启用异步查询需在
config/environments/_whatever_env_you_are_using_.rb
文件中添加config.active_record.async_query_executor = :global_thread_pool
。 - 用
.async_count
替代.count
会返回Promise
,需调用.loaded?
检查查询是否完成,调用.value
获取值,否则会出错。
重要细节:
- 以类似 Reddit 的应用为例,同步执行多个数据库查询需 600ms,异步执行最多 300ms。
- 异步查询的好处包括提高性能、增加整体响应性、降低多线程应用复杂性、保留内存。
- 但不应随意使用异步查询,对于简单查询无必要,不能在事务块、预加载查询或回调中使用,每次调用
.load_async
会打开新数据库连接,可能降低数据库性能,需进行基准测试和监控以确定使用位置。常见使用场景是有慢查询和第三方 HTTP 请求的端点,可并行化以提高整体响应时间。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。