夕方からずっとJavaScriptでgzip圧縮&base64エンコード→base64デコード&Golangでgzip解凍の処理にハマり続けている。— xiaca@aahub.org (@scrpgil) February 22, 2018
もう両方サーバーでやっちゃうか・・・
なんか、バイナリ見るとJavaScriptとGolangでgzipの結果が違うように見える— xiaca@aahub.org (@scrpgil) February 22, 2018
ここはgzip圧縮もGolang側でやってJavaScript側のGzip圧縮は時代が動くのを待とう— xiaca@aahub.org (@scrpgil) February 22, 2018
通信は一回余計に入るが確実ではあるのかな— xiaca@aahub.org (@scrpgil) February 22, 2018
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、メモリを積んでるし。
まとめ:いつか原因特定しようかな?
今回は、ハマりすぎて疲れたこともあって、サーバー側での処理を選びましたが、また、いつか余裕ができたら原因解決してサーバー負荷を減らすような方式に変更したいですね。
まあ、それくらいアクセスがないとその心配もないですが、いつかその作業をしなければいけないくらいにはなりたいですね。