見出し画像

Deep dive to NissanConnect backend system

こんにちは。日産自動車の川田です。
私は日産自動車の中目黒オフィスで、日産車向けのコネクテッドサービス「NissanConnect」のBackendシステムの開発と運用に携わっています。今回は、そのBackendシステムについてdeep diveしたいと思います!


何を作っているのか

NissanConnectシステムの全体を、とてもシンプルに表現したのが下の図です。私たちのチームは通称BFFチームと呼ばれていて、オレンジ色の四角に位置するシステムを担当しています。NissanConnectアプリやVPA(Virtual Personal Assistant:Amazon AlexaやGoogleアシスタント)から直接つながる、お客様から最も近い位置にあるBackendシステムです。

BFFの主な役割は以下の通りです。

  • Global Cloud Platformとの仕様差分を吸収する、Regional Backend(例えば、日本の法規対応など)

  • Global Cloud Platformとの仕様差分を吸収する、Nissan Backend(例えば、アライアンス要件とは異なる日産独自の要件対応など)

  • Region固有のパートナー企業や、日産内の他システムとの連携

  • 正しい車両にアクセスしているか、車両側の登録がされているかなどの認可チェックの実施

  • Backend For Frontendとして、アプリが求めるレスポンスを返すことでUXの向上に貢献

私たちのチームは前述したシステムの開発と運用を担当しており、DevOpsのマインドセットを持って活動しているチームです。車両開発プロジェクトのマイルストーンと整合性を取りながらアジャイルに開発を進め、お客様に価値をデリバリーしています。また、運用で見つけた問題をすぐにフィードバックすることでプロダクトの改善に繋げています。

BFFの開発

では最初に、BFFシステムの開発における技術面についてdeep diveしていきたいと思います。
NissanConnectで提供している機能は、乗る前エアコンの実行(リモートサービス)・充電スポットの検索・目的地をナビに送信(ルートプランナー)、など様々ですが、これらの機能はREST APIで提供しています。そのため、BFFはweb業界で一般的に利用されているSpring Bootを使用して、Javaで実装しています。
また、BFF内部ではマイクロサービスアーキテクチャを採用しています。先程リストアップした機能はそれぞれ別のマイクロサービスで提供しており、下の図のようなイメージで各サービスが繋がり、機能を提供しています。また、必要に応じて各サービスがパートナー企業のシステムと連携しています。

続いて、開発の手法についてdeep diveしていきたいと思います。
私たちが実装したコードはGitHubで管理しています。ローカルで開発したものをpushして、Pull Requestを作成するとそれをトリガーにGitHub actionsを使ってunit testを実行し、結果がNGだった場合はマージできないように設定しています。その後はチーム内でレビューを行い、OKとなったらマージします。
マージされた後は、対象のbranchによって続く処理を変えています。開発中の機能など、main branchにマージされた場合はwebhookを使ってJenkinsに連携し、最新版をビルドした後にそのまま開発環境へデプロイします。リリースの準備時など、release branchにマージされた場合はGitHub actionsを使ってtagの作成を行っています。商用環境にデプロイする時は、そのtagを指定してビルドしたものをデプロイしています。

NissanConnectの運用

次に、NissanConnectの運用についてdeep diveしていきたいと思います。
BFFの各サービスから出力されたログは、Microsoft Azure上にストアしています。蓄積したログは、Log AnalyticsでKustoクエリを使って検索します。

CF_LogMessage_CL
| extend status = extract("status : ([0-9]+)", 1, Message)
| summarize count() by bin(EventTime_t, 30m), status
| render timechart

Log Analyticsをメインに使用しながら、様々な運用タスクを実施しています。まず基本的なタスクとして、あらかじめ作成したダッシュボードを使用して日々のモニタリングを実施しています。例えば下のようなリクエスト状況を確認するグラフを作成し、HTTPステータスの傾向に大きな変化がないか、変にスパイクしていないかを確認しています。

また、障害が発生した場合にアラートが発報するように設定しています。アラートの条件もLog Analyticsで設定していて、設定したKustoクエリでヒットしたログの件数や割合がしきい値を超えたら発報されます。アラートは以下のようにSlackに通知され、BFFチームで調査します。なお、障害の対応は平日の夜間や休日に発生することもありますが、インドにあるオフショアチームと協力しながら24/365体制で運用しています。

運用でもう一つ大事なタスクとして、お客様からの問い合わせやフィードバックの調査があります。NissanConnectのアプリには気軽にフィードバックを送るためのフォームが用意されていて、お客様から投稿があるとリアルタイムにSlackに通知されるようになっています。通知内容はBFFチームで調査して、必要に応じてプロダクトオーナーチームや他部門へ連携しています。
(もしこの記事を読んでいただいていてNissanConnectを使用されている方がいましたら、フィードバックを送っていただけるととても嬉しいです!いただいた全てのフィードバックは中目黒チームで目を通しています。要望はもちろんのこと、この機能は使いやすかったなどのご意見もお待ちしています!)

Slackへの通知は、2代目のFeedback次郎が頑張ってくれています(笑)

ところで、このセクションの名前が「BFFの運用」ではなく「NissanConnectの運用」になっていることにお気づきでしょうか。私たちはBFFチームとして、自分達が作ったシステムを確実に運用することは当然です。私たちはお客様から最も近い位置にあるBackendとしてNissanConnectシステム全体の状況を見渡すことができるので、お客様の手元で実際に何が起きているのかという観点を大事にして、BFFだけではなくNissanConnectのシステム全体を運用しています。

最後に

いかがでしたでしょうか。想像した以上に普通の技術を使って開発・運用しているんだな、と思われたのではないでしょうか?そうなんです!
もちろん、自動車はお客様の命を預かるものなので相応の厳しさを感じることもあります。しかしながら自分が作ったシステムを通じてリアルワールドにある自動車というハードウェアが動く、という体験はとても面白いことは間違いありません!

私たちは一緒に働く仲間を募集しています。カジュアル面談も実施していますので、興味があるので話を聞いてみたい!もっとdeep diveしてみたい!と思っていただけたら、ぜひ下のリンクからお気軽にリクエストを送っていただけると嬉しいです。お待ちしています!