2

Twitter のようなアプリケーションでは、誰かがツイートを投稿すると、すべてのフォロワーを繰り返し処理し、タイムラインにツイートのコピーを作成します。似たようなものが必要です。フォロワーIDのリストがあると仮定して、ツイートIDを10/100/1000フォロワーに挿入する最良の方法は何ですか.

Azure Redis を使用して Azure WebJobs 内で実行しています。各 Web ジョブは、キューで受信されたツイートごとに自動的に作成されます。そのため、それぞれがフォロワーを通過してツイートを挿入する、約 16 の同時ジョブを同時に実行している可能性があります。私は、挿入の 99% が発生した場合、1 つまたはいくつかが失敗したために停止すべきではないと考えています。続行する必要がありますが、ログに記録します。

質問: 以下のように CreateBatch を実行する必要がありますか? 最新のツイートを最初に時系列の逆順に取得する必要がある場合は、問題ありませんか? パフォーマンス?

var tasks = new List<Task>();
var batch = _cache.CreateBatch();
//loop start
tasks.Add(batch.ListRightPushAsync("follower_id", "tweet_id"));
//loop end
batch.Execute();

await Task.WhenAll(tasks.ToArray());

a) しかし、何かが失敗した場合、どうすればキャッチできますか? キャッチしてみる?b) 各リストの合計 # をバッチでチェックインし、特定の # に達した場合に 1 つをポップアウトするにはどうすればよいですか? リストが > 800 の場合、LeftPop を実行したいのですが、バッチ内ですべてを実行する方法がわかりません。

サンプルを参照するか、ここにスニペットを用意してください。良い方法を見つけるのに苦労しています。どうもありがとう。

更新 @marcのコメントに基づいて、これは正しく見えますか?

        var tasks = new List<Task>();
        followers.ForEach(f =>
        {
            var key = f.FollowerId;
            var task = _cache.ListRightPushAsync(key, value);
            task.ContinueWith(t =>
            {
                if (t.Result > 800) _cache.ListLeftPopAsync(key).Wait();
            });
            tasks.Add(task);
        });
        Task.WaitAll(tasks.ToArray());
4

1 に答える 1

3
  1. CreateBatch はおそらく、あなたが思っていることをしません。それが行うことは、一連の操作を延期し、それらが単一の接続に対して連続して送信されるようにすることです-これが役立つ場合もありますが、それほど一般的ではありません-私なら個別に送信するでしょう. CreateTransaction (MULTI/EXEC) もあります、ここでは良い選択ではないと思います。
  2. それは、ポップしているデータを気にするかどうかによって異なります。そうでない場合: LTRIM と [L|R]PUSH のペアを送信して、追加する前にリストを (max-1) にトリムします。もう 1 つのオプションは Lua ですが、やり過ぎのようです。古いデータが必要な場合は、範囲クエリも実行する必要があります。
于 2015-05-06T17:10:50.040 に答える