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());