見出し画像

Chompyのシステム構成をまとめてみる

こんにちは、 SYN, Inc. CTOの @yagitatsu です。Chompyでよく注文するお店は「大勝軒 代々木上原」さんです。

前回の記事 に続いて、Chompyのシステム構成について、経緯含めてまとめてみます。残念ながら、自分がちょこっとしか実装に入れていないので、使ってみた感想とかは別途記事を書いてもらおうと思います😎

そもそもChompyって何?

SYN, Inc.が運営するフードデリバリーアプリです。そもそもどういうプロダクトを作ってるのか、というのは前に書いたこちらにまとまってるので、よければご覧ください。


システム構成: アプリはFlutterで、WebはNuxtJS、バックエンドはGAE+Go

画像貼ろうと思ったら苦戦したのでGoogleスライドに。

基本的にはアプリはFlutterで、WebはNuxtJS、バックエンドはGAE+Goで統一されています。それぞれ簡単に経緯など紹介します。

アプリ: 3アプリ必要だったのでクロスプラットフォームなやつにしたかった

自分は経験として一番長いのがサーバーサイドなので、クライアント開発はめちゃくちゃ得意というわけでもないし、Reactive Programingも苦労するような感じなのですが、
創業前の時点で、業務委託や個人アプリ開発も含めてiOS(Swift) Android(Kotlin)、Android開発、ReactNativeやFlutterそれぞれ使ったことはあり、その中で思っていたのは

・iOS/Androidをそれぞれ作るのは大変だし、開発コストもかかるので、可能なら両方作るのは後回しにしたい。そもそも3アプリもあるし。
・一方で、両方欲しいというニーズはあるので、やるならクロスプラットフォームアプリフレームワークを使うとよさそう
 ー ビジネスの検証が完了してスケールできるようになってから作り直してもよさそう
・React Nativeは、静的型付けをせずに書けてしまう不安が少しあった。UIもAndroid/iOSのWrapperだからどんな挙動になるのか想像力求められる。あと、当時がっつり依存してたライブラリのReact Navigationてやつの破壊的な変更に苦しめられるという嫌な思い出が…
・Flutterは、Dartの静的型付けによる安定感だったり、UIが自前で実装されていて挙動が想像しやすい安心感あってよさそう。利用者も運用実績も増えてきてる。でも、ライブラリが比較的少ないのでネイティブの機能をがっつり使うときしんどくなるかも

ということでした。最初は代表の大見にも「採用観点も含めて、ほんとに大丈夫?」と若干心配されましたがw、「初期は検証も兼ねてやらせてください。初期の開発で厳しそうと見えたら軌道修正します」と説明して進めさせてもらいました。

結果、特にクリティカルな課題も出てこず、リリースまでできてよかったです👏 あとは、パートナーに提供するタブレットアプリの端末について、調達周りで課題が出てきてiPadからAndroidのタブレットに変更になったという問題が起きたのですが、そのときも、クロスプラットフォームアプリフレームワークを使っていたからこそすぐ切り替えられてよかったです。

Web: 詳しくないのでアドバイスもらいながらNuxtJSを利用

パートナー向けの管理画面やChompy Webが世の中に出てるプロダクトで、それ以外だと管理画面があるのですが、全てNuxtJSを使っています。
Reactよりもカジュアルにかけるかなーくらいの軽い気持ちで使い始めましたが、TypeScriptで書こうとするとそれなりに苦労があることがわかり、今はつよつよなエンジニアの方に副業で入ってもらい、ベースを整えてもらったりアドバイスもらったりしながらやっています。Vuexの型付けには言われるがままvuex-smart-moduleを使い、vueファイルはVue.extendで型付けしています。

バックエンド: 全部GCPですが、意外といろいろ使ってます

まず、クラウドサービスにGCPを使っているのは、単純に自分がGCPしか経験がなくて、周囲にもGCP詳しい方が多いからでした。併用するユースケースは思いついてないですが、いつかAWSも活用してみたいな、と漠然と思っています。

APIやTaskを処理するサーバーについては、前職のメルカリ子会社のソウゾウ時代にずっとGAE/Goを使っていたので、引き続きGAEかCloud Runのどちらかでいくかで、当時Cloud RunはGAでなかったので 、GAEを引き続き使うことにしました。メルペイ時代にk8sに少し触れる機会があった中で、k8sはキャッチアップするまで運用で使うのは大変そうだな、と思ってGKEは使わないことに。

メニューのカテゴリやタグの推定はMLでやってるのですが、Chompyリリース後にはGAだったのでCloud Runでやろう、となりました。らくとく便の配達ルート決めもCloud Runでやっています。もはや自分があまり関与してないのでよくわかってないですがw、 OR-Tools てやつを使っているそうです。
どちらもPythonのAPIです。

DBは、前職でDatastoreに慣れていて便利さを感じてはいたので、同様の思想のDBでいこうと思ってた、というのがありました。それで、アップグレード版と言われていたFirestoreをそのまま使おう、という流れで使ってます。意識しなくともスケーラビリティが担保されているところが良いです。

分析まわりは、FirestoreやログがBigQueryにsyncされて分析できるようになっています。Firebase Extensionsを使って簡単にsyncできて、changelogも残るのが便利です。

最後に割と大事なのが、Slackを使ったリアルタイム監視です。Firestoreの更新をトリガーに、Pub/Subで Cloud FunctionsがkickされてSlackに注文状況が投稿されるようになっています。Firestoreトリガーという機能で、Cloud Functionsだけ書けばできます。ベータ版ですが、注文監視などの用途には使えています。

以下は開発環境のやつですが、このようなかんじで出力されて、パートナーが注文受け付けたり、配達員が見つかったり、とかステータスが遷移するタイミングでスレッドが更新されるようになっています。

スクリーンショット 2020-08-03 22.44.09

スクリーンショット 2020-08-03 22.49.07


まとめ

ここまで読んでみて、面白そう、と思ってくれた方がいたらぜひお話ししたいです😊  会社HPにもついに採用情報追加したのでよければご覧ください。そこまでじゃなくても、お気軽に @yagitatsu3  にレスなりDMなりいたければと思います✨


この記事が気に入ったらサポートをしてみませんか?