問題タブ [azure-redis-cache]

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.

0 投票する
1 に答える
2003 参照

azure - Azure 上の StackExchange.Redis は、get の実行中にタイムアウトが発生し、使用可能な接続がないという例外をスローしています

最近、データ フィードと動的に生成されたイメージ (6k rpm スループット) を提供する MVC アプリケーションを v3.9.67 ServiceStack.Redis クライアントから最新の StackExchange.Redis クライアント (v1.0.450) に切り替えましたが、パフォーマンスが低下したり、パフォーマンスが低下したりしています。新しい例外。

私たちの Redis インスタンスは S4 レベル (13GB) で、CPU はほぼ一定の 45% 程度を示し、ネットワーク帯域幅はかなり低く見えます。Azure portal の取得/設定グラフを解釈する方法は完全にはわかりませんが、約 100 万回の取得と 100,000 セットを示しています (これは 5 分刻みのようです)。

クライアント ライブラリの切り替えは簡単で、現在も v3.9 ServiceStack JSON シリアライザーを使用しているため、クライアント ライブラリのみが変更されています。

New Relic を使用した外部モニタリングでは、平均応答時間が ServiceStack ライブラリと StackExchange ライブラリの間で約 200 ミリ秒から約 280 ミリ秒に増加していることが明確に示されています (StackExchange の方が遅い)。

次の行に沿ったメッセージで多数の例外を記録しました。

GET フィード チャネルの実行タイムアウト:ag177kxj_egeo-_nek0cew、inst: 12、mgr: 非アクティブ、キュー: 30、qu=0、qs=30、qc=0、wr=0/0、in=0/0

これは、送信されたが Redis からの応答がないキューに多数のコマンドがあり、タイムアウトを超える長時間実行されているコマンドが原因である可能性があることを意味すると理解しています。これらのエラーは、データ サービスの 1 つの背後にある SQL データベースがバックアップされている期間に表示されたので、おそらくそれが原因でしたか? そのデータベースをスケールアウトして負荷を軽減した後、このエラーはそれほど多くは見られませんでしたが、DB クエリは .Net で発生しているはずであり、それがどのように redis コマンドまたは接続を保持するのかわかりません。

また、今朝の短い期間 (数分) で、次のようなメッセージを含む大量のエラーを記録しました。

この操作を処理するための接続がありません: SETEX feed-channels:vleggqikrugmxeprwhwc2a:last-retry

ServiceStack ライブラリで一時的な接続エラーに慣れていましたが、これらの例外メッセージは通常次のようなものでした。

接続できません: sPort: 63980

SE.Redis がバックグラウンドで接続とコマンドを再試行する必要があるという印象を受けました。独自の再試行ポリシーで SE.Redis を介して呼び出しをラップする必要がありますか? おそらく、別のタイムアウト値の方が適切でしょう (ただし、どの値を使用すればよいかわかりません)。

Redis 接続文字列は次のパラメーターを設定します: abortConnect=false,syncTimeout=2000,ssl=true. のシングルトン インスタンスConnectionMultiplexerと一時的なインスタンスを使用しますIDatabase

Redis の使用の大部分は Cache クラスを経由します。実装の重要な部分を以下に示します。

通常、キーは 10 ~ 30 程度の文字列です。値は大部分がスカラーまたは適度に小さいシリアル化されたオブジェクト セット (通常は数百バイトから数 kB) ですが、キャッシュには jpg 画像も格納するため、データの大きなチャンクは数百 kB から数 MB になります。

おそらく、小さな値と大きな値には異なるマルチプレクサを使用し、大きな値にはタイムアウトを長くする必要がありますか? または、1 つが機能停止した場合に備えて、複数のマルチプレクサを結合しますか?

0 投票する
10 に答える
74970 参照

c# - redis サーバーに接続できませんでした。切断されたマルチプレクサを作成するには

Azure Redis キャッシュに接続するための次のコードがあります。

そして、私はそれをこのように使用します

ただし、1日に1〜2回、次の例外が発生します。

追加情報: redis サーバーに接続できませんでした。切断されたマルチプレクサを作成するには、AbortOnConnectFail を無効にします。PING で UnableToResolvePhysicalConnection

問題は、キャッシュ接続が失敗した場合にデータベースにアクセスするようにこのコードをリファクタリングするにはどうすればよいかということです。

0 投票する
3 に答える
2670 参照

.net - StackExchange.Redis 経由で Azure Redis に再接続できません

