鳩舎

レースしない

gofu is tofu clone implemented by golang

go 言語かけるようになるとメス鳩のウケが良いと聞いたので頑張って勉強しました。リリースは大安か友引の日を選ぶタイプの鳩、ロージーです。

gofu(護符) という、弊社の id:mirakui さんが作ったイケてる画像リサイズサーバー、 tofu の go 実装です(tofu についてはこのへんを見ると良いです)。

もちろん全部機能が載ってるわけでもなく、ひみつのハッシュ値あたりとかはどう実装されてるのか知らんし今回必要ないのでつけてません。

護符が出来ることは以下で全てです。

  1. S3 から画像をとってきて表示することが出来ます(/image/path.jpg にアクセスすると S3 の /image/path.jpg を取ってきます)
  2. 取ってきた画像からは自動的に Exif その他のメタ情報が消えています。
  3. これらのパラメータでリサイズなどの処理を付与できます。
    • w : 画像の横幅を変更します(リサイズ)
    • h : 画像の縦幅を変更します(リサイズ)
    • q : 画像が jpg なら画像のクオリティを指定できます(1 〜 100)
    • b : 画像のブラーを指定できます(0.0 〜 1.0)
    • c : 画像をクロップします。横幅,縦幅,開始位置x,開始位置y のように指定します(ex: 100,200,10,50)
  4. JSON による設定ファイルでいくつかの挙動が変更出来ます。詳しくはコードを見てください(ドキュメントない)。
  5. LRU Cache を積んでいるので S3 から受け取った Blob をキャッシュします。デフォルトの保持数は 1000 エントリです。LRU Cache は廃止され、現在はファイルによるキャッシュになっています。 dir.cache にディレクトリを指定することが出来ます。現在はファイルベースでの LRU みたいなものをやろうと試行錯誤中です。
  6. 設定ファイルで fcgitrue にすると、 FCGI として起動します。 nginx とのお供にどうぞ。デフォルトでは普通の HTTP サーバーとして起動します。
  7. ログフォーマットを text/template による記法で自由設定することが出来ます。combinedltsv を指定すると、組み込みのフォーマットが採用されます。

多分これ以上の機能は実装してません。

とりあえず手元の MBA で動かしてる限りでは、1429 × 949 で 912KB の jpg を S3 から引っ張ってきて 100x100 にリサイズする処理で1回目は 2625ms 。2回目は LRU Cache が効いて 58ms でした。そこそこ。

並列性とかよくわかってないで書いてるので、複数のコネクションでリクエストが大量にくるとメモリリークかなんか起こして死ぬのではないかと疑っていますが、きっと golang だし大丈夫でしょ、ぐらいでまだ手を付けていません。

golang 簡単にそれっぽいプログラム書けて快適だし、皆も遊ぶといいと思います。

No more 仏滅。