2021-12-08

golang: 一時的/恒久的なエラーの隙間をハンドリングする

これはGoアドベントカレンダー3の8日目の記事です。

外部のAPIと連携して仕事をするサービスを長年運用・開発しています。 エラーが発生しある仕事が完了できないことがあり、その場合はエラーレポートを見て手動対応します。 なるべく運用負荷を減らすため、エラーの自動対応を進めていく過程で見つけた方針・実装テクがあるので紹介します。

ポイント

  • 一時的なエラー、恒久的なエラーのあいだにはグラデーションがある
  • エラー自身にエラー対応をさせると複雑さが減る


エラーのグラデーション

エラーハンドリングの記事を探すと、func Temporary(err) bool で一時的なエラーか判別してリトライをかますのをよく見ます。 一時的なエラーとは例えばネットワークのTimeoutなど。時間をおけば自動的に回復ししそうなもの。 それ以外はぜんぶ恒久的(Permanent)なエラーとしてレポートを上げてしまう。

実際に運用していると上がってきたエラーにはなにか対応が必要なので手を取られてしまいます。 可能ならば自動対応してエラーレポートしないようにしたい。

運用をつづけていて一時的なエラーと恒久的なエラーのあいだに次のようなエラーの種類があることに気づきました。

  • そのままではリトライしても成功しないけれど、何かの操作をすれば成功する状態に持っていける回復可能なエラー
  • どうやってもリトライ成功にはできないけど、失敗した状況をマシにしたり詳細なレポートを作れるフォロー可能なエラー

単に一時的なエラーかそうでないかだけでなく、これらを区別してハンドリングすることで成功率を上げて手動対応を減らすことを目指します。

区分 自動対応 レポート 説明
一時的 不要
回復可能 不要 なにか操作することで回復可能
フォロー可能 不可 必要 回復不能だがより良い状態に出来る
恒久的 不可 必要



2021-12-04

Clojureで行列計算を実装したときに考えたトリック

これはClojureのアドベントカレンダー2021、4日目の記事です。


趣味でディープニューラルネットワークのフレームワークをClojureでゼロから実装しています。

「ゼロから」とは行列計算から。

deltam/neuro: Deep Neural Network written in Clojure from scratch

そのときに行列計算についてあるトリックを思いついて実装したら早くなったのでそれを紹介してみます。関数的プログラミングっぽい発想で、ほかにも応用が効くかもしれない。Clojureのデータ構造の勘所もすこし分かるかも。

注意:完全なる趣味の行いなので単に行列計算したいだけならそれ用のライブラリを使うほうが100倍かしこい。
実用的な知識というよりちょっとしたトリックを面白がってくれればありがたい。

ニューラルネットの学習では行列の転置をよく使うんですが、プロファイルを取ってみたらそこが遅かったので何とかしたいといろいろやって思いついたトリックです。
思ったより応用が効きました。