警告: わかりましたので、これは奇妙なものであり、SO が適切な場所であるかどうかはわかりません。

Azure Redis Cache インスタンスに接続する Azure Web サイトがあります。(StackExchange.Redis を使用)

すべてが素晴らしかったのですが、ある日、Web サイトが Redis に接続できなくなりました。

エラー:

redis サーバーに接続できませんでした。切断されたマルチプレクサを作成するには、AbortOnConnectFail を無効にします。PING での SocketFailure

ここに私の接続文字列があります:

mycache.redis.cache.windows.net,ssl=true,パスワード=xxxxxx,syncTimeout=5000

私の診断手順は次のとおりです。

  1. ローカルから Azure Redis に接続してみてください。結果: 成功 (つまり、コードは適切ですか?)
  2. 新しい Azure Redis インスタンスを試してスピンアップし、Azure から接続します。結果: 不合格 (Web サイトが Azure Redis インスタンスに接続できない場合)
  3. 既存の Redis キャッシュを指す、エラー コードと同じコードを使用して、新しい Azure Web サイトをスピンアップします。結果: 成功 (うーん、何?)
  4. 新しい MVC Web サイトをファイルし、StackExchange.Redis を追加し、新しい Azure Web サイトにデプロイして、Redis に接続します。結果: 成功 (つまり、Redis は優れているのでしょうか?)
  5. 上記のバニラ MVC Web サイトを既存のAzure Web サイトにデプロイします (コード 4 と同じで、同じ Redis に接続します。違いは、古い Azure Web サイトの物理マシン/ネットワークを使用していることだけです)。結果: 失敗 (wtf ??)

では、Redis が Azure Web サイトを「ブラックリストに載せた」と考えているのでしょうか? (それも可能ですか?)クライアント(私のコード) が再接続しようとしないことはわかっていますが、サイトを何度もバウンスしましたが、Redis に再接続できません。

同じ Redis インスタンスに接続する同じコードを使用して新しいAzure Web サイトをスピンアップすると成功するという事実は、Azure/Redis で何らかのブラックリスト/ルーティングの問題が発生したことを示しています。

何か案は?

編集

問題は Azure VNET にあるようです。私の Web サイトが Azure Virtual Network の一部である場合、Redis に接続できません。しかし、ネットワークから外すと、問題なく接続されます。今日まで、このセットアップは正常に機能していました。

VNET 内の Web サイトが Azure Redis に接続できないように、Azure が変更を行ったのではないでしょうか? (意味がわからない)

編集2

Redis 接続試行のログが添付されています。

例外: redis サーバーに接続できませんでした。切断されたマルチプレクサを作成するには、AbortOnConnectFail を無効にします。SocketFailure on PING connection-string-removed :6380,password= password-removed ,ssl=True Connecting connection-string-removed :6380/Interactive... BeginConnect: connection-string-removed :6380 1 つの一意のノードが指定されました タイブレークを要求していますfrom connection-string-removed :6380

