ヤサイブログ

徒然と

Spring Day 2016 行ってきた!マイクロサービスの導入事例に触れた刺激的な一日。

行ってきました、Spring Day 2016・・・そう、それは座席とトイレ確保の戦い
springday2016.springframework.jp
Springの大規模なイベントは、日本では2回目らしい。
前回はSpring Summerというイベントだったようです。
運営は日本Springユーザ会が行っており、勉強会の発表者なども
募集しているようですので、気になる方は門戸を叩いてみてはいかがでしょうか。

今回のイベントは400人以上が参加しました。
そこまで大きな会場ではないので、人口密度がとても高く立ち見もあるほど!
セッションとセッションの間の休憩は座席確保を迫られ、
トイレには待ち行列ができるほど!さすがSpringの祭典!?
41階のセミナールームから見る眺望はとてもよかったです!
f:id:yasay:20161118205558j:plain

下記のセッションを見てきました。
10:00 ~ 11:00 Spring Framework 5.0
11:00 ~ 12:00 事例で知る!大規模エンタープライズ開発現場のリアル
13:00 ~ 14:00 Spring Securityで作るWeb APIアクセス制御の最適解
14:00 ~ 15:00 LINEにおけるSpring Frameworkの活用
15:00 ~ 16:00 楽天トラベルとSpring
16:00 ~ 17:00 40Tips & Tricks for Spring in IntelliJ IDEA
17:00 ~ 18:00 Springで実現するSmartNewsのニュース配信基盤

では、セッションの内容をメモ書き程度の内容ですが振り返ります。↓↓

- Spring Framework 5.0
f:id:yasay:20161118123136j:plain
本セッションでは、Spring Framework5.0の新機能の紹介と、
リアクティブプログラミングに関するライブラリの紹介などがありました。
ベルギーの著名なSpringのコミッター、ステファン・ニコルさんの講演

■Spring 4.3
リリースまでに9ヶ月の間隔があったが、
これからはもっとリリース間隔を短くしたいと思っている。

■Spring 5
5.0はJDK8+, Servlet 3.1+, JMS 2.0+, Junit5+をサポート
下記のような主要なフィーチャーがある。
Performance improvements,
JDK9,
Jigsaw modules,
HTTP/2 and Servlet 4.0,
Reactive architectures

■Spring 5 - パフォーマンスの改善
コンポーネントスキャンのパフォーマンス改善
→パフォーマンスメカニズムの改善。
 →クラスパススキャニングのためのアノテーションが新設された。
 →大規模アプリケーションの場合、インデックスを使えば迅速にコンポーネントスキャニングを完了させることができる。
メタデータのキャッシュ化
・AntPathMatcherの書き換え
・ゼロコピートランスファー
→ファイルの転送時にCPUを使わない転送方法。データの転送をクライアントに直接できる機能。

■Spring 5 - JDK9への対応について
JDKは来年の3月にリリース予定。Spring5のGAは来年7月を予定している。
・Jigsaw modulesの活用
・パッケージエクスポートとか
・HTTP/2への対応について
→JDK9によるHTTP2対応も。

■Spring 5 - リアクティブプログラミング
・なぜリアクティブプログラミングを使うべきなのか。
全てのアプリケーションはシンプルな構成となっていた。
マイクロサービスや分散システムのために生まれたリアクティブプログラミング。
リアクティブプログラミングはスピードのためではなく、拡張ができ、アプリケーションが複数のリクエストを受けている時に安定性を保つ為のもの。

スケールを拡張した場合、プロセスを増やす、スレッドを増やす、これでもっと大規模な処理ができる。
だが、それにも限界がある。メモリ量にも限界がある。
リアクティブはノンブロッキング、そしてCPUをできるだけ最大限に使うという考え方がある。

スライドが共有されています。↓
speakerdeck.com


ステファンさんによるYoutube動画紹介とか(過去のセッションとか)
Reactive Web Applications with Spring 5 by Rossen Stoyanchev - YouTube
Developing Reactive applications with Reactive Streams and Java 8 by Brian Clozel, Sébastien Deleuze - YouTube
http://start.spring.io/
などなど


- 事例で知る!大規模エンタープライズ開発現場のリアル
NRIの社員の方による、オフショアを活用した大規模システム開発の現場での
標準化活動のポイントです。

数百人での大規模開発での事例での標準化というのは難しいということが語られていました。
オフショア特有の文化については勉強になりました。育ったらやめていくから人を育てられないってのはキツいですね。
セッションの内容的には私が普段よく使っている機能の話でした。

■画面設計のOut of memory error
・画面設計はステークスホルダーが多い為、そういった人たちを巻き込んだ顧客調整による標準化が必要。
・セッション領域を気軽に利用出来ないルール・仕組みを策定することについてルール例の紹介
→ルールを定めても破られるため、セッションを扱う処理を自動検知し、検証できるような仕組みや覚悟が必要。
→セッション領域のデータを、必要の無くなったタイミングで削除する機能の実装。
→Springなら簡単に行う方法が用意されている。
@SessionAttributes, sessionStatus.setComplete();
自前で作ろうとすると結構大変なんだけど、用意されていて便利だよね。

