You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6 应用如何优雅处理 AWS Aurora 故障转移的异常问题

Rails 6 处理 AWS Aurora 故障转移方案评估

你的现有实现是可以正常生效的,但存在几个可以优化的点,调整后更符合Rails生态的惯例,也能减少副作用:

现有方案的不足

  • 只清理连接但没有重试逻辑,用户侧仍然会收到错误响应,没有达到「优雅处理」的目标
  • 正则匹配范围太宽,可能误触发其他不相关的ActiveRecord::StatementInvalid异常的连接清理逻辑
  • clear_all_connections!会清理当前进程所有的数据库连接,会影响到同一进程下其他正在处理的正常请求,性能损耗更大

优化后的实现方案

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::StatementInvalid, with: :check_read_only_failover

  private

  def check_read_only_failover(exception)
    # 更精准匹配Aurora故障转移后的只读异常和连接断开异常
    return unless exception.message.match?(/PG::ReadOnlySqlTransaction|Lost connection|gone away/)
    # 仅清理当前线程活跃的连接,避免影响其他请求
    ActiveRecord::Base.clear_active_connections!
    # 限制重试次数,避免无限循环
    @read_only_retry_count ||= 0
    if @read_only_retry_count < 1
      @read_only_retry_count += 1
      retry
    end
    # 重试失败再抛出异常
    raise exception
  end
end

额外补充建议

如果你的应用还有非控制器链路的数据库操作(比如Active Job、Rack中间件直接处理的请求),可以额外实现一个轻量的Rack中间件,把相同的异常处理逻辑放在中间件层,覆盖全链路的异常场景。

内容的提问来源于stack exchange,提问作者henryaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:18:03