Play your life !

趣味と実益メモ

JJUG CCC 2018 Spring に行ってきたメモ

JJUG CCC 2018 Spring

www.java-users.jp

Container技術が流行ってきた昨今の様々な現場の話を聞けて楽しかったです。 幅広い話を聞いてきました

聞いたセッションは下記。

  • JavaWebサービスを作り続けるための戦略と戦術
  • Concourse CI入門 ライブ環境構築&ビルド
  • 日本最大級の求人検索エンジン「スタンバイ」を支える技術
  • Java10まとめと、どうなるJava11
  • JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜
  • Spring Boot on Kubernetes : Yahoo! ズバトク事例
  • DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話

ビズリーチの方の"JavaWebサービスを作り続けるための戦略と戦術"がかなり参考になりました。
また、ジャストシステムの方の"DDDとクリーンアーキテクチャ"も実践的な事例の話で刺激的でした。

いずれのセッションでも、貴重なノウハウを拝聴できて面白かったです。 登壇者の皆様、ありがとうございました!

以下聞いたセッションのメモ書き

JavaWebサービスを作り続けるための戦略と戦術

感想

スピーカーの方の熱意が伝わってきた。
開発の理想とそのために何をやってきたのか、という話。 手段としてDockerFileを学んでいくべきだというメッセージも強かった。

まとめ

  • 開発環境とは、本番用ではないものすべてのアプリケーションが動く環境を指す
    • エンジニアではない人も触れるもの
    • 動くソフトウェアを作るためのもの
      • 誰かのPCでは動かない、とかはNG
  • あるべき姿
    • setup.shでミドルウェアが全部入る
      • VitrtualBoxがあるかどうか判定→インストール というところから全部一括で行う
      • プロジェクトごとに作成する→複数プロジェクトに参画している人では動かせない、ではNG
    • 仮想OS on 仮想OS
      • docker on VitrtualBox on Mac
    • dockerはなぜ利用するか
      • 単純に早い
      • 未来像として、Container技術に集約されそうな未来がある。
        • dockerfileを作成するのはアプリ開発者である→学ぶべき
    • ツールの変更
      • maven→gradle
        • pom.xmlよりbuild.gradleのほうが読みやすい
        • groovyで何でもかけるからカスタムしやすい
      • jenkinsを2系に。
        • jenkins1系をjenkins 2に。→maven向けのjenkinsfile→mavenをgradleに→JenkinsFileをgradle向けに
    • 目指す先
      • PR一つに対してそれ専用の検証環境が一つ自動構築されるのが理想
      • 環境の空きを待つことなく、いつでも誰でも、確認したいものについて確認できるようにする
  • 老朽化した技術からの脱却
    • JasperReport
      • Java8だとデザインツールが事実上動かないので、独自に作り直した
    • JSessionID
      • セッションCookie名がJSESSIONIDだとドメイン、パス、名前で区別するので都合が悪い→今はもう別の名前で設定できる。
      • ticky-session-cookie の調整も一緒にやる。
    • 設定ファイル.xml
      • java configにまとめましょう
    • webapp
      • もう使わないでおk
    • その他情報たくさんだったけどペース早くてロスト・・・
  • フロントエンド
    • Swaggerすごい。
  • 手動・自動テスト
    • テストコードに価値はなく,その実行結果を見たあとの行動に価値がある
    • PRごとにjenkinsで自動テストが走る
    • MRも工夫。誰かがレビューコメントしないとMergeボタンが押せないようになっている
  • セキュリティ
    • AWSのシークレットOS環境に渡す
    • など。
  • バージョンアップ
    • こまめにバージョンアップするしか無い。
      • この脆弱性は関係ない、で対応してないとあとから強烈なバージョンアップを強いられる。
  • まとめ
    • 誰でも、いつでも、安定的に再現性高めにテストができる世界という理想を目指す

Concourse CI入門 ライブ環境構築&ビルド

資料

https://backpaper0.github.io/jjug-ccc-2018-spring-concourse/slide/index.html#1

感想