■ヒストリーバック時の有効期限切れ画面問題
・no-cacheとPOSTリクエストによって、戻るボタンを押した時の有効期限切れ問題が発生。
→まず、戻るボタンによる操作を許可するのか、許可しないのかを決定する必要があり。(今時戻るボタン使えないとか・・)
→戻るボタンを使うのなら、RedirectおよびGETを用いて、有効期限問題を解消しよう。
→戻るボタンを許可しないのなら、ツールバーの非表示による抑止だったり、JavascriptのhistoryAPIを用いてブラウザにダミー履歴を入れるとか。
→Springなら、FlashAttributeとredirectを使えば、簡単に実装できる。
これも自作しようとすると面倒くさい。

■エラーハンドリング問題
・エラーハンドリングを塗りつぶしてしまう問題(なかなかありえないだが、大規模オフショア開発では起きることらしい)
→エラー・例外ハンドリングの標準化ルールの策定。ハンドリングの対応・レイヤーの明確化など。
→例外をエラーコードに変換するコードの実装も大事。
→Springでは、@ExceptionHandlerを使えば、簡単に実装できる。

■Controllerクラス分割問題
・修正処理を登録用コントローラークラスにメソッドが入っていて、画面との対応がわかりにくい。
→標準化として、クラス分割ルールの作成は大事。Springの@RequestMappingは非常に柔軟。だからこそルールの策定が必要。
→1jsp = 1Controllerクラス、1業務に対して1Controllerクラスなど

■グローバル開発
・オフショア開発の場合、同じ質問がなんども飛んでくる場合がある。(イライラする)
→ログやマニュアルのグローバル化とか。

早期の標準化ルールの作成・展開、
ステークスホルダーを巻き込んだ上でのルール策定
ルール遵守させる方法の確立。検知する仕組みや自動的にルールを守ってしまうような仕組みづくり。


- Spring Securityで作るWeb APIアクセス制御の最適解
最近は本当にどこを見てもWeb APIだらけで、私もWeb APIを開発したことがあります。
Spring Securityも使っているので、その最適解というはとても興味がありました。
クラスメソッドの社員の方が、最近使われている認証方式について解説してくれました。

スライドが共有されています。↓

www.slideshare.net





- LINEにおけるSpring Frameworkの活用
■LINEってアーキテクチャのうち、Javaが41%を占める
→正直意外でした。
リポジトリ数と言うと、spring framework, spring mvcで547件・・・
spring bootで285って、かなりの数ですね。

■Spring採用が多い理由
・開発のサイクルがJava EEに比べると速い。
Java EEはB2Cのスケールが必要なWebサービスでの事例をあまり聞かない。
・社内にJava EEの経験ある人が少ない

■時代はMicroservices
→小さなapplication serverの組み合わせでおおきなサービスを実現
→spring, guice, Vert.x, Dagger2, avans, etc
→groovy, scala, ...
golang, perl, python, ...

■なぜSpring-bootか
XML書かなくていい
・アプリケーションの開発がわりと簡単に開始できる
uber jarでお手軽にdeployできる
Javaのわりに起動が速い

■開発事例:LINE Notify
・Redis sentinelによる冗長構成(Cache, Rage limit)
→KVSは基本的にRedisが人気
 →柔軟性・パフォーマンス・安定性・楽しい
・nginx → jetty
ACL管理, rewrite, Access log

■jettyの特徴
・コード読みやすい
・起動速い
→開発時に便利
・undertowより開発者多い(undertowって?)

■Fluentd
アクセスログの集計
→http statusコードの統計監視
・イベントログ
→Fluencyが最近は優勢、社内のストレージに保存

ちなみに、LINEは全てオンプレミスらしい。AWSなどのIaasを使っていない。

■Spring Bootのバージョンは上げにくい。
→関連モジュールも一気にバージョン上がるので、上げていくならこまめに上げていったほうがいい。

■spring-boot-starter-web
・安定している
・@GetMapping, @PostMappingとか便利

■spring-boot-starter-freemarker
・社内ではthymeleafと人気を2分している。らしい。
・IDEAの補完がfreemarkerの方が便利という説もある?
Apache Incubator入り、自動エスケープも入った。

■spring-boot-starter-redis
■spring-boot-starter-mobile
・User-Agentで判定するのに便利

■mybatis-spring-boot-starter
・社内のO/R Mapperはmybatis優勢
JPAは少ない
→B2Cでトラフィック予測難しい
・パフォーマンス問題起きた時の、MyBatisの安心感
・MyBatisのXMLをアップするとDBAがクエリ評価してくれるサービスとかもあるらしい

■MyBatis + Kotlin
XML辛い
Javaアノテーションでも書けるけど辛い
→複数行文字列書けない→複雑なクエリがない。
・なおでKotlinを採用 → 学習コストが低くて導入しやすいのがいい。
・groovyでも良かった

■デプロイ手法
github → jenkins →デプロイ
(途中でjenkinsを通すことで、テストが通ったもののみ許可される仕組み)

■実行環境
java, nginx on supervisord(自動再起動)

