かなり複雑な Web アプリケーションを作成しています。Python バックエンドは、頻繁には変更されないいくつかの相互に関連するデータベース テーブルに格納されたデータと、頻繁に変更されるユーザー固有のデータに状態が依存するアルゴリズムを実行します。アルゴリズムのユーザーごとの状態は、ユーザーがアプリケーションを操作するにつれて、多くの小さな変化を受けます。このアルゴリズムは、特定の重要な決定を行うために、各ユーザーの作業中に頻繁に使用されます。
パフォーマンス上の理由から、(半正規化された) データベース データからのリクエストごとに状態を再初期化することは、すぐに実行不可能になります。たとえば、状態の Python オブジェクトを何らかの方法でキャッシュして、必要に応じて簡単に使用および/または更新できるようにすることが非常に望ましいでしょう。ただし、これはWebアプリケーションであるため、リクエストを処理するプロセスがいくつかあるため、グローバル変数を使用することは問題外です.
関連するオブジェクトを(ピクル経由で)シリアル化し、シリアル化されたデータをDBに保存しようとしましたが、現在、memcachedを介してシリアル化されたデータをキャッシュすることを試しています。ただし、これには、オブジェクトを頻繁にシリアル化および逆シリアル化するという大きなオーバーヘッドが依然としてあります。
私は共有メモリソリューションを見てきましたが、私が見つけた唯一の関連するものはPOSHです。しかし、POSH は広く使用されているようには見えず、そのような実験的なコンポーネントを自分のアプリケーションに統合するのは簡単ではありません。
アドバイスが必要です!これは Web アプリケーションを開発する最初の試みなので、これが十分に一般的な問題であり、そのような問題に対するよく知られた解決策があることを願っています。この時点では、Python バックエンドが単一のサーバーで実行されていることを前提とするソリューションで十分ですが、複数のサーバーに拡張するソリューションの追加ポイント:)
ノート:
- 私はこのアプリケーションを動作させており、現在ライブでアクティブなユーザーがいます。時期尚早の最適化を行わずに開始し、必要に応じて最適化しました。上記の問題が実際のボトルネックであることを確認するために、測定とテストを行いました。現在のセットアップからより多くのパフォーマンスを引き出すことができると確信していますが、より良い方法があるかどうかを尋ねたかった.
- セットアップ自体はまだ進行中です。システムのアーキテクチャは、ソリューションに適したものであれば何でもよいと想定してください。