エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

入社4ヶ月目で73時間かかるバッチ処理を7倍以上高速化した話

こんにちは。エンジニアリンググループの武井です。

私は現在、デジカルチームに所属し、クラウド電子カルテ、エムスリーデジカルの開発に携わっています。 昨年夏にエムスリーに入社し、早くも半年が経過しました。

digikar.co.jp

この記事では、私が入社してから4ヶ月目に取り組んだ、バッチ処理の運用改善について振り返ります。 特に、新しくチームに加わったメンバーとして意識した点に焦点を当ててみたいと思います。

これから新しいチームに参加する方の参考になれば幸いです。

改善したバッチ

今回の改善対象は、特定の医療機関に紐づく全患者の全カルテをPDFファイルとして出力する、というバッチです。 デジカルのデータを医療機関側にエクスポートする用途で使われています。

移行前のアーキテクチャを簡単に示します。

移行前のアーキテクチャ

医療機関からサポートチームが依頼を受け、管理画面上から実行予約を行います。出力処理はRuby on Railsでの非同期処理のgemの1つである Delayed Job を使用し、バッチ処理専用のサーバでカルテのPDFファイルを1枚ずつS3にアップロードしていく流れになっています。全カルテを出力し終えると自動で終了通知メールが送信されます。

数年間問題なく運用していましたが、最近になってサポートチームからこのバッチ処理が終わらないという問い合わせを多く受けるようになりました。デジカルのエンジニアチームではサポートチームからの問い合わせを交代で対応しており、問い合わせ数の増加に比例して運用負荷が増加していました。

実際にバッチ処理の実行時間を調査をしてみると、長い場合には丸3日以上かかっていることが分かりました。

また、バッチ処理を実行するサーバはDelayed Jobの他のJobと共有されており、このPDF出力の処理がサーバを長時間占有することで他のJobにも影響を与えていました。

現状の正確な理解

このバッチの改善を進めるためにまず現状の正確な理解に注力しました。

新メンバーが上手くプロジェクトを進めるためには、既存メンバーの助けを借りることが不可欠です。 その際に既存メンバーと視座を揃えて議論できるよう、前提知識を揃えることが重要と考えました。

周辺のコードや過去ログを読み込み、既存のアーキテクチャや発生している問題に対する理解を深めDesign Docを作成しました。 これをもとに設計ミーティングを実施し、深い部分まで議論できたと感じています。

結果的に、問題の本質はデータ量の増加に伴うバッチ実行時間の増加であることが明らかになり、これは出力処理の並列化によって解決できそうという方針を決めることができました。

現状に馴染む技術選定

未知の技術を調査、検討が不十分な状態で導入し、のちに技術的負債に繋がってしまう例はしばしばあると思います。 (もちろん技術的な挑戦を推奨する文化がエムスリーにはある前提での話です。)

特に、既存メンバーと比べてそのチームでの経験が不十分な新メンバーは、より慎重であるべきです。独りよがりな技術選定は避け、現状に馴染む技術選定を心がけました。

複数の設計案を比較した結果、次のアーキテクチャに移行することにしました。

移行後のアーキテクチャ

これまでDelayed Jobを利用していた部分をStep Functions + ECS に移行し、Step FunctionsのMapステートを利用して処理の並列化を実現しました。Workerは既存のECS Clusterが存在していたので、それを利用することにしました。

チーム内でStep Functionsの利用例は多く、IaCツールとして利用しているAWS CDKを中心に既存コードの再利用ができました。

このように既存のアーキテクチャに馴染む技術選定をしたことで、工数を低く抑えるとともにコードレビューなどで適切なアドバイスを受けることができたと感じています。

自分なりの+αを加える

当初想定していた改善はアーキテクチャ移行による並列化のみでした。ここで現状の問題点を改めて整理し、自発的に改善を加えることにしました。

具体的には、サポートチームが操作する管理画面にバッチの実行履歴を表示する機能を追加しました。

バッチの実行履歴 - 管理画面イメージ

小さな機能改善でしたが、サポートチーム側から実行状況を把握できるようになり、エンジニアに毎回問い合わせて確認する工数が削減できました。

既存の当たり前を疑い、自ら改善することは新メンバーとしての価値を発揮できるポイントの1つだと思います。

改善の結果

アーキテクチャを移行し並列化したことによって、ある医療機関では処理速度を7倍に高速化できました。移行後1ヶ月が経過しましたが、全ての処理が問題なく数時間で完了しています。

サポートチームからの問い合わせも移行前は週に1、2件あったものが現在はほぼ0件となり、チーム全体の運用工数削減に貢献できたと考えています。

We're hiring

ここまで自分が意識した点について書きましたが、やりがいのあるタスクを新メンバーでも任せてくれるエムスリーの文化があってこそだと思います。 そんなエムスリーで共に働く仲間を募集しています!

jobs.m3.com