通过示例进行 Rails 异步查询

主要观点: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 请求的端点,可并行化以提高整体响应时间。
阅读 6
0 条评论