ITお絵かき修行

3歩歩いても忘れないために

JavaDayTokyo2016メモ【3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか】

JavaDayTokyo2016に参加した。
下記セッションに参加したので、参加メモを書いておく。
www.oracle.co.jp

[3-E: Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか]

TIS株式会社
アプリケーション開発センター シニアエキスパート
川島 義隆 氏

【概要】

Java9で追加された新機能を使った設計・実装の紹介
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか

【内容】

1.nullチェック

・Optionalクラスを使いましょう、という話。
・Optionalクラスの使い方としては、nullが発生しうる実装個所を包み込むように実装すべき。
Javaの個々のAPIはnullチェックを意識した戻り値となっていないので、
Optionalを使ってAPI単位でのnullチェックを行うべき。

2.Mixin

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。
Mixin - Wikipedia

Javaは多重継承が認められていない。そのため、ミドルウェアパターンの実装を行う場合は、ミドルウェアに対応するサブクラスを実装する。(例:ResultSet)
Javaミドルウェアパターンを実装するときは、事前に(※I/F側に)多くのメソッドを予め用意しておく場合が多い。
・Java8以降ではI/Fにデフォルトメソッドを持つことが可能となったので、共通的な実装をI/F側で持つことができるようになった。
→ただし状態を持つことはできないので、デフォルトメソッド内からI/Fの別メソッドを参照するような実装をしておき、実装クラス側からオブジェクトを渡すよう強制する、といった方法をとることができる。
・動的mixinの方法として、MethodHandleというクラスがJava7から追加された。
→ただし従来のリフレクションの10~100倍遅い。

3.システム挙動の動的な変更(using REPL)

・アプリケーションに管理用APIを用意するには、という話。
・enkanというFWでは疑似REPLが用意されており、REPLからMWの状態を変更することが可能。
→enkanではJShellを取り込む、とのこと。

4.Java9時代の無停止デプロイ

●従来
①LBでサーバごと切り替え
→問題点:サーバが2台ないし3台必要。
②APサーバ(コンテナ)で対応
→問題点:メモリリーク

●これから
JVMのプロセス単位で切り替え


・SO_REUSEPORT((Linux kernel 3.9~より利用可能。同じuidから利用可。Windowsでは不可)という仕組みを利用して、同一ポートに対してリッスンするプロセスを複数立ち上げる。
・SO_REUSEPORTの利用には、ServerSocketChannelクラスのメソッドを実装したAPサーバが必要。現状だとJettyくらいしか選択肢がない。
・falchion-containerというJVMプロセスをプールするコンテナを作られたそう。
JMX・JStatで監視。

5.まとめ

・過剰設計が必要だったJavaも、必要なものだけを作ればよいという時代になった。
シンタックスのキャッチアップだけではなく、設計手法のアップデートもしよう。