Concource使ってみなきゃ。
jenkinsと比べて書き方のコツさえ掴めばすべてコードベースで管理できて良さげ。 (あとあんま関係ないけどViewも鮮やか。)

まとめ

日本最大級の求人検索エンジン「スタンバイ」を支える技術

資料

https://speakerdeck.com/marevol/ri-ben-zui-da-ji-falseqiu-ren-jian-suo-enzin-sutanbai-wozhi-eruji-shu

感想

Elastic SearchのPluginすごい。

やりたいことや運用を楽にするためにどういう構成にするのか、どんなPluginを利用するのか、選択肢が豊富。

まとめ

検索周りの話を中心に。

  • スタンバイ:800万件以上の求人情報を収集して、検索できるしくmi
    • クローリングなどから収集したデータをElasticSearchに格納
    • 利用者はそこから検索する
      • 検索のサジェストはログから生成
  • Elastic Search
  • インデックスのしかけ
  • 検索周りのしかけ
    • フレーズマッチングとtitleなどマッチ箇所に応じた重み付け
    • ワード単体のマッチングによる検索結果の補完
  • Elastic SearchのPlugin
    • Javaで書くことができる
      • 拡張したいプラグインを継承して、追加したい機能を追加することが可能(例えばAPIであれば応答するパスなどで拡張できる。
    • ES自体のバージョンへの依存が激しい
  • 全体の仕掛けを運用する際の課題と解決
    • インデックスのバックアップや辞書の配布などの課題

Java10まとめと、どうなるJava11

(このあたりから私の体力が尽きてくる

資料

https://www.slideshare.net/nowokay/java10-and-11

感想

リリースモデルの復習と新規機能について。
Raw Stringの話とStringの新API、Single-Fileでのjava実行、HEISEI問題が興味をそそられる話でした。
対応していかなきゃ。

まとめ

気になったものベースで

  • 新リリースモデル
    • 機能のリリースは春分秋分目安
    • 8
      • 個人ユーザーについては2020/12まで
      • お仕事で使う場合は2019/1
  • JDK 10
  • JDK 11
    • ソースファイルが一個だけならコンパイルしなくても実行できるようになる→つまりjava Hello.javaでHelloWorldとか。
    • Raw String Literals
      • バッククォートで書ける
    • String API
      • repeat, strip など。→Raw Stringのための対応?
    • ArrayIndexOutofBoundsExceptionのメッセージが親切に。
      • 地味に嬉しい
  • about java support
    • End of HEISEI問題
      • NewEraという対応の仕方をする模様
        • 2019/4には入るかも
        • 現在議論中なので積極的に参加していきましょうとのこと

JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜

感想

そもそもコンテナとはどういう存在なのか、というところから。
docker経験ありnot基礎知識みたいな感じの身なので、参考になった。

まとめ

  • Dockerコンテナ
    • あたかもサーバのように動いているもの
    • コンテナ上には。OSは入っていない。ミドルとアプリだけが入っている
      • 追記:ホストのKernelやベースOSの機能を共有しているっぽい
  • Docker hubリポジトリ
    • イチから書くのは面倒。なのでdocker imageを共有する仕組みがある
    • ただし、玉石混交なので信頼できない個人のイメージよりは、公式か、自分で書いて作ったほうが良い。
  • 注意すべきこと
    • コンテナは基本使い捨て。永続化したい情報とかは乗っけない方が良い。
    • bashで入ってなにか作業して整えた→ちゃんとその変更分もdockerFileに記述してやることで、冪等性を確保する。
  • Java10のDocker対応
    • JVMがDockerで動いていると認識していなかったのが治った
      • 今まではホストの設定しかみていなかったっぽい?

Spring Boot on Kubernetes : Yahoo! ズバトク事例

感想

めっちゃくちゃ濃かった。
貴重なノウハウを共有していただけてありがたいです。

まとめ

結構情報が抜け落ちているのであとで資料を見たい

  • yahoo!ズバトク
    • くじやキャンペーンを掲載するためのプラットフォーム
    • 需要のUPに対して運用や改修のコストがかかりすぎていて辛かった
      • 現行システムでは限界だったので、k8sを利用して作り直した
  • kubernetes
    • コンテナのオーケストレーションプラットフォーム
      • fail overの管理や異常検知、スケーリング、リクエストの負荷分散など課題の解決に有効そう
  • システム移行
    • jenkins→concource
    • PHPでモノリシック→javaでマイクロサービス
      • DDDで機能分割、全体で40サービスほどに。
  • k8sを有効活用するためにtwelve-factor appに沿うように改善。
    • ヘルスチェック
      • actuatorを利用
    • Graceful Shutdown
      • Jettyの機能だけではうまく実現できなかった→自前で実装して実現
    • ログ出力
      • Spring Cloud Sleuth→依存を追加するだけでリクエストで一意なIDを出力。
      • 40サービスあるので、こういった仕掛けがないと厳しい。
  • 開発フローの改善
    • Git上でオペレーションが簡潔するフロー
    • PRがトリガーになって運用が走る構造
      • 実働10分程度でデプロイ完了できるように。(もともと数時間
  • 大変だったこと
    • 社内の連携や考え方のスイッチなど。
  • まだ改善の余地あり。

DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話

感想

実践的!DDDやクリーンアーキテクチャをどう組んでいったのか、プラクティスの話は新鮮だったので参考にできればいいなと。

まとめ

  • 長いことやってるPJ
    • スクラップ&ビルドしている
    • コンセプトはあり、仕様の概要は決まっている
  • 諸々の問題
    • サーバから全データをダウンロード
    • コンポーネントがDBと接続
      • DBの変更に対してのWEBサーバ影響がでかい
  • 解決策としてのDDD
  • 設計段階
    • まずは力をつける
      • 本を読む。特にDDDの二冊と増田さんの本
    • 上司説明
      • 世の中に出ていくものはなんなのか、エレベーターピッチする
      • 利用シナリオを定義
    • ロバストネス分析
      • ユースケースシナリオを作った。どういう機能があったらよいか?
      • 各要素の定義
        • バウンダリ→画面、クーロン
        • エンティティ→DB,情報、テーブル
        • コントロール→処理。ユーザー認証とか -ノートに手書き→二人で書いては消しを繰り返し、良さそうな方を採用
    • コンテキストマップ
      • ロバストネス図をもとに、似たものを集めて、"境界づけられたコンテキスト"を規定した
      • 書いて→直して→書いて→直して
        • コンテキスト間の関係について、慎重に判断した。
      • 分割
      • 分割したドメイン間の関係を、パートナーシップ、顧客/供給者、順応者の類型に分ける
    • ユビキタス言語
      • 開発の中での用語を統一、gitlabのwikiに記載して徹底した
      • プログラム中での呼び方まで定義→かなり高評価
  • 実装前の準備
    • ルールを定義
      • packageの定義
      • オラクルベースのコーディング規約
      • 各構造の話(資料見なおすべき。)
        • translatorは利用者の言葉を自分たちの言葉にする
        • コントローラで受けたものを、domain層の要素を使って業務ロジックに落とし込む
        • ビジネスロジックに関与しないものはlibraryに集める
        • domain,gateway, repositoryの考え方
  • 実装してみてわかったこと
    • translatorがかなり頑張る必要がある
      • (現実のドメインと物理データの境界をつなぐものなので、確かにとは思った。
    • ルール以外のことはバラバラ
      • APIとか。リトライの実装方式などがバラバラに。
    • null チェック
      • nullチェックは適材適所→おk
    • その他も本当にバラバラ
  • やってみてよかったこととわるかったこと
    • モノリスからの開放
    • RDB/キャッシュ分離で責任範囲が明確
      • 他のコンテキストの実装者が触れられないので汚れることがない
    • 新技術への挑戦
      • Docker
      • AWS ECS
      • GitLab CI
        • 挑戦しやすい環境があるのはいいこと
    • 改善の余地あり
      • ルールの徹底
        • ATOKが覚えるほどの同じ指摘
      • ルール内容にも課題があるのかもしれない