BlueがRustとスケーラブルなアーキテクチャ、戦略的な技術選択を使用してCSVのインポートとエクスポートを10倍にスケールさせた方法を発見してください。


Blueでは、プロジェクト管理ソフトウェアの可能性を常に押し広げています。これまでの数年間で、数百の機能をリリースしました

私たちの最新のエンジニアリングの偉業は?

私たちのCSVインポートエクスポートシステムの完全なオーバーホールで、パフォーマンスとスケーラビリティを劇的に改善しました。

この投稿では、この課題にどのように取り組んだか、私たちが使用した技術、そして達成した印象的な結果について舞台裏をお見せします。

ここで最も興味深いのは、私たちが望む結果を達成するために、通常の技術スタックの外に出る必要があったことです。この決定は慎重に行う必要があり、長期的な影響は技術的負債や長期的なメンテナンスのオーバーヘッドにおいて厳しいものになる可能性があります。

エンタープライズニーズへのスケーリング

私たちの旅は、イベント業界のエンタープライズ顧客からのリクエストから始まりました。このクライアントは、広範なイベント、会場、スピーカーのリストを管理するための中心的なハブとしてBlueを使用し、ウェブサイトとシームレスに統合しています。

彼らにとって、Blueは単なるツールではなく、彼らの全体の運営の真実の唯一の情報源です。

私たちは、顧客がそのようなミッションクリティカルなニーズに私たちを使用していると聞くことを常に誇りに思っていますが、迅速で信頼性の高いシステムを確保するためには、私たち側にも大きな責任があります。

この顧客が業務を拡大するにつれて、彼らは大きな障害に直面しました:10万件から20万件以上のレコードを含む大きなCSVファイルのインポートとエクスポート。

これは当時の私たちのシステムの能力を超えていました。実際、以前のインポート/エクスポートシステムは、すでに1万件から2万件のレコードを含むインポートとエクスポートに苦しんでいました!したがって、20万件以上のレコードは論外でした。

ユーザーは非常に長い待ち時間を経験し、場合によってはインポートやエクスポートが全く完了しないこともありました。これは、彼らが特定の業務を管理するために日々のインポートとエクスポートに依存していたため、彼らの業務に大きな影響を与えました。

マルチテナンシーは、単一のソフトウェアインスタンスが複数の顧客(テナント)にサービスを提供するアーキテクチャです。効率的ですが、1つのテナントのアクションが他のテナントに悪影響を及ぼさないように、慎重なリソース管理が必要です。

この制限は、この特定のクライアントだけに影響を与えていたわけではありません。

私たちのマルチテナントアーキテクチャのために—複数の顧客が同じインフラストラクチャを共有する—リソース集約型のインポートまたはエクスポートが1つのユーザーの操作を遅くする可能性があり、実際にそのようなことがよく起こっていました。

いつものように、私たちは自社のシステムをアップグレードするために時間を費やすべきか、他の誰かからシステムを購入するべきかを理解するために、ビルド対購入の分析を行いました。さまざまな可能性を検討しました。

際立ったベンダーは、FlatfileというSaaSプロバイダーでした。彼らのシステムと機能は、私たちが必要としていたものにぴったりでした。

しかし、彼らの価格を確認した後、私たちはこのソリューションが私たちのスケールに対して非常に高価なものになると判断しました—ファイルあたり2ドルはすぐに合計が大きくなります!—そして、私たちの内蔵のCSVインポート/エクスポートエンジンを拡張する方が良いと考えました。

この課題に取り組むために、私たちは大胆な決定を下しました:主にJavascriptの技術スタックにRustを導入することです。このシステムプログラミング言語は、そのパフォーマンスと安全性で知られており、私たちのパフォーマンスクリティカルなCSV解析とデータマッピングのニーズに完璧なツールでした。

私たちが解決策に取り組んだ方法は次のとおりです。

バックグラウンドサービスの導入

