Goで接続が失われた場合の対処方法は?
現在人気のある sql パッケージについて調査したところ、接続が失われた際に即座にエラーを通知する機能がほとんどないことに気付きました。例えば、nodejs の mysql では、connection.on(‘error’) を使用してエラーを監視できます。
しかし、golang(少なくともいくつかの人気のあるパッケージ)には、そのような機能がありません。さらに深く探ると、その理由も理解できます。
The sql package creates and frees connections automatically; it also maintains a free pool of idle connections. If the database has a concept of per-connection state, such state can be reliably observed within a transaction (Tx) or connection (Conn). Once DB.Begin is called, the returned Tx is bound to a single connection. Once Commit or Rollback is called on the transaction, that transaction’s connection is returned to DB’s idle connection pool. The pool size can be controlled with SetMaxIdleConns.
簡単に言うと、sql.Open を呼び出すと、実際には接続が確立されず、内部で接続プールが管理され、必要なときにのみ接続を試みることになります。つまり、クエリを実行中にネットワークの問題で接続が失われた場合、database/sql は内部でリトライを試みてくれるのです。
これに関してはありがたいことですが、クエリを実行して初めて接続が失われていることを知るのではなく、その前にアプリケーション全体がこの状況を把握できることを望んでいます。
このようなことを実現したい場合、底層の Dialer ロジックを改修し、ネットワークが切断されたときに即座にプログラムに通知できるようにする必要があります。
関連記事
- 測定が目標になったとき:窓税から Pull Request 数まで 僕はかつて、小さなツールを書いて自分が四半期にどれだけ PR を出し、どれだけ review を残し、どれだけ ticket を解決したかを集計し、数字で上司に成果を示そうとした。上司はただ、評価は成果だけで決まるわけではないと言った。数年後になって僕はようやく理解した——測定が目標になった瞬間、それはもはや良い測定ではなくなるのだと。イギリスの窓税からハノイのネズミ懸賞金、そして今日の PR 数による開発者評価まで、仕組みはまったく同じである。
- 画像のストレージと変換を Cloudflare Images に任せる Web ページに画像を一枚置くのはフロントエンドで一番簡単なことだ。でもそれをちゃんとやる——リサイズし、各フォーマットを生成し、トラフィックにも耐える——となると、実はひとつの解決策まるごとになる。だから僕は結局、原画一枚だけ渡して全部 Cloudflare Images に任せた。
- Access Keyはもう使うな Access KeyはAWSで見落とされがちなセキュリティリスクだ。OIDCとIAM Roleを組み合わせれば、GitHub Actionsはsecretなしで安全にAWSリソースを操作できる
- データベースの主キー: AUTO_INCREMENT、UUID、UUIDv7 バックエンド開発では主キーをどうするかをよく決める必要がある。auto increment か UUID か、衝突はどうするか、UUIDv7 と created_at + index の性能差はどれくらいか。実際に 2000 万件のデータで検証し、設計判断までまとめる。