JavaOne2014 3日目メモ (9/30)

今日も晴れていて、過ごしやすい気候。3回目のJavaOneでも雨に振られたことがないので、サンフランシスコは雨が少ない地域なのだろうか。

Building a Distributed Application for the Cloud with Akka Clustering and Java 8 [TUT6483]

PlayフレームワークとAkkaを組み合わせて、最近話題のリアクティブなシステムを実現しましょうという話。

リアクティブ・マニフェストについて

詳細については原文を参照のこと。

f:id:n_agetsuma:20141002083537p:plain

  • Responsive (応答性)
    • システムは可能な限り最適なタイミングで応答すること。
  • Resilient (障害からの回復)
    • システムは処理が失敗した場合にも、失敗したことを応答すること。これは高可用性やミッションクリティカルシステムだけに求めるのではない - 処理の失敗時に何も応答できないシステムはResilientではない。
  • Elastic (柔軟性)
    • システムは大量のリクエスト下においても、応答すること。
  • Message Driven (メッセージ駆動)
    • リアクティブなシステムは、疎結合で独立性が高く、配置されたロケーションに依存しないコンポーネント間の非同期メッセージングのやり取りによって成り立つ。
実現手段

リアクティブなシステムを実現するためには『決してブロックしてはならない。常に非同期にすること。』が求められる。この実現手段としてPlay2Akkaの組み合わせが紹介された。

  • Play2
    • 非同期でノンブロックングな処理が実装可能
    • ステートレスなのでスケールする
    • RESTful & WebSocketのサポート

Playやakkaを使わなくても、分散システムでスケーリングさせるためには、以下のようなことに気をつける必要がある。

  • いかに軽量にコンポーネント間の通信を行うか (最近はRESTやMQTTなど)
  • 非同期でかつ並行処理でないと、いくらマシンを増やしてもスケールしない
  • クラスタ機能
    • 故障検知、ロードバランス機能

色々とデモコードが紹介されたがうまく理解できなかったため、akkaを実際にいじってみるのが宿題。javaでも動くらしい。

Vert.x + WebSocket + Cloud = Awesome Map Tracking [CON1695]

Vert.xでwebsocketを実装して、以下の画面のように常に動くバス情報をブラウザ上の地図画像にアイコンとして表示するデモのセッション。RedHatが提供しているPaaSであるOpenShiftがVert.xに対応しているので、合わせてOpenShiftの紹介も少し。スライドはこちらで公開中。

f:id:n_agetsuma:20141002093136p:plain

セッションの冒頭で早速『今までのTomcatJBossと何が違うの?』という質問が飛ぶ。分散環境でフレキシブルに重点を置いた新しいアーキテクチャと答える。

Vert.xの特徴
  • 多言語対応 : JVM言語で動く言語であれば言語を選ばない
  • 非同期処理
  • NettyをベースとすたノンブロッキングI/O
  • イベントバス
    • 同一VM/リモートVMに配置されたVerticle(モジュールのようなもの)の通信手段を提供

akka、Vert.xなど、非同期とノンブロッキング、スケールを意識した比較的新しいアプリケーション基盤がC10K問題にぶつかるような高アクセスシステムで使えそうなのは理解したが、身近なところで使えそうな領域を探すのが帰ってからの宿題。

Going Native: Bringing FFI to the JVM [CON3979]

従来のJNIに代えて、もっと簡易にネイティブコードが呼び出せる仕組み JNR (Java Native Runtime)に関するセッション。スピーカーはJRubyの開発者であるCharles Nutterさん。JNRについてはgithubにて公開中

JRubyを作っていて困った事

Javaで作られているJRubyを作るにあたって、OSレベルへのアクセス、例えばファイルシステムアクセスや、グラフィック/暗号化などのネイティブライブラリへのアクセスで困っている。しかし既存のJNIは使いにくい面も多い。もっと簡単にネイティブコードが呼び出せる仕組みがあると良い。

