サービス開発
問題解決の為に必要な技術をその時の状況や今度の運用を考慮した上で、専門のエンジニア達と相談しながらフロント-サーバ-インフラそれぞれのレイヤーで検討し最適だと判断した技術をキャッチアップしつつ導入しました。
アプリケーション
APIサーバ
ユーザーのタクシー検索からマッチングエンジンと介し、車両への通信までのユースケースはどうしても時間がかかってしまうので、 サーバー、クライアント両サイドの観点でキャッシュ設計を丁寧に行いました。 またユースケースの処理最速の為にJobQueueアーキテクチャを導入したりとUXの為に工夫しました。
認証基盤
複数サービス間で同一のユーザー情報で認証/認可する必要があったのでOAuth2.0を導入した認証基盤を作成構築しました。 プロバイダ、クライアント両方の実装を行いました。
決済連携
外部の決済APIを活用した決済連携APIの実装を行いました。 車両との通信と、ユーザー操作は非同期で行っている中で決済連携というセンシティブなフローを理解し導入するという大きな経験ができたと思います。
vue.jsの導入
元々JQueryとCoffeescriptで実装されていたフロントエンドだったので配車システムで複数のイベントが発生したり、 地図上で複数の車両の動きを追跡すると画面が遅かったり、レンダリング時のチカチカ感があったりとUXが損なわれていたので Virtual DOM、データバインディングを活用して課題の解消を行いました。 フレームワーク選定から行い、JQueryとCoffeescriptからES6へのリプレイスを行いました。
配車管理サービスの
基盤/インフラ
コスト管理も行っていたので、アーキテクチャや技術的負債がコストに直結する為、運用を考えたインフラ設計を行いました。
負荷分散
トラフィック量の多い車両管理サーバーの負荷分散を以下の様に対応しました。 位置情報はストリーム処理かつ、高頻度で通信するのでUDP通信をしています。 車両との双方向通信では、TCPsocket通信を採用していました。
UDPリクエスト
- L7 route53でラウンドロビン
- L4 Nginx(stream module)
- Ruby,Rackマルチプロセス(CPUコアの効率利用)
- マルチスレッド(I/Oバウンド対策)
TCPリクエスト(TCPソケット通信でのタブレット<=>サーバ双方向通信)
- L7 AWS ELB
- Ruby,Rackマルチプロセス(CPUコアの効率利用)
- マルチスレッド(I/Oバウンド対策)
また、位置情報のデータ登録はRDBMSからAWS DyanmoDBに移行しました。
データベースパフォーマンスチューニング
スロークエリをexplainしてindex、クエリの最適化をメインに行いました。 PostgreSQLでプリペアドステートメントの保持設定がデフォルトのままだった為メモリが枯渇していた問題に対して、 PostgreSQLのメモリ管理を調べながら原因特定し、その後パラメータチューニングで解消された現象は難しい対応でした。
環境構築ツールの作成
複数のサービスのインフラ、基盤構築をしていたので以下の様に再現可能なツールを作成して配布していました。