かまたま日記3

プログラミングメイン、たまに日常

JJUG CCC 2015 Springに参加した

お久しぶりです。最近は技術TipsはQiitaに書く事が多いので、ブログはご無沙汰でした。 最近社外勉強会参加してないなーと思い、ちょうど朝にTwitterで開催されていることを知りw、久しぶり*1に参加てみました。 結果めちゃくちゃ刺激受けました。やっぱりこういうのは定期的に参加しないといけないですね。

以下自分が参加したセッションの感想とかメモとか。

F-1 だれも教えてくれないJavaの世界。あと、ぼくが会社員になったわけ。

「ソフトウェアのトレンドは動かすハードウェアの性能に左右される」と言っていたのが印象に残りました。確かにそうだなーと。

  • Javaの過去と未来

    • 黎明期->黄金期->停滞期->再生期(イマココ)
    • ソフトウェアは大人の事情に左右される
      • sunが苦戦してた時期とjavaが低迷していた時期が一致
    • Javaとハードウェア
    • ハードウェアや、低レイヤーの技術を扱える必要があるかも
      • Project Valhalla/Panama
      • Project Smatra
      • Synthesijer(JavaRock)
  • きしださんが会社員になったわけ

    • フリーランスの限界
      • 不自由(何をするにも受注もとの了解が必要)
      • 仕事がこまぎれ
      • リスクが取れない(自分ができる仕事しか受けられない)
      • 大掛かりなテクノロジーにさわれない
  • 今のところは?
    • おおむね満足

G-2 クラウド時代の Spring Framework

本当は裏番組のテストの話が聞きたかったんですが、人が多すぎたのでこっちにw でもめっちゃためになりました。Springはオワコンとか言われることもありますが、今でもちゃんと進化していますね。 SpringCloudとNetflixOSSはどこかで使ってみたいと思いました。

  • SpringIOプラットフォーム
    • SpringIOのdepencencyを指定するだけで、関連プロダクトの依存関係をすべて解決してくれる
    • SpringBootと思想的にはちょっとかぶっている、らしい
  • CloudFoundry
    • VMWareが買収、2011年くらい
    • Ruby(Rails)だったのをGoに置き換えているが、CloudFoundryの認証システムはJava/Spring(Security)
      • SpringSecurityの認証の仕組みはまだまだ強い, Rubyには同等のライブラリはない
  • SpringCloud
  • SpringCloudConfig
    • 設定ファイルを外だしして、REST経由でアクセス出来る仕組み
      • マイクロサービスに対応出来るように
  • SpringCloudBus
    • 分散環境を軽量なメッセージブローカーで結ぶ仕組み
      • 設定ファイルの動的変更など
      • AMQPのみサポート
  • SpringCloudNetflix
    • NetflixのOSSとSpringを統合する仕組み
    • Eureka : Service Discovery
      • Service Locatorパターン
      • 自身が使うクラウド上のサービス(DBとか)を管理するしくみ、自動で負荷分散する
    • Ribbon : Client Side Load Balancing
      • オレオレ負荷分散ルールに対応
      • Templete
        • 「DBからデータを取ってきて、JSONを返す」みたいな良くある処理の総称
          • RibbonをInjectするとテンプレートを負荷分散してくれる
    • Hystrix : Circuit Breaker
      • 意味合いとしては家のブレーカーと同じ
        • Release itという本に出てくるらしい
          • (余談)NetflixのOSSはrelease itを実装したものが多い、らしい
      • メソッドに@HystrixCommandを付けると、一定回数以上のエラーが発生すると、fallback先のメソッドが呼ばれる。
    • Zuul : Intelligent Routing
      • これの話はしていなかった気がする…
  • (余談)Netflixはspringやgroovyを使っている割合が大きいらしい。

AB-3 大規模な負荷でもドキドキしない為のJava EE

