fincとマイクロサービス

53
組織の急成長を支える技術 FiNCとマイクロサービス 株式会社FiNC Shinozuka Fumiya

Upload: fumiya-shinozuka

Post on 15-Apr-2017

26.246 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: FiNCとマイクロサービス

組織の急成長を支える技術

FiNCとマイクロサービス

株式会社FiNC Shinozuka Fumiya

Page 2: FiNCとマイクロサービス

I. マイクロサービスがそれなりに II. マイクロサービスで踏みやすい地雷 III. FiNCにおけるマイクロサービスの実情

この講演を聞いてわかること

Page 3: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 4: FiNCとマイクロサービス

自己紹介

• 篠塚 史弥 (@shinofumijp) • FiNCエンジニア

• FiNC内のほとんどのアプリケーションの立ち上げに関わる • アプリケーションアーキテクチャの設計と実装を行う

• APIへの目覚め • 大学院在学中に総務省の情報流通連携基盤の共同研究に携わり、Web API、マイクロサービスに興味を持つ

Page 5: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 6: FiNCとマイクロサービス

1つのアプリケーションを 小さなサービスの集合として開発する手法

マイクロサービスって?

http://dev.otto.de/2014/07/29/scaling-with-microservices-and-vertical-decomposition/

Page 7: FiNCとマイクロサービス

マイクロサービス9つの特徴

① サービスによるコンポーネント化 ② ビジネス機能中心の構成 ③ プロジェクトではなくプロダクト ④ スマートエンドポイント、ダムパイプ ⑤ 分散ガバナンス ⑥ 分散データ管理 ⑦ インフラストラクチャ自動化 ⑧ 障害設計 ⑨ 進化的設計

http://martinfowler.com/articles/microservices.html

Page 8: FiNCとマイクロサービス

マイクロサービス9つの特徴①サービスによるコンポーネント化 HTTPやRPCで連携するサービスを分離してコンポーネントとして扱う

②ビジネス機能中心の構成 技術レイヤーではなく、ビジネス能力に基づきサービスの分割を行う コンウェイの法則

③プロジェクトではなくプロダクト 機能を提供して終わりではなく、プロダクトやユーザを意識する

http://martinfowler.com/articles/microservices.html

Page 9: FiNCとマイクロサービス

マイクロサービス9つの特徴④スマートエンドポイント、ダムパイプ 複雑なプロトコルではなくRESTfulなHTTP APIや軽量なメッセージングプロトコルを用いる

⑤分散ガバナンス 中央集権的にすると特定の技術にロックインされがち 適材適所で技術の選定ができる

⑥ 分散データ管理 個々のサービスがデータベースを所有 結果整合性 境界づけられたコンテキスト

http://martinfowler.com/articles/microservices.html

Page 10: FiNCとマイクロサービス

マイクロサービス9つの特徴⑦インフラストラクチャ自動化 自動テストや自動デプロイを行う ビルドパイプラインを作成する

⑧障害設計 障害体制があるように設計する。障害がUXに影響しないか考慮。 障害を検知できるようにモニタリングする

⑨進化的設計 他への影響を少なくデプロイできるのでざっくりとしたリリーススケジュールを立てることができる

http://martinfowler.com/articles/microservices.html

Page 11: FiNCとマイクロサービス

マイクロサービスでなにがうれしいの?

•モノリシックでやっていると辛いことがある •デプロイが全体のアプリケーションに影響を与える •開発の影響範囲、責任の分解点が難しい •プロジェクトにジョインしたもののどこから読めばいいんすか

Page 12: FiNCとマイクロサービス

なんでマイクロサービスて流行ってるの?

•技術環境の変化 •ハードウェアの低廉化と高速化 •ネットワークの高速化と普及 •クラウド環境の充実

•技術スタートアップに代表されるプロダクト中心の組織構成 •コンウェイの法則

Page 13: FiNCとマイクロサービス

前から似たような手法ない?

SOA(Service Oriented Architecture)がある マイクロサービスもSOAの焼き直し (マイクロサービス自体明確な定義がないしSOAも多義的)

Page 14: FiNCとマイクロサービス

新規性は?

概念自体は新しくない HTTP APIといったシンプルなWeb技術の利用とか CI環境により実現しやすくなったとか

Page 15: FiNCとマイクロサービス

銀の弾丸?

もしかして

Page 16: FiNCとマイクロサービス

もしかして

NO

Page 17: FiNCとマイクロサービス

パフォーマンス

もしかして:銀の弾丸?

インフラ管理コスト

デプロイ順序

