XIACA NI SEPPO

By xiaca.

【問題】gzip圧縮にハマる。言語をまたいでやらないほうが良いかな?




gzip圧縮処理にハマってしまいました。恐らく7時間くらいハマっていたと思います。
一体どういう所にハマったかまとめておきます。

JavaScript&Go:gzip圧縮の違い?

さて、やろうとしたことは以下の処理です。
1.ブラウザ側(JavaScript)でJsonをgzip圧縮→Base64エンコード
2.サーバ側(Go)でBase64デコード→gzip解凍

上のようなことをやろうとしたんですが、どうにもこうにもブラウザ側で圧縮したgzipをサーバ側で解凍できない。圧縮が壊れているとでてしまう症状に見舞われました。

確かに、同じJSONをブラウザ側、サーバー側でgzip圧縮してバイナリを見てみると内容が違う。なぜかわからないけど・・・。こんなことにハマっていました。

JavaScriptだけ、Goだけだと動く

gzip圧縮もJavaScriptで圧縮したものをJavaScriptで解凍すると大丈夫。Go側も同様でした。理由はわからないです。バイナリが違うのは圧縮率の違いとかもあるのかなー。

今回はGo側で処理することに

さて、結局どうしたかというと今回はGo側でgzip圧縮することにしました。どちらかというとブラウザ側はキャッシュの問題とかもあって、圧縮形式を変更した時に、変更が即時反映されにくいかな?とおもったからです。

それに、圧縮する場所はどこでも大丈夫だったので...。問題がなければサーバー負荷を下げるためにもブラウザ側でやりたかったですけどね。今のスマホとかって私が使ってるサーバーよりよっぽど良いCPU、メモリを積んでるし。

まとめ:いつか原因特定しようかな?

今回は、ハマりすぎて疲れたこともあって、サーバー側での処理を選びましたが、また、いつか余裕ができたら原因解決してサーバー負荷を減らすような方式に変更したいですね。
まあ、それくらいアクセスがないとその心配もないですが、いつかその作業をしなければいけないくらいにはなりたいですね。