2018年10月に公開した「ミクシィの技術スタックについてまとめてみた」。こちらの記事ですが、SNSやブログ等で反響をいただきました。他の企業さんも、ここ数年で自社の技術スタックの公開する傾向が進んだかと思います。
……「で、第二弾はないの?」という声をチラホラいただきましたので要望にお応えする形で、第二弾を公開。ミクシィを代表するサービス群はもちろん、updateされたサービス、新規開発中のサービスまで、各サービス/事業部で、開発言語・インフラ環境・デプロイツールなどでまとめてドドーンと公開します。
※サービスやプロダクトに該当しないケースは、各事業部で採用している技術を紹介します
※2020年9月30日時点での情報です
※記事ボリュームがありますので、可読性を考慮し2ページに分割しております
【サービスおよび、技術スタック一覧】
目次
モンスターストライク
TIPSTAR
コトダマン
みてね
minimo
SNS mixi
FINDJOB!
6gram
Romi
デジタルエンターテインメント本部新規ゲーム開発
モンスターストライク (2013年10月~)
サービス/事業部の取り組み
モンスト事業本部の開発室では、世界累計利用者数5,300万人を突破した「モンスターストライク」を中心に様々なサービスを開発している部署です。サーバーサイドでは、オンプレミスに加え、国内外さまざまなクラウドを使用して運用を行っている点が大きな特徴です。
技術スタック
TIPSTAR (2020年6月~)
サービス/事業部の取り組み
「TIPSTAR」は、競輪を取り扱ったライブ映像を毎日配信して有料はもちろん無料のコインでも遊べるサービスです。競輪のスポーツやエンターテインメントの要素にフォーカスし、新しい映像コンテンツ、遊び方を提供していくサービスとなっています。サービス想定規模が大きく特定時間にスパイクが発生する要件が見込まれたので容易にスケールできる形と非同期で処理ができる形にしていきました。PFがweb, ios, androidとある中、OpenAPIにてAPIを定義することで各PFで再利用可能な物を用意し効率化しています。
技術スタック
iOS(言語、ライブラリなど) | Swift、Objective-C、UnityAsALibrary、RxController |
Android(言語、ライブラリなど) | Kotlin、Coroutines、Navigation Components、LiveData、ExoPlayer、Glide、MotionLayout、OpenAPI Generator、Ktlint、Unity |
フロントエンド(言語、ライブラリなど) | TypeScript、React、Next.js、StoryBook、jest、Webpack、ESLint |
サーバーサイド(言語、ライブラリなど) | Go、echo、Ruby、Rails |
インフラ | GCP、GKE、GAE、AWS、MediaService、GCF、Cloud Pub/Sub |
ミドルウェア | nginx、envoy |
データベース | Spanner、Cloud SQL、Cloud Firestore |
モニタリング | Stack Driver、BigQuery、Looker |
データ分析 | BigQuery、Looker |
環境構築 | Teraform |
CI | Circle CI、Bitrise |
機械学習ライブラリ | Google Cloud Vision API、Natural Language API、Text-to-Speech |
その他 | OpenAPI、Swagger、Zeplin、Helm、Cloud Pub/Sub、gRPC |
コメント
コトダマン (2018年4月~ ※パブリッシャー変更は2019年11月)
サービス/事業部の取り組み
コトダマン事業部では「共闘ことばRPG コトダマン」の開発・運用を行っています。『コトダマン』は2019年、パブリッシャー移管を行いXFLAGの一員となりました。言葉を作ってコンボを決める他にはない言葉合わせRPGです。
技術スタック
ゲームエンジン | Unity |
サーバーサイド(言語、ライブラリなど) | Java(tomcat) |
インフラ | AWS |
ミドルウェア | nginx, Redis |
データベース | MySQL |
モニタリング | mackerel |
データ分析 | Redshift |
デプロイツール | capistrano |
環境構築 | ansible、cloudformation |
CI | Jenkins |
技術的課題
プロジェクト移管
『コトダマン』は2019年11月にパブリッシャー移管しました。『コトダマン』自体は2周年を向かえています。そのためサービス運用をしながらインフラの移行を行う必要がありました。移管後も負荷が増加しているため、運用フロー見直しやシステムの改修を行っています。
課題解決について
運用タイトルかつ移管されたタイトルのため、絶賛全容把握中です。約1年運用し、今後はゲームの要でもあり、プロジェクト全体に関わるデータやアセットの運用フローを改修していきたいと考えています。
みてね (2015年4月~)
サービス/事業部の取り組み
「みてね」は、子どもの人生を丸ごと残せるアルバムを作るというコンセプトで、写真を整理する時間が無いパパやママ、ITに不慣れな方でも使ってもらいやすいサービスを目指しています。
技術スタック
iOS(言語、ライブラリなど) | Swift、RxSwift、Alamofire、Firebase、MVP + Clean Architecture |
Android(言語、ライブラリなど) | Kotlin、Kotlin Coroutines、Retrofit2、OKHttp3、Dagger2、Firebase、WorkManager、Android Architecture Components |
フロントエンド(言語、ライブラリなど) | TypeScript、React、Redux |
サーバーサイド(言語、ライブラリなど) | Ruby、Ruby on Rails |
インフラ | AWS、GCP |
ミドルウェア | FFmpeg、ImageMagick |
データベース | Amazon Aurora |
モニタリング | New Relic、CloudWatch、Grafana |
データ分析 | BigQuery、Re:dash、AWS Athena |
デプロイツール | Argo CD |
環境構築 | Docker、Terraform、Amazon Elastic Kubernetes Service |
CI | CircleCI、Bitrise |
機械学習ライブラリ | TensorFlow、PyTorch、MXNet、Kubeflow |
コメント
minimo (2014年1月~)
サービス/事業部の取り組み
「minimo」は、消費者ユーザーにとっては自分にぴったりのサロンスタッフをお得に探して予約できるアプリです。美容師、ネイリスト、アイデザイナーなど美容サービスを提供側のユーザーにとっては、自分のスマホさえあればすぐに集客を始めることができるアプリです。
技術スタック
iOS(言語、ライブラリなど) | Swift、Objective-C、Firebase |
Android(言語、ライブラリなど) | Java、Kotlin、RxJava2、Retrofit2、Firebase、Navigation-Component、AndroidJetpack、ktlint |
フロントエンド(言語、ライブラリなど) | ES6 (Webpack+Babel)、React.js、React Styleguidist、ESLint、Sass、stylelint、Workbox |
サーバーサイド(言語、ライブラリなど) | Perl (Mojolicious)、Go |
インフラ | AWS (EC2、RDB、S3、CloudFront、Elasticsearch、Route53、Cognito、ECS、SQS、etc.) |
ミドルウェア | nginx、td-agent、rundeck |
データベース | MySQL5.7、Aurora |
モニタリング | Cloudwatch、zabbix |
データ分析 | Redash、AWS Athena、BigQuery |
デプロイツール | fabric |
環境構築 | ansible、Docker |
CI | Jenkins、Bitrise |
コメント
SNS mixi (2004年2月~)
サービス/事業部の取り組み
「mixi」は、最大時には数千万規模のユーザーが利用していたプロダクトで、16年以上の歴史があるSNSです。日記やコミュニティ、足あとなどSNS機能のほか、ソーシャルボタンやゲームプラットフォームなど外部連携機能をもち、独特なコミュニケーションの場を提供しています。
技術スタック
iOS(言語、ライブラリなど) | Swift、Objective-C |
Android(言語、ライブラリなど) | Java |
フロントエンド(言語、ライブラリなど) | JavaScript、TypeScript、LESS |
サーバーサイド(言語、ライブラリなど) | Perl、Ruby、Python |
インフラ | AWS (EC2、S3、CloudFront、Route53、Elasticsearch、etc.)、 GCP(Cloud Vision API) |
ミドルウェア | Apache、nginx、memcached |
データベース | RDS、MySQL、Aurora |
モニタリング | CloudWatch、Sensu、Datadog |
データ分析 | Google Analytics、EMR、Spark、SageMaker |
デプロイツール | Consul、stretcher |
環境構築 | Chef、Docker、Ansible |
CI | Jenkins、CircleCI、CodeBuild |
コメント
技術的課題
1.データセンターを使っていて維持管理コストが高かった
・サーバーの導入や故障対応などにコストがかかる状態だった
2.MySQLをEC2で運用していて維持管理コストが高かった
・不定期なサーバー再起動の対応コストが高かった
・OS管理のコストが高かった
3.クライアント・フロントエンド構成のアップデートが停滞していた
・利用しているバージョンが古かった
・新しいソフトウェアなどの導入が遅れていた
課題解決について
1.AWS移行(2015〜2016)
・マネージドサービスが利用できるように
・サーバーの導入や故障対応のコスト激減
AWS 導入事例
2.DBをMySQLからAuroraに(2018〜2019)
・各種コストが激減
mixi運営者ブログ
3.クライアント・フロントエンド構成のアップデート(2018〜2020)
・バージョンアップを実施
・各種ソフトウェアの導入を行い、効率をよくした
FINDJOB! (1997年11月~)
サービス/事業部の取り組み
IT・Web業界に特化した有名企業からスタートアップのデザイナー・エンジニア求人を中心に、業界最大級の求人を多数掲載中。独自のマッチング機能であなたに合う企業をお届け。選考前から企業の評価やメンバーが分かるからこそ、不安のない仕事探しを実現します。
技術スタック
フロントエンド(言語、ライブラリなど) | Nuxt.js、Vue.js、Node.js (Typescript) |
サーバーサイド(言語、ライブラリなど) | Django DjangoRestFramework (Python) |
インフラ | AWS ECS |
ミドルウェア | nginx、Redis、Celery |
データベース | MySQL |
モニタリング | CloudWatch、CloudWatch Logs |
データ分析 | Redash |
デプロイツール | AWS ecs-cli |
環境構築 | Docker、Docker Compose、Terraform |
CI | Jenkins、AWS CodeBuild、AWS Pipeline |
その他 | scikit-learn |
コメント
技術的課題
従来のシステムはバックエンド・フロントエンド・ミドルウェア・データベース共に老朽化しており、開発コスト、メンテナンスコスト、インフラ運用コストなどが重くなってしまっていたため、システムを全面的に刷新するプロジェクトが始まりました。インフラの問題点としては従来のオンプレミス環境をベースとしたシステムであったため、現代のクラウドシステムでの恩恵を受けることができずAWS上で稼働してはいるものの、内情はオンプレミスでの運用負荷と同様な負荷がかかっていました。本来ならばマネージドサービスを利用すると運用負荷がほぼゼロの状態になるデータベースや、メディアファイル管理、全文検索サーバ等、またオートスケールのような負荷対策などもマネージドサービスがあるにもかかわらずAWSの恩恵を受けることができませんでした。アプリケーション側での問題としては数年に一度訪れるUI/デザイントレンドの刷新を必要とされますが、従来のSSRなWebシステムで徐々に拡張されたシステムのため、UIを少し変えようにもPerlの実装力が必要になることも多く、また歴史のある巨大システムであるため各サブシステム事にその時代のフロントエンド技術を利用しており改修に必要なスキルが機能ごとに異なっている状況で、改修するエンジニア・デザイナー共に非常に高いスキルと歴史的知識が要求されるものでした。
課題解決について
現状考えられる安定していて、かつ運用コストが減るものをベースに技術スタックを決めていきました。
1.コンテナベースのインフラに移行
手動で手順書からプロビジョニングしていたものを、Docker、Docker Composeでのコンテナ環境に移行しました。これによってAWS ECSの恩恵を受けてサーバオートスケールや、自動デプロイ、ブルーグリーンデプロイ等に適合することができ、ワンクリックで安全なデプロイ・ロールバックが可能になりました。また、開発環境、検証環境などの構築も一瞬で用意が可能。Dockerfileを毎日CIでビルドすることでミドルウェア周りのトラブルも未然に防ぐことが可能です。
2.マネージドサービスをどっぷりと使えるように
使いたくても使えない状態でしたが、技術スタック刷新したことにより、各種マネージドサービスから最大の恩恵を受けられるように改善しました。
3.フロントエンド
フロントエンドは流行り廃りが激しいため、数年ごとに訪れるデザインリニューアルの際にも作りやすいように全部Vue.jsに統一して開発を進めました。開発進行中における不具合の数もjQuery等の手続き型UI開発とくらべて宣言型UI開発では不具合の件数が格段に少なくなりました。しかしスタイルに関する不具合はまだ多発するので、まだまだ精進が必要です。
6gram (2019年12月~)
サービス/事業部の取り組み
6gramは、アプリ上でカードを発行し、チャージして使うウォレットサービスです。いつもよりもちょっと便利に、みんなで楽しく使うことができます。
技術スタック
Romi (2020年5月~)
サービス/事業部の取り組み
Romi事業部では、新規事業として、人と会話ができる家庭用会話ロボットを研究開発しています。スマートスピーカーなど世の中の多くの会話システムは、便利な機能を実現するための手段として会話を使います。一方、私達は便利な機能ではなく、雑談的な会話をして情緒、感情的なニーズを満たすことを目的としています。これはとてもチャレンジングな課題で様々なアルゴリズムを組み合わせて検証を行っています。
技術スタック
iOS(言語、ライブラリなど) | Swift |
Android(言語、ライブラリなど) | Kotlin |
フロントエンド(言語、ライブラリなど) | Vue.js (管理ツールのみ) |
サーバーサイド(言語、ライブラリなど) | python、flask、uwsgi |
インフラ | AWS、GCP |
データベース | RDS、DynamoDB、Elasticsearch、Neptune、Elasticache |
モニタリング | CloudWatch |
データ分析 | Kibana |
デプロイツール | CircleCI |
環境構築 | terraform、Docker |
CI | CircleCI |
機械学習ライブラリ | tensorflow |
その他 | ロボット実機の仕様策定 ロボット実機内での作業(デバッグなど) |
技術的課題
1.飽きない自然な会話
2.レスポンスタイムの改善
3.音声認識精度の改善
課題解決について
1.飽きない自然な会話
・ビームサーチによって「最も良い発話」を選ぶのではなく TopP/TopK アルゴリズムによって、「悪くない多様性豊かな発話」を選ぶ
・任意長の過去の発話を発話生成に使えるモデルの開発
・ユーザーの性別など、ユーザー属性に応じた “condition” を導入する
・ユーザーの好みなどを抽出する仕組み(NLU, 現在開発中)
2.レスポンスタイムの改善
・データベースアクセスキャッシュ
・Transformerモデルの推論時の推論途中結果のキャッシュ
・Romiが応答をサーバーに投げているときに上を向くなど UX による体感テンポ感の改善
デジタルエンターテインメント本部新規ゲーム開発 (??年??月)
サービス/事業部の取り組み
デジタルエンターテインメント本部内で新規モバイルゲームの開発を行なっています。社内の開発ノウハウを生かしながらスピード感を持って開発を進めつつも、ゲームのサーバーサイドでは社内で初めてGCPを採用するなど多くのチャレンジを行なっています。プロダクトの詳細をお伝えできないのが残念ですが、みなさまにお届けできる日を楽しみにしています。
技術スタック
iOS(言語、ライブラリなど) | Unity |
Android(言語、ライブラリなど) | Unity |
サーバーサイド(言語、ライブラリなど) | Elixir、Phoenix |
インフラ | GKE |
ミドルウェア | Redis、NATS Server |
データベース | Cloud Spanner、Cloud Memorystore |
モニタリング | Cloud Monitoring、Prometheus |
データ分析 | Cloud Logging、BigQuery |
デプロイツール | Helm、Cloud Build |
環境構築 | Terraform |
CI | Cloud Build、Concourse |
コメント
技術的課題について
Elixir + Cloud Spannerの採用
ユーザーデータの強い整合性を担保しながら開発・運用コストの削減を行うため、私たちのタイトルではCloud Spannerを採用することにしました。ですが、私たちがサーバーアプリケーション開発に利用している Elixir には一般的な Cloud Spanner ライブラリが存在しませんでした。また、Cloud Spannerの採用を決めた時点ではすでにアプリケーション開発が進んでおり、RDBを利用する実装が入った状態でした。
課題解決について
ライブラリに関しては社内で内製するという選択をしました。内製にあたり開発本部という全社横断の技術支援部署に協力していただき、ライブラリの開発を担当していただきました。その上でアプリケーション側でのニーズや具体的なI/Fを頻繁に相談しながら開発を進めることで、開発中のアプリケーションの Cloud Spanner移行を実現しました。