しゃべぶろ

気になった技術の備忘録を残します。

JJUG Fall 2018 参加してきた

概要

JJUG Fall 2018に参加してきたので、そのレポート記載する。
てか初めて参加したのだが、人の多さにびっくりした。
ランチセッションでお弁当頂きました、有難うございました。

Java + コンテナ向けパフォーマンス分析手法の紹介と活用事例@米司伊織 さん

  • 測定ツール
    • AppDynamics
    • FlightRecorder
    • perfect-tool
      • アラウンドでタイムを測ってくれる
      • Linux標準
      • 多機能、低オーバーヘッド
    • Netflix Vector
    • Avalanche
      • ワークスアプリーケションズのOSS

思考停止しないアーキテクチャ設計@川島義隆さん

  • Software Architecture
    • Martin Flowler「重要かつ変更な意思決定である」
  • Architectural Decision Records
    • ソースリポジトリと同じところに、1つの意思決定単位に1つパターン記述に似た感じで記録する。
  • The Patterns of Stop Thinking
    • 限界意識の思考停止
    • 無意識の思考停止
    • 特別意識の思考停止
  • 検索エンジンの手法
    • リザルトキャッシュ
      • 結果を事前にキャッシュしようぜ
  • デグラデーション
    • 1機能は停止させても、メイン機能は落とさない
  • データベースでルールを定義
    • テーブルの柔軟性が低くなる
    • イレギュラーなデータが入った時良くない。
    • Application側でinterfaceを用意するぐらいで良いかなと
  • 参考文献
    • Software Architecture in Practice(3rd)
    • Design It
    • Software Architecture patterns

今こそStream API入門@櫻庭 祐一さん

  • Streamって何?
    • イテレータのこと、簡単に言うとループ
      • 外部イテレータ
        • 繰り返しの制御を自分で記述
        • for文、拡張for文
        • 繰り返し制御 + 処理を記載する。
      • 内部イテレータ
        • 繰り返しはライブラリにお任せ
        • Stream API
        • 処理のみを記載すれば良い。
    • 中間処理と終端処理に分けて考える。
      • 中間操作
        • 取捨選択する
          • filter
          • dropWhile 1引数 返り値 boolean
          • takeWhile
        • データの変換
          • map 1引数 返り値あり
            • 型を変換するときに使う。
            • flatmap 1引数 返り値Stream
              • 2次元配列を1次元配列にしたいときに使う。
              • 2次元配列をなめすで考える
      • 終端操作
        • 探す
          • findFirst/findAny ラムダ式なし
          • anyMatch/allMatch/nonMatch 1引数 返り値 boolean
        • まとめる
          • toList ラムダ式なし
          • groupingBy 1引数 返り値あり(Map)
        • 逐次処理
          • forEach 1引数 返り値なし
    • データがなければ空を返却するのでnull安全
    • 例外処理はbibherというの使う、にVにExceptionを入れる。
  • ラムダ式
    • 関数とクラスとの間
    • 関数のように記述ができて、クラスのように振舞う
    • 引数と返り値だけを決めた処理の記述法
    • 1行で書くならreturn文を省略可能
    • 1引数なら()を省略可能。
  • よく使われるラムダ式
    • 1引数 返り値あり Function
    • 1引数 返り値boolean Predicator
    • 1引数 返り値なし Consumer
    • 引数なし 返り値あり Supplier

Javaを活用したマイクロサービスのためのKubernetes@寺田佳央さん

  • Java9以降
    • カスタムJREが作成できるようになった
    • jlinkコマンドを使って行う
    • コンテナで動かすためには、小さい環境を作成するのが重要
  • Java11
    • xmlやCORBAのライブラリが抜けている。
    • xmlを扱うようなアプリケーションは動かなくなる。
    • 12以降は起動時間の短縮などかなり改善がされていく。
  • Docker
    • latest tagは使用してはいけない。
    • いつビルドしたものか分からないのでバージョンを指定した方が良い。
    • ビルドされたバージョンを追うのは大変。
    • 出来るだけ小さいサイズのイメージを作りましょう。
    • openjdkだけでも数100MB異なる。
    • Docker Hubのイメージは脆弱性を含んでいることがある。
      • なのでセキュリティをチェックする必要がある。
  • Kubernetes
    • 全ての機能をk8sを利用する必要はない。
    • 大規模k8sクラスタを構築しない。
      • アプリケーションがマイクロサービス化してるのに
      • インフラがモノシリックだと意味がないのでは?
      • クラスタが壊れたときに全サービスが消えてしまう。
    • LabelとServiceは重要なので覚えてほしい。
    • Persistence Volumeはおすすめしない。
      • スケールさせるのが結構難しい。
      • SDKを使用したファイル保存・変更をおすすめする。
      • アプリケーションに処理を依存させた方がいい。
    • DBはPodの中で扱うより、別サーバーで立てた方が良い。
      • Pod内だと管理がしにくい。
    • Version Upは慎重にやってほしい。
      • 新しいバージョンにした場合は古い設定が動かない可能性が多い。
      • yamlを修正したり、コマンド引数を変更したり。
      • 新しいクラスタ環境を作成してから、カナリアリリースした方が良い。
    • 問題は発生した時は?
      • kubectl describe pod
      • kubectl logs POD_NAME
      • kubectl exec -it POD_NAME /bin/sh
      • kubectl get events -w
      • Deploy Ubuntu pod in same NameSpace
    • Virutal Kubelet Serveless
      • サーバーレス環境でKubeを実行出来るようになった。

秒間200,000req/secをさばく広告入札システム@磯田浩靖、山崎良祐さん

  • チューニング
    • まずはホットスポットを見つける必要がある。
      • ツールやプロファイラを使う必要がある。
    • perfとFlameGraphを利用
      • FlameGragphはNetflixOSS
      • perfの結果を可視化するツール
  • FlameGragph
    • 縦軸はメソッドの実行数がわかる。
    • 横軸はメソッドの処理時間の割合があわかる。
    • 処理名で検索することができる。
    • 下がJavaのプロセス、下から追っていく。
    • まずは全体に対して幅を取っている箇所をチューニングする。
    • 改修前後で幅が異なるとデグレしている可能性がある。
  • Java以外のチューニング
    • レイテンシが劣化したからといってJVMが悪い訳ではない。
    • Looking Glassというツールでネットワークの経路をがわかる。
    • tcpdumpでnginxのレスポンンスタイムを計測する。
  • Frame Scope
    • Frame Graphを時間単位でスライスして可視化するツール
    • 濃い色になるセルはperfのバグなので無視
    • logbackがファイルをローテートするために、CPUが処理を待ってしまう。
    • ログを作成しているときはロックされてしまう。
    • CPU使用率100%となるが意外に動いていない時がある。