メドピア開発者ブログスマートフォン用の表示で見るメドピア開発者ブログ集合知により医療を再発明しようと邁進しているヘルステックリーディングカンパニーのエンジニアブログです。Tumblrみなさんこんにちわ。メドピアでエンジニアをやっている内田と申します。Railsへと移行するプロジェクトが進んでいます。今回は移行に向けて行ったことについて共有したいと思います。Forum、ニュースなど、医師同士が情報交換をするための、機能の異なる複数のサービスを提供しています。それらサービスの内部では7年前に作られたPHPの独自FWが採用されており、コードが肥大化したことで機能の変更や追加がとても困難になっていたことが課題でした。した課題を解決するために、アーキテクチャの見直しを含めたリプレースがエンジニアの主導で計画されました。様々な言語を比較する中で、生産性の高さやコミュニティが活発なところに魅力を感じて言語はRubyへと決め、FWは独自で作るよりもOSSの方がより多くの開発者によって開発が行われているため、新しい機能が使えたり安定性が高いといったメリットがあるだろうと考え、Railsへと移行することに決めました。移行するにしても「MedPeer」はとてもモノリシックな上に、機能によってはもはや誰も知らないコードなども存在しており、一筋縄ではいきません。一度に全てを移行するという方針だと数年はかかりそうです。その間ビジネスを止めるわけにはいかないので、移行の間も新サービスの開発だったり機能の追加を常に行っていく必要があります。そこで、既存の機能追加は今まで通りレガシーな旧環境で開発しつつ、新サービスやサービスごと移行したいものに関してはRailsの新環境で開発していく、という方針を取ることにして、両環境を運用しながら徐々に移行することにしました。そのためにまずは旧環境と新環境2つを連携して並列稼働させる仕組みが必要でした。やったこと具体的にやったことは以下の3つですurlごとの振り分け共通処理の切り出しデータの同期urlごとの振り分けurlの振り分けは、nginxを使ったリバースプロキシー先の振り分けです。ドメインは両環境で同じにしてたとえば、/aaaときたurlは旧環境に、/bbbときたurlは新環境にと振り分けるようにしました。MedPeerは前述の通り複数のサービスで成り立っておりサービスごとにurlが異なり依存度も少ないためこの方法は合っていました。注意点としては両環境でurlがバッティングしないように設計する必要があったり、同一ドメインであるためcookieの扱いに気をつける必要があることです。共通処理の切り出し両環境にて共通に処理する必要のある機能が存在します。認証したら環境をまたいでもセッションをセキュアに維持できる仕組みが必要です。これに対しては既にAPIゲートウェイとして認証部分を別のアプリケーションとして切り出していたためそれを新環境でも利用するようにしました。いった共通処理を切り出しておくと他サービスでも連携しやすいといったメリットがあります。実際にメドピアの他サービス(キャリア、イシコメ)でも認証部分はAPIゲートウェイを利用しており、サービスのスケールに寄与しています。APIゲートウェイを開発した際の話についてご興味ある方はこちらをご参照ください。両環境ではユーザーテーブルなど共通のデータを利用する必要があります。当初は現行のDBを共用することも考えましたが以下の理由でやめました。テーブルの設計がRailsに最適化されていない移行を機にDB構造を見直したいRailsはDBに対してある一定の規約があります。主キーはidが望ましいといったことです。あたって最適化されていないという問題がありました。長年DBを運用していて設計上見直したい部分が多々ありました。不要なテーブル、カラムが存在しているカラム名が適切でないため理解しにくい正規化が適切にされていないindexやunique制約が適切に貼られていない移行をいい機会としてこれらを見直して再設計したいこともあり、DBは新しく作るという方針を立てました。そのために2つのDBのデータを同期する必要があったため、両環境のDBを橋渡しする役割のアプリケーションを作りました。それがDB-SYNCです。DB-SYNCは旧環境のデータを新環境でも使いたい場合にデータを任意の形にコンバートします。旧環境であるユーザーのEmailが更新されたとします。その際に更新があったことを通知するテーブルに登録されます。変換ルールが定義されたファイルを参照しながらUPSERTを行います。変換ルールが定義されたファイルは例えば以下のような内容が記載されます。統合して再設計した一つのテーブルにデータを登録していくといったことも可能になっています。旧環境から新環境への一方向のみとしています。ーのもとで、そのようにルール化しました。まとめ以上のような施策を行い2016年の夏にRailsで作られた新システムがリリースされており、現在は2つの環境が安定して動いています。徐々に移行することで比較的小さいリリースとなるので大きな障害が起きにくいといった安心感があるのと、Railsでの開発ができるようになったので楽しんで開発しているエンジニアが見られるようになったのはポジティブな要素だと感じています。知見があるメンバーに推進してもらいました。あたって経験豊富なエンジニアにしっかりとした土台を作ってもらい、その上で開発していくことが長く運用していくうえで大事だと考えています。近頃、大規模アプリケーションをRails化しているという案件を聞くことが多くなった気がします。事例が一つでも参考になれば幸いです。Orbを作りました11月に入社したCTO室SREの@sinsokuです。SREの侘美(たくみ)です。普段はRai...2019-10-01滞りなくサービスをクローズするために必要なことメドピアエンジニアの難波です。開発事例公開~こんにちは。エンジニアの宮原です。月別アーカイブリンク医師専用サイト「MedPeer」エンジニア採用はこちら!スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。