3回目に”書く”担当になったVoice-Tech Product Divisionの三谷智信です。
今回は私の担当サービス「MOBI VOICE」を例に、使われている技術やアーキテクチャを紹介したいと思います。
MOBI VOICEはざっくり以下のような技術を使用して作られています。
- サーバサイド言語:Go
- フロントサイド言語:React, TypeScript
- データベース:MongoDB, DynamoDB
- インフラ関連(AWS):ECS, Lambda, S3, SES, CodeDeploy, CloudFormationなど
- その他:Asterisk, Docker, CircleCI, 各種SaaSなど
MOBI VOICEは2019年10月にリリースされました。
私はそのリリースの時期にはモビルスに入社していたものの、プロトタイプの段階ではその開発チームに参加しておらず、ある程度基本的な部分が出来て製品化するという段階から任された形になります。
その時は、サーバサイド言語、フロントサイド言語、データベースはすでに決まっていました。
当時のモビルスは比較的開発者が自由に言語選定をしており、当時勢いのあったGoを他製品の一部Lambdaで使ったことを皮切りに、製品のサーバサイド言語で使うようになったようです。
Goは比較的実行速度が早いと言われており、静的型付け言語のため、メンテナンスもしやすく、また、電話サービスという特性上会話を続けながら他の処理を並行に走らせることが多いため、並行処理に強いという点がメリットになっています。
なかなかGoを実務で触ってきたという開発者を見つけるのは大変なので、新たにメンバーとして参画してもらう時にはイチから勉強し、徐々に慣れてもらうようにしています。
データベースのMongoDBは、モビルスの主力製品であるMOBI AGENTがチャットサービスのため、テキストデータのIn-Outが頻繁に行われるという理由で既に採用されており、それに則った形でMOBI VOICEでも選定されました。
複数サービスを運用する上でもデータベースを統一することはメリットがあり、マネージドサービスのMongoDB Atlasを使い、サービス横断で監視やメンテナンスを行なっています。
MongoDBはスキーマレスのため、サービス開発・運営していく中で頻繁に発生する仕様変更に柔軟に対応できるのが良いところです。MongoDBでもトランザクションが使用できるようになったとはいえ、RDBMSの時とはデータの整合性や持ち方で考え方を変える必要があるので注意が必要です。
Go同様にMongoDBを実務で触ってきたという開発者を見つけるのはなかなか大変なので、新たにメンバーとして参画してもらう時は勉強しつつ徐々に慣れてもらうことが多いです。RDBMSしか触ってこなかった人はここにギャップを感じる人が多いようです。
他製品ではEC2でサーバを立てて各種ミドルウェア等準備してサービスを立ち上げることもあるのですが、MOBI VOICEではECS Fargateを採用しています。
Dockerコンテナで各種ミドルウェア等を管理し、リソースはちょっとした設定とタスク定義の変更で管理できるため、柔軟な運用が可能です。また、オートスケール設定によって急なリクエスト増加にもある程度対応できます。
ちょっと反則的ではありますが、MOBI VOICEでは同じコードをECSのタスク定義を変えることによりシステム内での役割を変えるようなこともしています。これがリソース分散になかなか役立っております。
ここまでざっくりとMOBI VOICEの使っている技術の紹介をしてきました。
もっと細かいところの話もしたいのですが、それはいつかこのTech Blogで続きを書きたいと思います。
これら技術に興味のある方、モビルスでは一緒に働く仲間を募集しています。
興味のある方は、ぜひ採用情報のページをご覧ください。