問題タブ [servicestack.redis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 実行時間の長いサブスクリプション スレッド内で例外を処理して回復する方法
これらのアプリケーション間の基本的なメッセージングを容易にするために、いくつかの ASP.NET MVC アプリケーション内で ServiceStack.Redis を使用しています。1 つのアプリケーション内に、サブスクリプションを設定し、アプリケーションが関心のあるメッセージを処理するクラスがあります。たとえば、次のようになります。
「SubscribeToChannels」はブロックされているため、別のスレッドで実行しています。MVC アプリケーションが実行されている間ずっとこのスレッドを存続させたいのですが、なんらかの例外が発生した場合にスレッドが停止するか、Redis への接続が停止するのではないかと懸念しています。
私の質問は、サブスクリプションが開いている間に発生する可能性のある例外 (接続障害、タイムアウトなど) から回復する方法の例はありますか?
logging - ServiceStack.Redis で実行された redis コマンドを表示するには?
ServiceStack.Redis が内部で何をしているのかをよりよく理解したいと思います。デバッグ/コンソール ロガーを接続して、実行されたコマンドをそのロガーに出力することを望んでいましたが、適切な API を見つけることができませんでした。using に関するいくつかの参照が見つかりましLogManager.LogFactory = new DebugLogFactory
たが、これを行った後でも、デバッグ出力に ServiceStack から何も表示されません。
また、redis-cli から MONITOR コマンドを使用してみましたが、次のエラーが発生するため、redis の Windows ポートを使用するときに問題があるようです: (error) ERR unknown command 'monitor'
.
c# - redis servicestack クライアント List.Remove(item) が機能しない
いつタスクを実行するか、タスクに必要な環境 (OS、ブラウザなど) などのタスク記述情報をユーザーが入力できるようにする「タスク制御システム」を開発しています。
「コントローラ」は、説明情報を保存し、タスクをスケジュールします。スケジュールされた時間になると、スケジューラはタスク情報を取得し、必要な環境に一致するリモート マシンのタスクを「キューに入れます」。
これに関する私の最初のカットでは、リレーショナル データベースを使用して、タスクの説明と、問題を追跡するのに十分な履歴情報 (約 2 週間分) を保持しました。しかし、これは「ビッグデータ」の問題ではなく、関係は単純であり、パフォーマンスを向上させる必要があります。
というわけで、もっと高性能なものを探しています。これにredisを使用しようとしていますが、いくつか問題があります。クライアントに ServiceStack.Redis バージョン 3.9.71.0 を使用しており、Redis 2.8.4 がサーバーです。
このサンプル コードは、Dan Swain のチュートリアルから抜粋したものです。ServiceStack.Redis クライアント v 3.9.71.0 で動作するように更新されました。ほとんどは機能しますが、「currentShippers.Remove(lameShipper);」動作しません。それがなぜなのか誰にもわかりますか?
ありがとう
これらのオーバーライドを「Shipper」クラスに追加して、問題を修正しました。
c# - ServiceStack.Text が辞書をシリアル化しない
ServiceStack.Redis を使用して辞書を含むオブジェクトを格納する際に問題が発生しています。保存しようとしているオブジェクトは、次のように定義されています。
ほとんどのオブジェクトは正しくシリアル化されますが、Dictionary プロパティ (ExtendedProperties) はシリアル化されません。
JsConfig.IncludePublicFields = true を設定しようとしましたが、違いはないようです。
私を最も混乱させているのは、辞書が時々シリアル化されているように見えることです(ほとんどの場合、デバッガーでコードをステップスルーしているように見えます)が、再現可能ではありません。
ディクショナリを正常にシリアル化する方法について何か提案はありますか (Newtonsoft.Json を使用してオブジェクトを見つめてシリアル化し、その指示を Redis に保存する以外に)
どうもありがとう、
リチャード。
performance - CPU が 100% のときに Redis のパフォーマンスを向上させる方法は? シャーディング?最速の .Net クライアント?
Web サイトの負荷が大幅に増加したため、redis サーバー インスタンスが (8 つのコアのうちの 1 つで) 100% の CPU に達し、タイムアウトが発生したため、redis は現在ピーク負荷に苦しんでいます。
クライアント ソフトウェアを ServiceStack V3 (BookSleeve 1.1.0.4 から) に更新し、redis サーバーを 2.8.11 (2.4.x から) にアップグレードしました。ServiceStack.Redis を使用するHarbour.RedisSessionStateStoreが存在するため、ServiceStack を選択しました。以前は BookSleeve と一緒に AngieList.Redis を使用していましたが、それでも 100% を経験しました。
マスター/スレーブ ツリーとして構成された 8 つの redis サーバーがあります。セッション状態のための1つのサーバー。その他はデータキャッシュ用です。それぞれ 2 つのスレーブに接続された 2 つのマスター/スレーブを持つ 1 つのマスター。
サーバーは、100% の CPU で詰まり始めるピーク時に約 600 のクライアント接続を保持します。
パフォーマンスを向上させるために何ができるでしょうか?
シャーディングおよび/または StackExchange Redis クライアント (私の知る限り、利用できるセッション状態クライアントはありません...)。
それとも他の何かでしょうか?セッション サーバーも 100% に達し、他のサーバーには接続されていません (データとネットワークのスループットが低い)。
更新 1: redis-cli INFO の分析
Redis 2.8 を一晩実行した後の INFO コマンドの出力を次に示します。
更新 2: temproxy (シャーディング)
temproxyという興味深いコンポーネントを発見しました。このコンポーネントは、私が理解しているように、複数の redis インスタンスにまたがってシャードすることができます。
これは CPU の負担を軽減するのに役立ちますか?
プログラミング時間は大幅に節約できますが、各サーバーに 3 つの追加インスタンスを構成するには、まだ多少の労力が必要です。ですから、作業を開始する前に、誰かがこの解決策を確認または暴言を吐いてくれることを願っています.
servicestack - ServiceStack - データベースとは異なるキャッシュからの DateTime SerializeFn
私の Servicestack アプリケーションでは、日時をデータベースから RFC3339 標準にシリアライズしようとしています。データベースに格納されている日時は現地時間です。私のアプリケーションでは、データベースは 2 つの異なる場所にあります。1 つはインドネシアで +7 オフセット、もう 1 つはマレーシアで +8 オフセットです。両方のデータベースには、それぞれ現地時間が保存されています。
同じアプリケーションを使用して、異なる場所から両方のデータベースにサービスを提供します。アプリケーションの現地時間はオフセット +8で、マレーシアにあります。
日時がインドネシアのデータベースからの場合、たとえば「2014-09-19 14:07:27.387」 (午後 2 時) の場合、オフセット +7 を「2014-09-19T14:07:27.3870000+07:00」に追加します(午後2時+7)。以下は、SerializeFn のコードです。
GetDateTimeOffset 関数のコード:
その後、Redis は値を"2014-09-19T14:07:27.3870000+07:00" (2pm+7) としてキャッシュしました。後続のリクエストは Redis のキャッシュ値から取得され、.NET アプリケーションはアプリケーションの現地時間に自動変換され、SerializeFn の前に「2014-09-19 15:07:27.387」 (午後 3 時、アプリケーションの現地時間はオフセット +8) になります。 .
datetime の時間が 1 時間増えました。同じ SerializeFn を経由するキャッシュからの出力値は「2014-09-19T15:07:27.3870000+07:00」 (3pm+7)
.NET での自動変換により、インドネシア +7 のキャッシュからの日時が数時間増加しました。
とにかく、SerializeFn のソースがどこにあるかを特定することはできますか? 私が正しい方法でやっているなら、誰かが私を導くことができますか? 前もって感謝します。
c# - PUBSUB を使用してサブスクライブすると PING できないのはなぜですか?
Azure での PUBSUB の使用に問題があります。
Azure ファイアウォールは、一定時間アイドル状態の接続を閉じます。時間の長さについては多くの議論がありますが、人々は約 5 ~ 15 分だと考えています。
Redis をメッセージ キューとして使用しています。これを行うために、ServiceStack.Redis ライブラリは、次のチャネルにサブスクライブする RedisMqServer を提供します。
バックグラウンド スレッドでは、ソケットからのデータの受信をブロックし、Redis からのメッセージの受信を待機します。問題は:
Redis メッセージを待機しているソケットが一定時間アイドル状態の場合、Azure ファイアウォールは接続をサイレントに閉じます。私のアプリケーションは、現在閉じられた接続を待機しているため、認識していません (関係する限り、開いています)。バックグラウンド スレッドは効果的にハングします。
メッセージを 1 分間待機するキープ アライブを実装することを考えていましたが、メッセージが受信されない場合は、次の 2 つの目標でサーバーに PING を実行します。
- この接続がまだ使用されていることを Azure に伝えて、接続を開いたままにします。
- 接続が閉じられているかどうかを確認し、閉じている場合は最初からやり直して再登録してください。
しかし、これを実装したところ、サブスクライブしている間は PING コマンドを使用できないことがわかりました?? これがなぜなのかはわかりませんが、誰かが別の解決策を持っていますか?
メッセージを見逃す可能性があるため、定期的に購読を解除して再購読したくありません。
次の記事を読みました: http://blogs.msdn.com/b/cie/archive/2014/02/14/connection-timeout-for-windows-azure-cloud-service-roles-web-worker.aspxこれは、Azure Load Balancer が 4 分後に接続を切断する方法について説明しています。しかし、接続を維持できたとしても、別の理由で接続が切断された場合 (redis ノードがダウンした場合)、サブスクリプションを再開するという 2 番目の目標を達成する必要があります。