__Booksleeve_TieBreak... エンドポイント 00:00:05 の応答を許可しています... タスクの完了を待機中、IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=4,Free=32763 ,Min=1,Max=32767) すべてのタスクが正常に完了したわけではありません, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min=1, Max=32767) connection-string-removed :6380 が応答しませんでした タスクの完了を待っています、IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min =1,Max=32767) すべてのタスクが正常に完了したわけではありません。IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min=1,Max= 32767) connection-string-removed : 6380 の指定に失敗しました (WaitingForActivation) マスターが検出されませんでした connection-string-removed:6380: スタンドアロン v2.0.0、マスター。キープアライブ: 00:01:00; int: 接続中。サブ: 接続中; 使用されていません: DidNotRespond接続文字列が削除されました:6380: int ops=0、qu=2、qs=0、qc=0、wr=0、socks=1; サブ ops=0、qu=0、qs=0、qc=0、wr=0、socks=1 循環 op-count スナップショット。int: 0 (0.00 ops/s; スパン 10 秒); サブ: 0 (0.00 ops/s; スパン 10 秒) 同期タイムアウト: 0; 発射して忘れる: 0; 最後のハートビート: -1 秒前に失敗した接続をリセットして再試行しています... 再試行しています。残りの試行回数: 2... 1 つの一意のノードが指定されました 接続文字列からタイブレークを要求してい ます-削除:6380 > __Booksleeve_TieBreak... エンドポイント 00:00:05 の応答を許可しています... タスクの完了を待っています。IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=6, Free=32761,Min=1,Max=32767) すべてのタスクが正常に完了したわけではありません, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free=32760,Min =1,Max=32767) connection-string-removed :6380 が応答しませんでした タスクの完了を待っています、IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free= 32760,Min=1,Max=32767) すべてのタスクが正常に完了したわけではありません, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free=32760,Min=1 、最大 = 32767)接続文字列が削除されました: 6380 指名に失敗しました (WaitingForActivation) マスターが検出されませんでした 接続文字列が削除されました:6380: スタンドアロン v2.0.0、マスター。キープアライブ: 00:01:00; int: 接続中。サブ: 接続中; 使用されていません: DidNotRespond接続文字列が削除されました:6380: int ops=0、qu=2、qs=0、qc=0、wr=0、async=3、socks=2; サブ ops=0、qu=0、qs=0、qc=0、wr=0、socks=2 循環 op-count スナップショット。int: 0 (0.00 ops/s; スパン 10 秒); サブ: 0 (0.00 ops/s; スパン 10 秒) 同期タイムアウト: 0; 発射して忘れる: 0; 最後のハートビート: -1 秒前に失敗した接続をリセットして再試行しています... 再試行しています。残りの試行: 1... 1 つの一意のノードが指定されました接続文字列からのタイブレークを要求しています-削除:6380 > __Booksleeve_TieBreak... エンドポイント 00:00:05 が応答できるようにしています... タスクの完了を待っています、IOCP: (Busy=0 ,Free=1000,Min=1,Max=1000), WORKER: (Busy=8,Free=32759,Min=1,Max=32767) EndConnect: connection-string-removed :6380 (ソケットのシャットダウン) Connect complete: connection-string-removed :6380 すべてのタスクが正常に完了、IOCP: (Busy=0,Free=1000,Min=1,Max=1000)、WORKER: (Busy =11,Free=32756,Min=1,Max=32767) connection-string-removed :6380 faulted: SocketFailure on PING タスク完了待ち, IOCP: (Busy=0,Free=1000,Min=1,Max=1000) , WORKER: (Busy=11,Free=32756,Min=1,Max=32767) すべてのタスクが正常に完了したわけではありません, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy =7,Free=32760,Min=1,Max=32767) connection-string-removed : 6380 の指定に失敗しました (WaitingForActivation) マスターが検出されませんでした connection-string-removed:6380: スタンドアロン v2.0.0、マスター。キープアライブ: 00:01:00; int: 接続中。サブ: 接続中; 使用されていません: DidNotRespond接続文字列が削除されました:6380: int ops=0、qu=2、qs=0、qc=0、wr=0、async=7、socks=3; サブ ops=0、qu=0、qs=0、qc=0、wr=0、socks=3 循環 op-count スナップショット。int: 0 (0.00 ops/s; スパン 10 秒); サブ: 0 (0.00 ops/s; スパン 10 秒) 同期タイムアウト: 0; 発射して忘れる: 0; 最後のハートビート: -1 秒前

誰でもこれを解読できますか?

0 投票する
1 に答える
1236 参照

c# - TimeSpan.MaxValue の有効期限が指定されている場合でも、HashSet が Redis Cache から削除される

StackExchange.Redis クライアントを使用して Azure Redis Cache にアクセスしています。以下のようにハッシュセットを作成しています。

有効期限を TimeSpan.MaxValue として指定していますが、ハッシュセットは数分間使用されないと削除されます。

私は何が欠けていますか?

0 投票する
1 に答える
32947 参照

c# - タイプ 'System.Runtime.Serialization.SerializationException' の例外が mscorlib.dll で発生しましたが、ユーザー コードで処理されませんでした

次のオブジェクトがあります。

そして、このメソッドを使用して、割り当てられたモジュールごとに特定のキーをキャッシュしています。

初めて機能するときはもちろん、DBからデータを返します。しかし、2 回目 (キャッシュにオブジェクトがあります) ですが、モジュールのリストは null です。

http://screencast.com/t/OFB1vkvno

また、stackexchange redis キャッシュからのこのヘルパー クラスもあります。

SEEDのために関連するデータがあることは知っています:

アップデート1:

これは、キャッシュされた値を 2 回目に取得しようとしたときに発生するエラーです。

タイプ 'System.Runtime.Serialization.SerializationException' の例外が mscorlib.dll で発生しましたが、ユーザー コードで処理されませんでした

スタックトレース