ジモティーを支える技術2020(サーバーサイド編)

こんにちは、ジモティーのエンジニアの鈴木です。

タイトルの由来とか

日本に5人くらいいるハードコア・ジモティーウォッチャーの皆様におかれましては「ジモティーを支える技術」という記事が2012年に当時のスタッフブログに掲載されていたことをご記憶されているかと思うのですが、8年の時を経てついにリライトされるわけですね。感慨深いです。

オリジナルの記事はWebアーカイブで見られますのでご興味がおありの方は探してみてください。

ネイティブアプリの技術スタックについてはきっとアプリチームのメンバーが書いてくれると思いますので、今回はサーバーサイド〜インフラ周りについて紹介します。

Webフロントエンド

  • jQuery
  • Vue.js
  • Foundation
  • FLOCSS

古くからある画面はjQuery、新しい画面はVue.jsで構築しています。 Vue.jsのデータバインディングに慣れた結果、jQueryの肥大化したコードにアレルギー反応が出るようになってしまったのが悩みの種ですね(もうレビューすらしたくないんや…)。 隙を突いてVueに書き換えたい。

CSSフレームワークはFoundationを利用しています。 FLOCSSのルールに基づき弊社のデザインガイドラインコンポーネントの整備を進めています。

今後は、Nuxt.jsなどのサーバーサイドレンダリング層を導入して、フロントエンドとバックエンドを疎結合にしていった方が、生産性が高いのではと考え、再構築も検討しています。

Webバックエンド

おなじみのRailsですね。 Railsの「Fat Model, Skinny Controller」の思想に基づきFat Model OKとしてここまで来たのですが、さすがに9年開発を継続しており、メンバーも増えてくるとそうも言ってられないなーという状況です。 サービスオブジェクトの導入については結構うまくいったなーと持っているのですが、それだけだとシステムの複雑化に対抗するにはまだ武器が足りないなーという印象。 ということで、肥大化したModelに対して、再設計して責務を分割していくというリファクタリングを地道に進めています。

開発環境

  • Github
  • CircleCI
  • rubocop
  • brakeman
  • reek
  • Docker

GitHub Flowに基づいて開発を進めています。 またwebhookでコミットがプッシュされるたびにCircleCIで自動テストが実行されるようになっています。 テストとレビューが通ったものだけがmasterブランチにマージできます。 またCircleCI上で、rubocop、brakeman、reekといった静的解析ツールも実行されるようになっており、お行儀の悪いコードを書くと自動的に指摘されるようになっています。

ローカルの開発環境にDockerを利用しており、開発環境構築の手間を減らしています。

デプロイ

デプロイタスクは半自動化されており、Jenkinsのジョブを実行するだけで本番環境にデプロイすることができます。 デプロイの詳細処理はCapistranoで書いています。 ブルーグリーンデプロイを採用しており、リリース直後に障害が発生した場合は迅速に切り戻すことができます。

ミドルウェア

  • Nginx
  • MongoDB
  • Elasticsearch
  • Aurora(MySQL
  • memcache
  • Redis

メインのDBにMongoDBを採用していることが特徴ですかね。 トランザクション制御が必要な場合はMySQLを利用しています。 MongoDB 4.0でトランザクションが追加されるわけですし、全部MongoDBに寄せられるのでは?などと密かに期待しています。

MongoDBはスキーマレスなのでフィールドの追加がめちゃ楽なのですが、それゆえに安易にフィールドが増えがちなので、長期的に開発を継続する際にはデータモデリングをまじで頑張った方が良いです。 まじで頑張ってください。約束です。

データ分析

  • Redash
  • GAS
  • BigQuery
  • Fluentd
  • embulk

Fluentd、embulkを用いてアクセスログトランザクションデータをBigQueryに集約しています。 Redashでデータ分析を行ったり、データを可視化(グラフ化)してます。 ビジネスサイドのメンバーにもSQLを習得してもらっているので、ディレクターがバリバリSQLを書いて分析したりしています。 GAS(GoogleAppScript)でBigQueryにクエリを実行し、結果をスプレッドシートに吐き出す、といったこともしています。

自然言語処理

テキストの解析用途でPythonも使っています。機械学習には欠かせない言語なので今後も活用範囲が広がっていくと思われます。

インフラ

メインのインフラはAWSです。 BigQueryなど一部の用途でGCPも利用しています。

AWSのリソースはCloudFormationで管理しており、サーバープロビジョニングにはitamae、serverspecを活用しています。 もう手順書をみながら手作業でインフラ構築しなくて良いんですね。すばらしい。

サーバー監視にはmackerelを使っています。設定やカスタマイズが簡単で良いですね。

おわりに

8年経つとさすがに進化してるなーというところですが、 一方技術負債もかなり溜まっているのできっちり返済していきたいですね。 個人的にはフロントエンドの再構築に挑戦したい。

ということでジモティーでは新規開発にリファクタリング、リアーキテクチャとやりたいことが山積みですので、一緒に開発してくれるメンバーを募集中です!