Asp.Net Chat サーバー側ポーリング
-
19-09-2019 - |
質問
こんにちは、
Cometを使ったチャットアプリを実装しました。新しいメッセージが到着するまで、リクエストはサーバー上で「ハング」します。その後、新しいメッセージとともにクライアントに戻り、再びサーバーに送信されます。
私の問題は次のとおりです。
新しいメッセージを確認するために、600 ミリ秒ごとにデータベースをポーリングします。単純なクエリ「select...frommessages where messageId > ' + lastMessageId」を実行します。
さらに、存在感を維持するために、各ユーザーが「lastKeepalivetime」を使用して、データベースを非常に(非常に)非常によく更新します。
SQL Server のトランザクション ログが膨大になり、ある時点でチャット アプリケーションが動作しなくなってしまいます。
チャット ユーザーは登録ユーザーではなく、いつでもページから離れることができるランダムなユーザーです。
ヤロンに感謝します
解決
あなたは最後のキープアライブについては、一般的なキャッシュオブジェクトを使用してもらえますか?それは情報のその少量のように思える、あなたは、SQLの更新プログラムの多くを避けることができます。
他のヒント
トランザクション ログが制御不能にならないようにする方法は次のとおりです。 http://support.microsoft.com/kb/873235
この記事のオプションには次のものが含まれます。
- シュリンクを行っています。
- ログサイズの変更。
- 自動拡張の構成。
- 復旧モデルの変更。
- ログファイルを定期的にバックアップします。
もっと。
補足として、アプリケーション状態にオブジェクトとして保存するユーザーとその最終アクティビティ日のリストを設定することは価値があるかもしれません。この方法でアクセスするほうが早くなり、値を保持する頻度を減らすことができます。
シンプルモードにフルモードのトランザクション・ログからの切り替えは、あなたのログの増加の問題を解決する必要があります。
しかし、私はまた、スケーラブルではありませんので、それは、あなたができる場合は、ポーリングを避けるために、一般的に良いアイデアだということを追加する必要があります。あなたは、Service BrokerのかSqlDependency
を使用してイベント駆動型モデルへの切り替えを検討してください。キープアライブするために他のアプローチもあります。