技術的負債を改善!(3) 分断されたモノリスの結合

Posted by SpaceAgent Tech Blog スペテク on Saturday, June 8, 2019

@kaiba です。
暑くなってきたので思い切ってボーズにしました。
えらく不評でして、僕も戸惑っていますがとても快適です!

技術的負債シリーズの続きです。

スペースエージェントが抱える技術的負債(復習)

システム構成

スペースエージェントは複数のサービスを運営しており、雑に書くと上記のような構成になっています。
この構成はRails界隈では「分断されたモノリス」と呼ばれており、あまり良い設計とは言えません。

今回は分断されたCakePHPを1つにしました

社内で使用する管理画面をSPACE CLOUDに統合する形で1つにしました。

どのように結合したか

口にするのはすごく簡単で、namespaceを切り、そこに管理画面を配置しただけです。 しかし、コピーして作られたモデル層は注意が必要です。

具体的に見ていきましょう。
今回は例として、SpaceAgent という namespaceに管理画面を置く例を書きます。

コントローラのディレクトリを掘る

ディレクトリを掘り、ここに管理画面のコントローラをすべてコピーします。

Controller/SpaceAgent

コントローラのnamespaceを変更します。

<?php

namespace App\Controller\SpaceAgent;

use App\Controller\AppController;
use Cake\Event\Event;

class ChatController extends AppController

フロントエンドのディレクトリを掘る

webroot/spaceagent

同じくコピーします。

routes

routesにprefixをつけて、管理画面のroutesをコピーします。

<?php

Router::prefix('spaceagent', function (RouteBuilder $routes) {
    // ここに管理画面routesをペーストする

});

この時点でモデル層に差異がなければ動くはずですが、当然差異があるわけで、動かない画面がありました。

モデル層、コンポーネント、バッチ

ここからは 気合根性サービスとメンバーへの愛情 でコツコツとやっていくだけです…!(笑)

こちらも namespace を切ることを考えましたが、おそらく殆どのコードが共通化すべきコードですので、 手でマージしていく方法を採用しました。

テストする

技術的負債の話(2)でシステムテスト仕様書を作成しました。
これが担保できれば大きなバグは潰せるでしょう。 早速システムテスト仕様書が効いてきました!

リリース

管理画面のURLが変更になります。
ユーザへの影響は皆無なのですが、社内への丁寧な周知も必要でしょう。
以下を周知しました。

  • 管理画面のURLが変更になること
  • リリース予定時期
  • リリース作業の開始と終了

リリース後「管理画面が見られなくなった!」という問い合わせが多数来てしまい、 僕の伝達力、コミュニケーション力の低さが露呈しました…。
口頭でもSlackでも何度も伝えてきたのですが、うまく伝わってなかったのですね…。

まとめ

1つのDBに
  • 分断されたモノリスを1つに結合できた
  • これまで管理画面への機能追加は、ソースコードのコピーが嫌すぎて二の足を踏んでおりましたが、ストレスなく機能追加できるようになりました!
  • 開発環境の構築が楽になり、誰でも管理画面の開発ができるようになった!

しかし、まだ民泊物件とSPACE CLOUDは分断されたままです。 ここはユーザやSEOへの影響もあるので単純には行きませんが、以下の理由で峠は超えたと考えています。

  • 収益物件.com というサービスがAPIを叩く形で分割できているので、同様の構造にすれば分離できることがわかっている
  • 2つのサービスをマージする方法も今回示せたので、1つのCakeにすることもできる

まだまだ大きな問題がありますが、だいぶ普通のCakePHPのプロジェクトになってきた感じがします。