0

開くことができるmysql接続の量には制限があると思います。ユーザーからのデータを一時的に保存し、データベースに一度に挿入する方法はありますか? または、20 万人が Facebook のステータスを更新しているとしたら、他にどのように管理しますか? (単純に 200k の接続を開いて情報を入力することはできないからです。)

ありがとう。

4

1 に答える 1

1

たとえば、キュ​​ーを使用して、単一のプロセスが (プロセス間通信またはソケットを介して) INSERT を取得することができます。その場合、キュー サーバーへの接続が 200.000 であっても、ファイルを「スプール」に格納することによっても可能です。 " ディレクトリ)。

次に、プロセスはキューを「取得」し、MySQL の場合は拡張構文を使用して INSERTS を結合し、DB に送信します。

これは、INSERT をプロセスにアウトソーシングするジョブ全体が DB に送信するよりもはるかに高速である場合にのみ役立ちます。そうでない場合、コストと問題が発生します (たとえば、アウトソーシング後、Web サーバーは DB が更新されたと認識しますが、実際にはそうではなく、死神がそれに到達するまでの(少し?) 時間はありません)利点を上回ります。

リーパー プロセスが過負荷の場合に Web サーバーを調整または停止できる場合、プロセス全体の回復力を高めることができます。インバウンド率はそれ以上。その後、繰り返しごとに、死神プロセスはキューが長くなっていることを認識します。特定の制限を超えると、プロセスはフラグを設定して、新しいユーザーがエラー メッセージを受け取り、それ以上の挿入を生成できないようにする場合があります。

インバウンド > アウトバウンドの状況では、とにかく何かが発生するので、少なくともこの方法で既存の接続を保護し、「ソフト フェイル」モードを提供します。

共有メモリを使用してローカル キャッシュを実装することもできます。各 PHP プロセスは、INSERTS を共有メモリに配置します (ロック付き!)。待機中のタプルが X 個を超える場合、または古いタプルが Y 秒よりも古い場合、すべてのタプルは MySQL に送信される単一の INSERT に結合され、キャッシュは空になります。このようにして、プロセス全体が非常に軽量になり、ネットワークを使用せず (ただし、メモリは少し)、MySQL の負荷が大幅に減少します。結合された INSERT は、個別の INSERT よりも 100 倍速くなり、インデックスの無効化/有効化のトリックも使用できます。

于 2012-07-06T13:47:12.493 に答える