はじめに

データエクスポートはほとんどの企業アプリケーションに存在する機能です。ActiveAdmin はデフォルトでエクスポート機能を提供しており、この機能は同期的に動作します。つまり、データの生成はクライアントの要求時に行われます。

同期エクスポートの問題

しかし、エクスポートするデータの量が多い場合、処理に時間がかかることがあります。サーバーが忙しくなると、それによって要求を処理できず、要求が積み重なり、ボトルネックが発生します。パフォーマンスが低下し、アプリケーションが遅いことにユーザーが気付きます。

状況が悪化すると、バックログが大きくなりすぎて、サーバーがリクエストをタイムリーに処理できなくなります。アプリケーションはエラーを返し始めます。状況がさらに悪化し続けると、アプリケーションは完全に機能しなくなり、アクセスできなくなります。

非同期ソリューションの実装

このような問題に直面した際、私たちは activeadmin-async_exporter というgemを使用して対処しました。このライブラリは、ActiveJobを使用してActiveAdminでデータエクスポートを非同期に行うことを可能にします。しかし、私たちはこのソリューションを利用するために調整を行う必要がありました。

まず、activeadmin-async_exporterというgemはその作者によってもはやメンテナンスされておらず、私たちのRailsのバージョンとは互換性がありませんでした。そのため、私たちはそれを修正し、その依存関係を更新する必要がありました。

さらに、strong_parametersを使用してパラメータを管理し、 current_user を使用する際に欠落するメソッドの問題を解決するためにいくつかの追加の適応を行いました。これは、作者のgemが current_admin_user を使用しているためです。

私たちのアプリケーションとは異なり、gemは添付ファイルにActiveStorageを使用していません。そのため、この部分も調整を行いました。

リクエストを記録するために、gemはデータベースに必要なテーブルを作成するマイグレーションのためのジェネレーターを提供します。また、エクスポートを管理するためのインターフェイス用のActiveAdminジェネレーターも提供します。ただし、これらのジェネレーターは文書化されていません。

最終的に、私たちはgemのコードをアプリケーションに直接取り込み、必要に応じてカスタマイズしました。

gemとしての公開

コードがアプリケーションに統合されているため、私たちはこれを新しいgemとして公開しないことに決めました。新たな適応努力が必要となるでしょう。また、このライブラリの活動が少ないことを考えると、このソリューションがコミュニティのニーズを必ずしも満たしているとは思えませんが、私たちのアプリケーションのパフォーマンスを向上させるのに非常に役立ちました。

それでも、これらの変更に興味がある場合や質問やコメントがある場合は、お気軽にお問い合わせください。

結論

このエピソードは、アプリケーションの進化における問題がどのように発生するかを具体的な例で示しています。人気がなくメンテナンスされていないgemの使用と調整に基づくソリューションは一見非定型に見えるかもしれませんが、このアプローチは実際には技術的な問題解決の非常にクラシックなプロセスに従っています。