負荷テストやスケールアウトには銀の弾丸はない、地道に基本に忠実にやるしかないって感じですね。 JMeterのTipsはとても参考になりました。

  • 負荷テストの話
    • アンチパターン
      • シングルスレッドで実行
      • UseCaseとかけ離れたシナリオ
      • 複数のコマンドを叩いて手動実行
    • 負荷試験の目的
      • システムの限界性能を知る。
        • キャンペーンなどを打つときにどれくらい鯖を用意するとかをはっきり言えるようになるのが理想
      • 高負荷時の不具合を発見する。
    • 負荷テストをCIに組み込む
  • JMeter
    • 便利機能
      • Httpのプロキシとして振る舞って、実行した内容をテストケースにしてくれる
      • Selenium Sampler
        • SeleniumIDEの操作をテストケースにしてくれる
      • Junit
        • 任意のJunitのテストを負荷試験で試験出来る
        • HTTP以外のプロトコルや、細かい負荷試験のチューニングの時に便利
    • よくやるパターン
      • インテグレーションテストで作ったシナリオを使って負荷試験する
    • maven統合
      • jmeter-maven-pluginを使うとverifyフェーズで実行出来る
        • Tips: ThreadGroupの設定とかをmavenのプロパティにする(良く調整するので)
    • Jenkins統合
  • 負荷試験あるある(の一つ)
    • リクエストが遅い(負荷試験サーバのリソース枯渇)
  • リソース監視
    • GREEではGangliaを使う事が多い(muninとかzabbixとかと同じような感じ)
    • Mission Control
      • Flight Recorderで取得したJVMの統計情報を可視化するツール
    • jcmd
  • JPAのスケールアウト事例
    • READが頭打ち
      • Slaveにレプリケーション
        • JDBC, MysqlReplicationDriver
          • Connection#setReadOnly(true)とすると、スレーブに読み込みに行く
    • WRITEも頭打ち
      • パーティショニング
        • JPAのパーティショニングAPIを使おう
          • EclipseLinkとHibernate(Hibernateはメンテされてない模様)
          • DataNucleusというのもある
  • データの設定とテストケースの管理はどうしている?
    • データはオンメモリ(H2)を使ってBeforeClassで投入している
    • 負荷試験の場合のデータ管理は、RESTなどを使ってユーザーの初期化を行う口を用意して、BeforeClassで叩く的なことをしている。
      • たとえば、userId=xxxのユーザーデータを初期化するためのAPI

『Embulk』に見るモダンJavaの実践的テクニック ~並列分散処理システムの実装手法~

発表中にちょっとしたトラブルもありましたがw、Embulkは実際に利用を検討中なので中の人から直接仕組みや使っている技術を聞けたのが良かったです。

  • Embulkとは
    • Embulkを作った経緯
    • Executorが実行
    • Config diff
      • どこまでやったか
    • Resume(再実行)
  • Java実装技術
    • Java7ネイティブ
      • try-with-resources
        • 一時的にスレッド名を変更する場合などもAutoClosableを実装したりしている
      • Date and TimeはJRubyを使っているが、ボトルネックになりつつある
    • GuiceによるDI
      • xmlは使わない
      • Annotationによる宣言的なDIとinjectorによる動的なDIを平行で使っている
    • ServiceLoaderによる拡張
      • META-INFに記述
        • jarをクラスパスに入れるだけでモジュールを差し替えられる
    • JacksonによるModelクラス
      • 並列・分散実行のために
      • JRuby <=> Javaの連携のために
      • 全部Javaのコード上で宣言
      • Immutableを意識、コード中のメンバ変数の約70%がfinal
    • Nettyバッファアロケータ
      • レコード群のためのメモリをすべて自前管理
      • OOMが起こる前に検出・GCコスト削減
      • 複数プロセスで実行した場合のメモリの管理を実現したい
    • Unsafe
      • バイト配列の直接操作
      • コピー削減

*1:3年ぶりくらい