私たちの解決策の基盤は、リソース集約型のタスクを処理するためのバックグラウンドサービスの導入でした。このアプローチにより、重い処理をメインサーバーからオフロードし、全体的なシステムパフォーマンスを大幅に改善しました。
私たちのバックグラウンドサービスアーキテクチャは、スケーラビリティを考慮して設計されています。私たちのインフラストラクチャのすべてのコンポーネントと同様に、これらのサービスは需要に基づいて自動的にスケールします。

これは、ピーク時に複数の大規模なインポートまたはエクスポートが同時に処理されているときに、システムが自動的により多くのリソースを割り当てて増加した負荷を処理することを意味します。逆に、静かな期間中は、リソース使用を最適化するためにスケールダウンします。

このスケーラブルなバックグラウンドサービスアーキテクチャは、CSVインポートとエクスポートだけでなく、Blueにも利益をもたらしました。時間が経つにつれて、私たちはメインサーバーの負荷を軽減するために、かなりの数の機能をバックグラウンドサービスに移動しました:

  • 数式計算:複雑な数学的操作をオフロードし、メインサーバーのパフォーマンスに影響を与えることなく派生フィールドの迅速な更新を保証します。
  • ダッシュボード/チャート:ユーザーインターフェースを遅くすることなく、最新の視覚化を生成するために、大規模なデータセットをバックグラウンドで処理します。
  • 検索インデックス:バックグラウンドで検索インデックスを継続的に更新し、システムパフォーマンスに影響を与えることなく迅速かつ正確な検索結果を保証します。
  • プロジェクトのコピー:バックグラウンドで大規模で複雑なプロジェクトの複製を処理し、ユーザーがコピーが作成されている間も作業を続けられるようにします。
  • プロジェクト管理の自動化:ユーザー定義の自動化ワークフローをバックグラウンドで実行し、他の操作をブロックすることなくタイムリーなアクションを保証します。
  • 繰り返しレコード:バックグラウンドで定期的なタスクやイベントを生成し、メインアプリケーションに負担をかけることなくスケジュールの正確性を維持します。
  • 時間のカスタムフィールド:Blue内の2つのイベント間の時間差を継続的に計算および更新し、システムの応答性に影響を与えることなくリアルタイムの期間データを提供します。

データ解析のための新しいRustモジュール

私たちのCSV処理ソリューションの中心は、カスタムRustモジュールです。これは、私たちのコア技術スタックであるJavascriptの外に出る初めての試みでしたが、Rustを使用する決定は、その同時操作とファイル処理タスクにおける卓越したパフォーマンスによって推進されました。

Rustの強みは、CSV解析とデータマッピングの要求に完璧に一致します。そのゼロコストの抽象化により、パフォーマンスを犠牲にすることなく高レベルのプログラミングが可能になり、所有権モデルによりガーベジコレクションなしでメモリの安全性が確保されます。これらの機能により、Rustは大規模なデータセットを効率的かつ安全に処理するのに特に適しています。

CSV解析には、Rustのcsvクレートを活用しました。これはCSVデータの高パフォーマンスな読み書きを提供します。これをカスタムデータマッピングロジックと組み合わせて、Blueのデータ構造とのシームレスな統合を確保しました。

Rustの学習曲線は急でしたが、管理可能でした。私たちのチームは、このために約2週間を集中して学習に費やしました。

改善は印象的でした:

私たちの新しいシステムは、古いシステムが15分で処理できた同じ量のレコードを約30秒で処理できます。

ウェブサーバーとデータベースの相互作用