■Prometheus
■Dropwizard metrics

スライドが共有されています。↓

www.slideshare.net





- 楽天トラベルとSpring
楽天トラベルのアーキテクチャの変化
APIの数が増えてきた
APIの生まれ変わりが激しくなってきた
→多くの問題が(より)顕在化しました。

■直面した課題と解決へのアプローチ
1. APIドキュメントを最新に維持するには
昔、他社のAPIの使い方を習得するのに時間がかかることがあった
 →Documentが嘘をついている・情報が足りない
 →Exampleの不足
 →開発中のプロダクトのドキュメントが無い
・ドキュメントの管理・維持は大変。
 →Spring REST Docsでいこう
  →APIドキュメンテーションがある程度簡単に出来ます。
・Swagger+Springfoxでもっと良いドキュメントを作るのもあり。

2. シンプルにセッションを管理するために
・Sticky Sessions
→サーバーが落ちたら再ログイン。バランサーの設定だけですむ。HAではない。
・Session replication
→サーバーが落ちてもセッションを維持。HAである。設定・実装はASに依存する。
・Session clustering(Spring Session)
→Session Data store clustorを使用する仕組み。HAであり、AS問わず利用可能。必要なdependenyが増える?
・Spring Session
Servlet Filterで標準のHttpSessionをwrapする
 Spring Boot 1.4からAuto Configがある。
 楽天トラベルでは、Hazelcastをデータストアとして使用。
 Spring SecurityでCSRFトークンチェックもしている。

3. Microservice化する中でログの追跡をするには
・問い合わせが来た時のログ調査は手間がかかりすぎる。
・MDCというログの機能を利用し、ユニークIDをログに追加
・Spring Cloud Sleuth
・Logstash, Kibana

4. 同じプロパティの値を複数のプロパティで管理したくない
・Spring Cloud Configが便利

5. メンバーに使って欲しいライブラリを使ってもらうには・もっと簡単にAPIを実装する為に
・Spring Initializrはカスタマイズできる。
→社内で共通で使っているライブラリなどを放り込んで、
Spring Bootで初期プロジェクト起動をすることが出来るんだよ。
→Webからだけでなく、IDEからでもカスタマイズしたInitializrを利用することが可能。

6. 新しくきた人にSpringを覚えてもらうには
・みんながSpringの経験があるわけではない。
チュートリアルドキュメントを使って、全員が共通した知識を持てるようにする!

スライドが共有されています↓

www.slideshare.net







- 40Tips & Tricks for Spring in IntelliJ IDEA
正直、eclipseばかり使用し続けて、IntelliJ IDEAに疎い私にとってはとても勉強になる内容だった。
ただ、ちょっとハードル高かったかな。


- Springで実現するSmartNewsのニュース配信基盤
f:id:yasay:20161118205646j:plain
スマートニュース配信基盤の紹介と、そこで利用されているSpringの技術について。
登壇者はニュース配信基盤や管理コンソールの担当している方。
■配信基盤の紹介
・毎日250万人以上のユーザーへニュースを配信している。
・5万件以上の記事を配信
・1日(朝、昼、夕、夜)の定時Push通知
SmartNewsのニュース配信基盤は全てAWSで構築している。
・記事の収集、分析、配信など、それぞれの基盤が連携している。
■配信基盤における、Springの活用
・前身はSeasar2による旧基盤だった。
・旧基盤は先進的な技術要素があったが、もちろん少々の問題もあった。
・スマートニュースの強みは機械学習機械学習のような非サーバーサイドエンジニアの開発を向上させたかった。
→これらの問題を改善するために、Spring Bootを導入。
 →サービスを分割することで、個々に集中出来る。
 →高い開発効率。SpringFox/SwaggerによるAPIの可視化。

スライドが共有されています。↓
speakerdeck.com



・その他セッションのスライド
アメブロの大規模システム刷新と それを支えるSpring
Spring bootで学ぶ初めてのwebアプリ開発
Let's visualize your Spring Cloud Applications! #jsug #springday // Speaker Deck
Spring Day 2016 springの現在過去未来
Springを何となく使ってる人が抑えるべきポイント


- 所感
マイクロサービスの導入事例に触れた、刺激的な一日でした。
システムのライフサイクルの関係上、既存システム保守・回収を担当している方にとっては、
マイクロサービスの流行がすぐそこに来ていることを実感できないかもしれません。
そんな時こそ、マイクロサービスの導入事例に触れ、
自分達が担当しているシステムにマイクロサービスを導入した場合、どうなるかを妄想して欲しいと思います。

ちなみに帰りに外国人に道を聞かれましたが、しっかり答えることができましたw
これも、普段英語の勉強を行っているから出た成果だと思います。(道を教えた程度ですがw)
ステファン・ニコルさんの英語も聞き取りやすくて分かりやすかったですね。

今回シェアしてもらった技術要素について、私は追い続けたいと思います。
特にSpring Bootをもっと使いこなせるようになりたいです。

昼飯はリクルートの社員食堂で500円!安くておいしいサイコー!白身魚のお好み焼き風です!
f:id:yasay:20161118213726j:plain

おしまい