Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

『キミスカ』アプリケーションアーキテクチャ #sa_study

400 views

Published on

ARCANA Meetup #43 のスライドです。
逆求人型就活サービス『キミスカ』のアーキテクチャ紹介。
Laeavelをベースとしたアーキテクチャやらなんやら。
https://s-arcana.connpass.com/event/102961/

Published in: Technology
  • Be the first to comment

『キミスカ』アプリケーションアーキテクチャ #sa_study

  1. 1. アプリケーション アーキテクチャ Shinichiro Yoshida @ Studio Arcana co.,Ltd. Arcana Meetup #43 @ 2018/10/25
  2. 2. 自己紹介 • よしだ しんいちろう(34) • (株)スタジオ・アルカナ 取締役 • 趣味で、IPA プロジェクトマネージャ, アプリケーションエンジニア, データベーススペ シャリスト, ネットワークスペシャリスト, 情報セキュリティスペシャリスト保有 • むすこ(9)むすめ(5)保有 • むすこがScratchでゲーム作ってて不明点を手伝ったところ「パパのつけたココの変数名 わかりにくいよねぇ。」と独り言を言われて手抜きで手伝ったことを見透かされていた ことが最近のかなしみです。
  3. 3. とは?
  4. 4. 2020年卒登録数 30,000名突破! 2018/10/25現在
  5. 5. アプリケーション アーキテクチャ
  6. 6. 使用技術/ツール Amazon Web Service キミスカのインフラはすべてAWSで 構築されています。構成は次のページで紹介。 Chef AWS上のサーバー構築はChefによって 自動的なプロビジョニングができる 構成になっています。 Laravel アプリケーションはPHPで開発され、 フレームワークはLaravelを採用しています。 PhpStorm ローカルの開発環境はPhpStormを 使用しています。 Cacoo by nulab インフラの構成図などダイアグラムを 記述するツールとしてCacooを使用しています。 Backlog by nulab プロジェクト管理にはBacklogを使用しています。 ドキュメンテーションはWiki、SCMはGitリポジトリ を使用しています。
  7. 7. 本番環境・ステージング環境 ・DNSはRoute53で管理 ・ELBで負荷分散しつつSSL Terminate ・SSL証明書はACMで発行&管理 ・アプリケーションはEC2で稼働 ・静的コンテンツはNginxで返却 ・動的コンテンツはApacheにリバースプロキシ ・DBはEC2上にMySQLを構築している ・RDSだと細かい調整がしにくいため自前で構築 ・リードレプリカとしてSlaveも用意 ・参照系のクエリはSlaveへ流している ・サーバーはOpsWorksを使って自動構築 ・バージョンはChef 12の方で運用中 ・コードのデプロイは全てOpsWorks経由 ・画像の保存はStorageGatewayを使用 ・過去の仕様に引きずられてしぶしぶNFS ・本来はS3のみで完結させたい ・メールはSES経由で送信している ・その他、外部連携サービスもあるが割愛 ・安定志向なのでEC2で稼働させているが、 そのうちECS/Fargateに移行していきたい BacklogのGitリポジトリ ・コード管理はBacklogのGitリポジトリを活用 ・Git flowに準拠した開発フローを採用している ・Source Treeを使ってる人が多い ・CloudWatchでエラー拾ったらBacklogに自動で起票 ローカル開発環境 ・Vagrantで差異のない環境を用意 ・Chefレシピは本番環境と共用している ・vagrant-omnibusプラグインを使っている
  8. 8. Laravelの通常のアーキテクチャ ルーティング コントローラビュー モデル DB
  9. 9. 発生しうる課題 ルーティング コントローラビュー モデル DB コントローラーの肥大化 バリデーションの複雑化 RDBとの高い結合度 ビジネスロジック肥大化 トランザクション制御 重複したコード
  10. 10. Laravelのコンポーネントを拡張し、責務を明確にする • サービスレイヤーを導入 • → ビジネスロジックの責務を負う • リポジトリレイヤーを導入 • → RDBへの依存度を抽象化する レイヤーの概念を導入し、責務を明確にする • バリデーションを実行する責務をどこに置く? • → Requestクラスを拡張して責務を負う • 権限チェックなど認可の処理はどこに置く? • → Middlewareがその責務を負う • ヘッダーやフッターの共通処理はどこに記述する? • → ViewComposerがその責務を負う
  11. 11. アーキテクチャ構造を拡張した設計 Router Controller Response Model KVS Client UI Application Domain Data Source RDB Search Engine Object Storage Request View Middlewaer ViewComposer Model LayerRepository LayerService Layer RepositoryService
  12. 12. コンポーネント・レイヤーの役割の明確化 Router Controller Response Model UI-inputApplicationDomain Request View Middlewaer ViewComposer Repository Service UI-output URLとコントローラのマッピング、コマンドライン実行のマッピング リクエストパラメータの形式バリデーション、重複チェック等のDBアクセス処理はしない 認可、CSRFチェック、CORS設定、共通ロギング処理、IP制限処理、TrustProxies設定、共通例外処理 リクエストの受け付け、サービスクラス呼び出し、レスポンス(ViewやJSON)の返却、ロジックは記載しない サービスクラス呼び出し(ヘッダ、フッタ、サイドバーなど、共通パーツのみで使用) 重複チェックなど複雑なバリデーション、Transaction処理、ビジネスロジック実装、リポジトリの呼び出し 複雑なSQL/Criteriaの組み立て、必要に応じたキャッシング処理、モデルの呼び出し Eloquent O/Rマッパー、シンプルなクエリ、RDB/KVSなどへの接続と操作 Bladeテンプレートエンジンによる画面のHTMLレンダリング RESTfulなAPIのレスポンス(JSONやXMLなど、データ連携フォーマット)
  13. 13. 参考文献
  14. 14. エンタープライズアプリケーショ ンアーキテクチャパターン(PoEAA) マーチン・ファウラー氏によるエンタープ ライズアプリケーションを設計する上での アーキテクチャのカタログ。 日本語版は2005年に出版された本だが、書 かれている考え方は現在も通用する。 抽象的な言葉が連発されるので非常に読み 解きにくい。 一言で表すと「関心事に沿ってレイヤー定 義して分離させていこうぜ」というノリ。
  15. 15. Service Layer エンタープライズアプリケー ションアーキテクチャパター ンに掲載れているパターンの ひとつ。 “一連の利用可能な操作を確 立し、各操作でアプリケー ションの応答を調整する一連 のサービスで、アプリケー ションの境界を定義しま す。” https://martinfowler.com/eaaCa talog/serviceLayer.html
  16. 16. Repository エンタープライズアプリケー ションアーキテクチャパターン に掲載れているパターンのひと つ。 “ドメインオブジェクトにアクセ スするためのコレクションのよ うなインターフェイスを使用し て、ドメインとデータマッピン グレイヤ間を仲介します。” https://martinfowler.com/eaaCatalo g/repository.html
  17. 17. ご静聴 ありがとう ございました

×