JJUG CCC 2018 Spring にて発表しました #jjug_ccc
表題の通り 2018/05/26 開催された JJUG CCC にて発表してきました。
セッションが1つとLTが1つです。
セッションの方は 「(俺が)はじめての Netty」 で、LT のタイトルは「Spring Boot アプリケーションの起動を速くする 108 の Tips」です。
資料はこちらです。
- セッション資料
www.slideshare.net
- LT 資料
www.slideshare.net
題材についてですが、なぜいまさら Netty を選んだか?ですが、僕はこれまで Netty と聞くと「速いサービスで使われている I/O のライブラリーね、なるほどね(理解していない)速いよね(理解していない)」という感じで、技術者としては思考停止に陥っていたので一発奮起して、かつ勉強がてら発表してみようと思って CFP を書きました。
CFP を書く頃はまだチュートリアルを一通りやって、少しだけ Channel
とか ChannelHandler
、 ByteBuf
のjavadocを軽く読んだだけの状態で、このあたりを押さえればよいだろうと言う感じで CFP を書いていました。
ただ、実際にその程度の理解では何も発表資料が書けないことが見えてたので、 Netty In Action を購入して、 Comprehensive な知識を習得することにしました。そして、 2週間程度で Netty In Action は読み終わったのですが、その結果として僕はまだ java.nio.channels
(NIO) 周りのAPI および内部実装をちゃんと理解できていないことに気づきました。さらには NIO が解決している課題をちゃんと説明できないのではないかという思いも生じていました(C10K 含めて知識としてはあっても、それを初級者がわかるように説明できないのではないか)。そこでもう少し低レイヤーのシステムコールも含めて勉強しました。そのうえで、OIO/NIO の知識を構築し直すと、Netty が何を解決しようとしているのかがわかるようになってきました。また、 NIO が抱える諸問題(といっても大したあれではない)を Netty はどのように解決するか描き出すのが良さそうなことがわかったので、これが最終的な資料の原型になったと思います。
また Netty の内容の説明を全面に押し出そうとおも思っていたのですが、レベル設定を初心者向けにしていたこともあるので、NIO の仕組みを確実に抑えた方が理解に役立つ(むしろ Netty の説明だけしてたらポカーンされる)と考えたので、半分ほどを NIO の話になっています。本当はもっと応用っぽいこともやってみたかったし、その準備もしてました(WebFlux 〜 reactor-netty のあたりも調べてた)。
以上がセッション資料を書くときに考えてたことです。
発表前に まーや さんが面白いことを言ってくれたので会場の雰囲気が軽くなりました。非常に有難かったです。
発表終了後にいくつか質問をいただきました。
- サーバーでコネクション(ペイロード長)の設定できるのか?
- NIO の場合、
ServerSocketChannel#<T>setOption(SocketOption<T>, T)
で設定します。SocketOption<Integer>
としてStandardSocketOptions#SO_RCVBUF
を使います。 - Netty の場合、
ServerBootstrap#<T>childOption(ChannelOption<T>, T)
で設定します。ChannelOption<Integer>
としてChannelOption#SO_RCVBUF
を使います。
- NIO の場合、
- Http で Multipart で大きなファイルを受け取る場合の実装方法
- netty example の http あたりが参考になります -> github.com
- Netty の http モジュールでサーブレット相当のことができるか?
- 残念ながら、そこまではできないので、別途 reactor-netty あるいは Spring WebFlux などの上位のフレームワークを使うのがよいです
LT 発表ですが、発表待ちの最中に セバスチャン が突然僕の前でLTすることになって、若干プレッシャーがかかりました。しかし、彼のおかげで LT を聞こうとする人が増えたのでラッキーな発表順だと思いもしました。
LT の方は以前 jsug で発表した内容の焼き直しです。jsug は Spring の勉強ということもあるので、技術的にどうしてこれをやると速くなるのかという説明を入れていましたが、CCC の LT ではそのあたりは省きました。懇親会なのでお酒入っていて理解できないだろうし、ここ数回ほどJJUG CCCでLTをして得ている印象では、そのような説明よりもっとわかりやすい部分を長く強く説明したほうが笑いを取れるだろうと考えたからです。なお、結果的に笑いがとれたので、僕的には満足です。
ちなみに、このようなお言葉をいただきました。
JVMになりたい人に続いて、 Spring Boot になった人が現れた https://t.co/HwxVtZ5BOg
— kentaro.maeda (@kencharos) 2018年5月26日
「 @SpringBootApplication
になった人」、いい表現ですね。 じゅくちょー ばりにそれで売っていこうかな…でも、 「俺自身が @SpringBootApplication
になる」の Spring Boot アプリケーションを書くのが非常に面倒なのでどうしようかな…