整合性 分散

APIルーティング

テストサーバ構築方法多様化

障害発生ポイントの増加

車輪の再発明

バージョンアップが地獄

Page 18: FiNCとマイクロサービス

もしかして:銀の弾丸?

ググると出てくるような一般的な話ですが

運用すると大変さがわかります(後述)

Page 19: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 20: FiNCとマイクロサービス

マイクロサービスに至った経緯

サービス多角化とDivision経営

ダイエット家庭教師

CEO

マ | ケテ ィング事業部

フィットネス事業部

オンラインワ|クス 事業部

EC 事業 部

ライフサイエンス事業部

Page 21: FiNCとマイクロサービス

マイクロサービスの実例 FiNC App

Page 22: FiNCとマイクロサービス

マイクロサービスの実例 FiNC App

• チェック→ソリューション→EC • 行動変容と継続のためのウェルネスバリューチェーン

ウェルネス サーベイ

遺伝子・ 血液検査

食事指導

サーベイ+各種検査

分析結果レポート

パーソナライズソリューション&コンテンツ

専門家の アドバイス SNSヘルスケア

の知識・智恵

レシピ 豆知識 理想の食事

腕を大きくふって歩く

背伸びを3回する

肩甲骨を3回す

野菜を毎食食べる

1日1ℓ以上水を飲む

朝ヨーグルトを食べる

• 総合結果 • 心身の状態 • 解決すべき行動 • 生活習慣病リスク • お勧めプラン etc.

フィットネスタスク

FiNC STORE

ポイント獲得

• オーダメイド・ パーソナル・ サプリメント

• 酵素ドリンク • スムージー etc.

タスク実行や 食事投稿で 貯まるポイント

ポイント適用可サーベイ結果

ヘルスケア ツーリズム

健康食 コンテンツ

etc.

食事タスク

スクワットを10回x3

継続して10分歩く ライスを半分に控える

毎食野菜から食べる

Page 23: FiNCとマイクロサービス

FiNC Appのシステム構成

• APIサーバの大部分はRailsアプリケーション • Backend APIの一部はGoを使用 • Front APIへのリクエスト負荷が大きくなってきたら別言語やフレームワークの利用も検討

Page 24: FiNCとマイクロサービス

具体的な事例①

Instance

Instance Instance Instance

Front API

血液検査 API 遺伝子検査 API 生活習慣 API

• 各サービス間のAPI連携

Page 25: FiNCとマイクロサービス

具体的な事例②

• ユーザーが日々行うタスクはタスク生成バックエンドサービスにより生成

• 言語にはGoを採用

・生活習慣・運動ログ ・睡眠・タスクの実行 ・食事・アプリログ等

・タスクDB・学習エンジン ・GO

Page 26: FiNCとマイクロサービス

具体的な事例③• Webクライアントは独立したアプリケーションにする • ユーザ側・管理画面もそれぞれ別アプリケーション • ユーザ側ではReact.jsを採用

Page 27: FiNCとマイクロサービス

具体的な事例④

• ユーザの食事に対する、専門家による指導はFiNCオンラインワークス事業部。

• 別アプリケーションから行っている。

Page 28: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 29: FiNCとマイクロサービス

I. API管理の複雑化 II. 共通機能の再開発 III. ユーザ情報の分散 IV. ローカル開発の困難 V. 障害ポイントの増加 VI.整合性

発生した問題

Page 30: FiNCとマイクロサービス

• このデータはどのアプリケーションの責務?どのアプリケーションが何のAPI持っている?

• アプリケーション開発者が都度確認しながら開発することにより効率が下がった

• マイクロサービスに備えてちゃんと設計しないと初期に起こる問題

API管理の複雑化発生した問題

Page 31: FiNCとマイクロサービス

• ドメインモデルによる分割とRESTfulなインターフェース

• アプリケーション開発者はデータの出自を気にせずに欲しいデータを取得できるように

• データを自アプリケーション内にキャッシュするかは各アプリケーション運用方針に委ねる

対応

Page 32: FiNCとマイクロサービス

• ビジネススキームの変化、ドメインの追加により分割が変更する可能性は大いにある。最初から賢く設計しすぎないことが大事。

• ドメインの分割は頭を使う作業 • 提供したい、利用したいものを適切な粒度の言葉(=概念)で抽象

• サービスを通して何を提供したいのか、事業のフォーカス、設計思想、ハードウェアリソース、etc.に左右される

余談)ただし、、、

Page 33: FiNCとマイクロサービス

• ツールやtips系のメソッドを別アプリケーションでも書いてしまう

