インターンスポットライト:カイル・マコーミック

12年2015月XNUMX日 | 執筆者

カイル・マコーミックです。ウースター工科大学の11年生で、edXのモバイルチームでXNUMX週間の夏季インターンシップを終えたばかりです。チームでは、主にパフォーマンス関連のバックエンド業務に取り組んでいました。今回の投稿では、私が最も多くの時間を費やしたXNUMXつのプロジェクトのうちのXNUMXつについてお話ししたいと思います。

コースメタデータのキャッシュ

私が最初に取り組んだ課題の一つは、なぜ私たちのチームへの電話が ユーザーコース登録API モバイルアプリのメイン画面を表示するために使用されているエンドポイントの応答に1秒以上かかっていました。このエンドポイントは、ユーザーが登録しているコースのリストと、コースの基本的なメタデータ(名前、大学、開始日など)を返すだけなので、数百ミリ秒以上もかかっているのは驚きでした。調査は、登録リストを計算するコードを調べることから始めました。 pyinstrument プロファイリングを行う。

最初に気づいたことの一つは、各コースの登録ごとに、コースのメタデータがMongoDBから3回に分けてロードされていたことです(2回 enrollment.courseへの呼び出しと かつて シリアル化中にエラーが発生し、エンドポイントへの呼び出し間でキャッシュされていませんでした。これがエンドポイントのパフォーマンス問題の原因ではないかと疑い、NewRelicの「X-Ray Tracing」ツールで確認しました。 

New Relic X-Ray Trace のスクリーンショット

上のトレースからわかるように、関数 モジュールストア/mixed.py.get_courseMongoDBからコースウェアをロードする は、応答時間の90%を消費していました。これは、エンドポイントを最適化する方法がXNUMXつあることを示唆しています。 コースを取得する より速く、または返されたデータをキャッシュすることで呼び出し回数を最小限に抑えます。 コースを取得する前者は確かに必要な作業ですが、コアプラットフォームコードに大幅な変更を加える必要があります。キャッシュソリューションは実装が簡単で、単にレイヤーを追加するだけなので、 コースを取得する 呼び出し – 私は後者の解決策を採用しました。さらに、キャッシュはリクエスト間で機能するため、たとえ コースを取得する 最適化されています。 

コースのメタデータをキャッシュするために、私はDjangoモデルを作成しました。 コース概要コースのメタデータが初めてリクエストされると、 コースを取得する が呼び出されると、 コース概要 戻り値からインスタンスが作成され、インスタンスはMySQLに保存されます。コースのメタデータに対する次のリクエストでは、 コース概要 インスタンスは、1回のMySQLクエリのみを必要とします(get_courseの呼び出しごとに実行される4~XNUMX回のMongoDBクエリとは対照的です)。edX Studioでコースが更新されると、対応する コース概要 インスタンスがクリアされ、次のリクエストでは更新されたメタデータをフェッチするために コースを取得する 再び。

このキャッシュシステムを使用するために、モバイルユーザーコース登録APIエンドポイントを更新しました(PR#8484)を導入し、Locust.ioを用いた負荷テストを実施し、パフォーマンスの向上を確認しました。更新コードがリリースされた時期のNewRelicの本番環境データを見ると、パフォーマンスへの影響が顕著に表れています。 

NewRelic のパフォーマンス グラフでサイトの応答時間が短縮されていることがわかります

上のグラフは、モバイルAPIの平均応答時間を示しています。 ユーザーコース登録リスト エンドポイントの応答時間はミリ秒単位でした。エンドポイントは1月1100日にメタデータキャッシュを使用するように更新されました。平均応答時間は約110ミリ秒から約XNUMXミリ秒に短縮されました。

キャッシュのその他の用途

同様のメタデータセットが必要なので、メタデータキャッシュシステムを使用するようにWeb学生ダッシュボードも更新しました(PR#8642)、その結果、それほど劇的ではありませんが、応答時間は大幅に短縮されました。 

NewRelic のパフォーマンス グラフでサイトの応答時間が短縮されていることがわかります

上のグラフは、ウェブベースのedX学生ダッシュボードの平均応答時間(ミリ秒単位)。ダッシュボードは17月600日にメタデータキャッシュを使用するように更新されました。平均応答時間は800~250ミリ秒から約XNUMXミリ秒に短縮されました。

これら2つのユースケースに加えて、キャッシュシステムは、ユーザーに依存しない基本的なコースメタデータが必要なあらゆるシナリオで活用できます。例えば、edXの別の従業員が最近、一般的な登録APIを更新し、 コース概要sを呼び出す代わりに コースを取得する (PR#8927)、その結果、10パーセンタイル応答時間が95分のXNUMXに短縮されました。 登録リストビュー エンドポイントを使用して定義します

結論

同僚のインターン生のベンが言っていたように 彼のブログ投稿edXインターンシッププログラムの真価は、インターン生を実際のソフトウェアエンジニアリングチームに組み込み、正社員のように扱い、インパクトのあるプロジェクトに取り組ませる点にあります。これほどの規模と数の貢献者がいるプロジェクトに携わったことは初めてでしたが、非常に多くのことを学びました。edXでの私の任期は終わりを迎えましたが、素晴らしいOpen edXコミュニティに引き続き関わり続けたいと思っています。最後に、比類のないインターンシップ体験を提供してくれたNimisha、Chris、Kishore、Adam、Dave、そしてedXチームの皆様に感謝申し上げます。

 

 

ローディング

もっと時間が必要ですか? 以下の記事をご覧ください。

共に問題を解決する:コミュニティ主導のプラットフォーム開発
Open edXカンファレンスで未来を切り拓くスキルとスケールアップ
Open edXカンファレンス開発者向けワークショップ
デジタルの未来を取り戻す:私がオープン・ルネッサンス・グループに参加した理由
Open edX カンファレンス 2026 に参加しましょう!

2026 Open edX カンファレンスでは、世界最高峰のオープンソース オンライン学習管理システムの XNUMX つである Open edX プラットフォームの革新的な使用事例を紹介し、教育設計、コース構成、生成 AI などの画期的なテクノロジーを含む Open edX プラットフォームの運用と拡張の方法における最新の進歩を紹介します。