Rust実装のウェブサーバーコンポーネントには、Rocketをフレームワークとして選びました。Rocketは、パフォーマンスと開発者に優しい機能の組み合わせで際立っていました。その静的型付けとコンパイル時チェックは、Rustの安全性の原則とよく一致し、開発プロセスの初期段階で潜在的な問題を早期に発見するのに役立ちました。
データベースの面では、SQLxを選択しました。このRust用の非同期SQLライブラリは、私たちのニーズに理想的な多くの利点を提供します:

  • 型安全なSQL:SQLxを使用すると、コンパイル時にチェックされたクエリで生のSQLを書くことができ、パフォーマンスを犠牲にすることなく型の安全性を確保できます。
  • 非同期サポート:これはRocketや効率的で非ブロッキングのデータベース操作の必要性とよく一致します。
  • データベース非依存:私たちは主にAWS Auroraを使用していますが、SQLxの複数のデータベースのサポートにより、将来的に変更する場合の柔軟性が得られます。

バッチ処理の最適化

最適なバッチ構成への旅は、厳密なテストと慎重な分析のものでした。さまざまな同時トランザクションとチャンクサイズの組み合わせで広範なベンチマークを実施し、生の速度だけでなく、リソースの利用状況とシステムの安定性も測定しました。

このプロセスには、さまざまなサイズと複雑さのテストデータセットを作成し、実際の使用パターンをシミュレートすることが含まれました。次に、これらのデータセットを私たちのシステムに通し、各実行のために同時トランザクションの数とチャンクサイズを調整しました。

結果を分析した後、500レコードのチャンクサイズで5つの同時トランザクションを処理することが、速度とリソース利用の最良のバランスを提供することがわかりました。この構成により、高いスループットを維持しつつ、データベースを圧倒したり、過剰なメモリを消費したりすることなく処理できます。

興味深いことに、5つのトランザクションを超えて同時性を高めても、顕著なパフォーマンス向上は得られず、時にはデータベースの競合が増加することがわかりました。同様に、大きなチャンクサイズは生の速度を改善しましたが、小規模から中規模のインポート/エクスポートに対しては、メモリ使用量が増加し、応答時間が長くなるというコストがかかりました。

メールリンク経由のCSVエクスポート

私たちの解決策の最後の部分は、大きなエクスポートファイルをユーザーに届けるという課題に対処しています。ウェブアプリから直接ダウンロードを提供するのではなく、タイムアウトの問題やサーバーの負荷を増加させる可能性があるため、メールでダウンロードリンクを送信するシステムを実装しました。

ユーザーが大きなエクスポートを開始すると、私たちのシステムはバックグラウンドでリクエストを処理します。完了すると、接続を保持したり、ファイルをウェブサーバーに保存したりするのではなく、ファイルを安全な一時ストレージ場所にアップロードします。その後、ユニークで安全なダウンロードリンクを生成し、ユーザーにメールで送信します。

これらのダウンロードリンクは2時間有効で、ユーザーの利便性と情報セキュリティのバランスを取っています。この時間枠は、ユーザーがデータを取得するのに十分な機会を提供し、機密情報が無期限にアクセス可能でないことを保証します。

これらのダウンロードリンクのセキュリティは、私たちの設計において最優先事項でした。各リンクは:

  • ユニークでランダムに生成されており、推測することがほぼ不可能です
  • 2時間のみ有効です
  • 転送中に暗号化されており、データがダウンロードされる際の安全性を確保します

このアプローチにはいくつかの利点があります:

  • 大きなファイルのダウンロードを直接処理する必要がないため、ウェブサーバーの負荷が軽減されます
  • 特に遅いインターネット接続を持つユーザーにとって、ブラウザのタイムアウトの問題に直面することなく、ユーザーエクスペリエンスが向上します
  • 通常のウェブタイムアウト制限を超える可能性のある非常に大きなエクスポートに対して、より信頼性の高いソリューションを提供します

この機能に対するユーザーのフィードバックは圧倒的に肯定的で、多くの人が大規模なデータエクスポートを管理する柔軟性を評価しています。

フィルタリングされたデータのエクスポート

