6

現在データベースに使用mysqldbしていますが、リアルタイムのメッセージング機能を統合する必要があります。chat demoTornadoが提供するものはデータベースを実装していません(一方、実装してblog ます)。

このメッセージングサービスは、将来的には電子メールとしても機能します(Facebookのメッセージサービスの仕組みなど。チャットプラットフォームも電子メールです)。とにかく、現在の最初のチャットバージョンを拡張できるようにしたいと思います。電子メールとして機能するには、全体として、メッセージをデータベースに保存する必要があります。

これは次のような単純なものです。送信されるすべてのチャットメッセージについて、データベースにクエリを実行し、ユーザーの画面にメッセージを表示します。または、この方法はサーバーの負荷が高く、最適化が不十分になる傾向がありますか?これを機能させるには、「インフラストラクチャ」をどの程度正確に構成する必要がありますか?

(この質問に固有の主観性についてお詫びしますが、「2回測定し、1回コーディングする」ことを好みます。)

入力、例、およびリソースを高く評価します。
よろしく。

4

1 に答える 1

14

Tornadoは、シングルスレッドのノンブロッキングサーバーです。

これが意味するのは、メインスレッドでブロッキング呼び出しを行うと、最終的にパフォーマンスが低下するということです。各データベース呼び出しは20ミリ秒間しかブロックされない可能性があるため、最初は気付かないかもしれません。ただし、1秒あたり200を超えるデータベース呼び出しを行うと、アプリケーションは事実上ロックされます。

ただし、これはかなりの数のDB呼び出しです。あなたの場合、200人が同じ秒でチャットメッセージを送信することになります。

おそらくやりたいことは、ノンブロッキングAPIでキューを使用することです。そのため、トルネードはチャットメッセージを受信します。別のプロセスでデータベースに保存するためにキューに入れてから、チャットメッセージを他のチャットメンバーに送り返します。

誰かがチャットセッションに接続するときは、以前のすべてのメッセージの要求をキューに送信する必要もあります。キューが応答すると、新しく接続したユーザーにそれらを送信します。

それはとにかく私が問題に取り組む方法です。

この質問と回答も参照してください:Python3のTornadoで非ブロッキングMySQL APIを使用するための提案はありますか?

トルネードはシングルスレッドであることを忘れないでください。すごい。そして、何千もの同時接続を処理できます。ただし、これらの接続の1つでコードが1秒間ブロックれた場合、その秒の間、他の接続に対して他に何も実行されません。

于 2013-03-15T21:43:58.780 に答える