共通機能の再開発発生した問題

Page 34: FiNCとマイクロサービス

• Gemで! • 言語をまたがる時は車輪の再発明してしまっている

対応

Page 35: FiNCとマイクロサービス

• 各アプリケーションで独立してDBを利用 • 認証情報が分散し同期が困難に

ユーザの認証情報の分散発生した問題

http://martinfowler.com/articles/microservices.html

Page 36: FiNCとマイクロサービス

• FiNCAccountManagerというライトな認証サービスをバックエンドアプリケーションとして作成

• 基本はOAuth

対応

Page 37: FiNCとマイクロサービス

• アプリケーションをいくつも立ち上げる必要がある • すべてのアプリケーションを自分でclone & pull(!) • バージョンが古いまま開発することも、、、

ローカル開発環境発生した問題

Page 38: FiNCとマイクロサービス

• Dockerを用いたローカル開発環境基盤の作成 • コマンドラインから以下の操作が可能に

• ローカル環境にデプロイ • 個人情報をマスクしたデータを利用 • 最新バージョンをpull

対応

Page 39: FiNCとマイクロサービス

• サーバ数の増加に伴う障害発生ポイントが増加

障害ポイントの増加発生した問題

Page 40: FiNCとマイクロサービス

• 障害が発生するのは仕方ない • 冗長構成にする • 死活監視を行う • 逆にモノリシックなシステムだと障害回数自体は少なくなるかもしれないが、その分1回あたりのダメージが大きくなるので恩恵を受けている

• 障害が起きても他アプリケーションが稼動できるような設計は必要

対応

Page 41: FiNCとマイクロサービス

• 分散環境ではSQLのトランザクションが行えない

整合性発生した問題

Page 42: FiNCとマイクロサービス

• 結果整合性を採用 • 現在は定期的なバッチによる同期処理 • 失敗時のロールバックをアプリケーションで保障

対応

Page 43: FiNCとマイクロサービス

マイクロサービスって大変そうだし 本当にやる意味あるの?

Page 44: FiNCとマイクロサービス

困難はあれど それを上回る恩恵がある!!

Page 45: FiNCとマイクロサービス

マイクロサービスにより得た恩恵

• 独立した開発サイクル • 小さなチームで機動力のある開発 • 技術的なチャレンジがしやすい

• 適材適所で言語が変えられる • コードが小さく影響範囲も小さい

• サービスにメンバーがジョインしやすい • リファクタリングも楽

• 独立してデプロイできる • 影響範囲が小さなPDCAが回せる • テストからデプロイまでが早い • 障害が波及しない

Page 46: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 47: FiNCとマイクロサービス

• APIオーケストレーション層の作成 • クライアントとサーバの間にクライアント用にAPIを変換する層

• 各クライアント開発者がカスタマイズ可能

課題1:各クライアントに最適化されたAPIがほしい

http://techblog.netflix.com/2012/07/embracing-differences-inside-netflix.html

Page 48: FiNCとマイクロサービス

• RDBをキューとして利用 + デーモン • キューに保存するまでをトランザクションにする

課題2:分散環境での整合性保障を楽にしたい

Page 49: FiNCとマイクロサービス

• アプリケーションの改善、組織の拡大は続く • 疎結合にしたつもりが依存しあうこともある • アプリケーションを運用し続ける限り避けられない

課題3:それでも残る(悪い)密結合!

http://www.pwc.com/us/en/technology-forecast/2014/cloud-computing/features/microservices.jhtml

Page 50: FiNCとマイクロサービス

• アプリケーションの改善、組織の拡大は続く• 疎結合に• アプリケーションを運用し続ける限り

課題3:それでも残る(悪い)密結合!

一緒にマイクロサービスを支えてくれるエンジニア求む!

http://www.pwc.com/us/en/technology-forecast/2014/cloud-computing/features/microservices.jhtml

Page 51: FiNCとマイクロサービス

自己紹介 マイクロサービス FiNCでの導入事例 困難と対策 課題と今後の対応予定 まとめ

~table of contents~

Page 52: FiNCとマイクロサービス

I. マイクロサービスはスケーラビリティ上有効な手段だが運用上の困難が多く伴うことを説明した

II. FiNCでのマイクロサービス導入の経緯と実例、現在の課題と今後の対応予定を話した

III. FiNCでも様々な技術的困難があったがそれに見合うだけの恩恵にあずかった

IV. 紹介しきれなかった開発秘話もまだまだあります

Page 53: FiNCとマイクロサービス

ありがとうございました!