もう一つの明らかな改善点は、ユーザーがプロジェクトビューで既にフィルタリングされたデータのみをエクスポートできるようにすることでした。つまり、アクティブなタグ「優先度」がある場合、そのタグを持つレコードのみがCSVエクスポートに含まれることになります。これにより、Excelで重要でないものをフィルタリングするためのデータ操作にかかる時間が短縮され、処理する行数も減少します。

今後の展望

私たちはRustの使用を拡大する即時の計画はありませんが、このプロジェクトはパフォーマンスクリティカルな操作におけるこの技術の可能性を示しました。これは、将来の最適化ニーズのためのツールキットにおいて、私たちが今持っているエキサイティングな選択肢です。このCSVインポートとエクスポートのオーバーホールは、Blueのスケーラビリティへのコミットメントと完全に一致しています。

私たちは、顧客の成長に合わせて拡張するプラットフォームを提供し、パフォーマンスを損なうことなく彼らのデータニーズを処理することに専念しています。

Rustを私たちの技術スタックに導入する決定は軽視されるべきではありませんでした。これは、多くのエンジニアリングチームが直面する重要な質問を提起しました:コア技術スタックの外に出るのはいつが適切で、いつ慣れ親しんだツールを使い続けるべきでしょうか?

一律の答えはありませんが、Blueでは、これらの重要な決定を下すためのフレームワークを開発しました:

  • 問題優先アプローチ:私たちは常に解決しようとしている問題を明確に定義することから始めます。この場合、大規模なデータセットのCSVインポートとエクスポートのパフォーマンスを劇的に改善する必要がありました。
  • 既存のソリューションの徹底的な検討:コアスタックの外を見る前に、既存の技術で何が達成できるかを徹底的に探ります。これには、プロファイリング、最適化、そして慣れ親しんだ制約の中でのアプローチの再考が含まれます。
  • 潜在的な利益の定量化:新しい技術を検討する場合、私たちはその利点を明確に説明し、理想的には定量化できる必要があります。私たちのCSVプロジェクトでは、処理速度のオーダーオブマグニチュードの改善を予測しました。
  • コストの評価:新しい技術を導入することは、単に即時のプロジェクトに関することではありません。私たちは長期的なコストを考慮します:
    • チームの学習曲線
    • 継続的なメンテナンスとサポート
    • デプロイメントと運用における潜在的な複雑さ
    • 採用とチーム構成への影響
  • 制御と統合:新しい技術を導入する場合、それをシステムの特定の、明確に定義された部分に制限することを目指します。また、既存のスタックとの統合方法について明確な計画を持つことを確認します。
  • 将来の見越し:この技術の選択が将来の機会を開くか、あるいは私たちを隅に追いやる可能性があるかを考慮します。

新しい技術を頻繁に採用することの主なリスクの一つは、私たちが「技術動物園」と呼ぶものに陥ることです—アプリケーションの異なる部分が異なる言語やフレームワークで書かれ、維持するために幅広い専門的スキルが必要な断片化されたエコシステムです。

結論

このプロジェクトは、Blueのエンジニアリングへのアプローチを exemplifies: 私たちは、ユーザーにとって大幅に改善された体験を提供するために、新しい技術を採用することを恐れません。

CSVインポートとエクスポートプロセスを再考することで、私たちは1つのエンタープライズクライアントの緊急のニーズを解決しただけでなく、大規模なデータセットを扱うすべてのユーザーの体験を改善しました。

プロジェクト管理ソフトウェアの可能性を押し広げ続ける中で、私たちはこのような課題に取り組むことを楽しみにしています。

今後のBlueを支えるエンジニアリングの深堀りにご期待ください。

AIアシスタント

回答はAIを使用して生成されており、間違いが含まれる可能性があります。

どのようにお手伝いできますか?

Blueやこのドキュメントについて何でも聞いてください。

送信するにはEnterを押してください • 新しい行を作成するにはShift+Enterを押してください • ⌘Iで開く