JNRのコード例

現在のプロセスIDを取得するlibcのgetpid関数を呼び出す例。とても直感的なコード例になっている。

import jnr.ffi.LibraryLoader;
import jnr.ffi.annotations.IgnoreError;

public class GetPidJNRExcample {
    public interface GetPid {
        @IgnoreError
        long getpid();
    }

    public static void main(String[] args) {
        GetPid getpid = LibraryLoader.create(GetPid.class)
                                     .load("c");
        getpid.getPid();
    }
}
JNRの構成要素

ユーザレベルの関数だけでなく、色々なネイティブ関数にアクセスできる。例えば以下のようなもの。

今後に向けて
  • この仕組みをJava標準のFFI(Foreign function interface)として実現するには、JVMの協力が不可欠
  • 現状のところ、JDKの改善提案であるJEP 191としてドラフトを提案
  • Project PanamaとしてJDKレベルでAPIの定義や、JVMレベルの最適化、セキュリティへの考慮などを検討中
  • 将来的にはJSR(Java Specification Requests)として検討したいが、現状は未定

The Modular Java Platform and Project Jigsaw [CON5435]

前々から検討されているJDKへのモジュールシステム導入 Project Jigsaw に関するセッション。

互換性の維持と新機能の要望により増え続けるJDKのコアAPI実装にモジュール化システムを導入して、使いたいモジュールのみをロードする仕組みを作る。デモではrt.jarがなくなったよとのアピールがあり。

jlinkと呼ばれるツールで依存性を管理するらしいが、詳細は理解できなかった。JDK9のEarly Accessには今のところJavaOneでデモがあったjlinkやrt.jarの削除が盛り込まれていないので、JDK9のEAにマージされるのが待ち遠しい。

JSON Pointer and JSON Patch: Updates to the Java API for JSON Processing [CON5742]

  • 後日追記予定

Troubleshooting with Serviceability and the New Runtime Monitoring Tool HeapStats [BOF3108]

NTT OSSセンタが開発したJavaトラブル解析支援ツール HeapStatsBOF。NTT OSSセンタはNTTグループ会社向けのOSSのテクニカルサポートを提供しており、頻出トラブルとトラブル解決の迅速化を目的に開発されたHeapStatsの紹介が行われた。

よくあるトラブルについて

OSSセンタに寄せられたサポート依頼では、ヒープ関連のトラブルシュート依頼が特に多かった。

  • Heap/Perm/GC 31.3%
  • API 20.1%
  • JavaVMのクラッシュ 19.3%
トラブルシュートの課題

情報がない
ヒープのトラブルが多いが、トラブル発生時のヒープダンプが残っていない事も多く、-XX:+HeapDumpOnOutOfmemoryErrorをトラブル発生後に追加してもリークスピードが遅く、再現に数ヶ月かかるケースもあった。

既存ツールは重い
ヒープダンプは取得に時間がかかるためサービス影響が大きく、ヒストグラムではオブジェクト間の参照が見れないため解析情報が不足する。

HeapStats

HeapStatsの特徴は以下の通り。

  • トラブルシュートに必要な情報を漏らさず収集
    • JVM動作中に定常的に少しずつヒープ情報を収集
  • 軽量
    • HeapStatsはメジャーGC契機で情報収集するので、新たなStop the worldを発生させない。
    • SPECjvm2008では、HeapStatsアタッチによるオーバヘッドは4.51%
  • 可視化
    • HeapStatsエージェントで情報収集したバイナリ形式のヒープ情報を、GUIツールのHeapStatsアナライザで可視化

クラスヒストグラムの推移を示したHeapStatsアナライザ表示例
f:id:n_agetsuma:20141003074328p:plain

オブジェクト間の参照関係を示した表示例
f:id:n_agetsuma:20141003074400p:plain

HeapStats、Javaトラブルシューティングに強力です。