AWS SES を使用して大量のメールを送信する必要があります (ジョブごとに 10,000 など)。並行して行う方法についてのすばらしいブログを見つけたので、送信トランザクション データを DB に書き込む方法について質問があります。私は npoco ORM と InsertBulk を使用しています。これは、ざっと見てから、接続を開き、各 poco を反復して挿入し、接続を閉じます。送信ごとの開始、書き込み、および終了を除いて、これはステップアップです。ここでの私の考えは、DB操作を最小限に抑えることですが、サーバーまたはジョブの中断が発生した場合に備えて、50回程度の電子メール送信ごとにDBに書き込む必要があります。ジョブは、重複を送信せずに中断したところから再開できます。 .
そのため、ConcurrentBag、スレッドロック、リストへの変換、そのリストを npoco に送信して挿入するなどの使用を開始しました。非常に限定的にテストされ、動作します。しかし、それは適切な方法ではないと確信しており、ここで適切にスレッド化を使用している自信がありません。このシナリオでの提案は何ですか? 挿入のために、concurrentbag を npoco に渡す方がよいか、実行可能でしょうか。他の挿入方法はありますか?
var bag = new ConcurrentBag<EmailSent>();
Parallel.ForEach(recipients.AsParallel(), new ParallelOptions { MaxDegreeOfParallelism = maxParallelEmails },
recipient =>
{
var response = client.SendEmail(request);
bag.Add(new EmailSent() { JobId = jobId, MessageId = response.MessageId});
}
lock (syncRoot)
{
count++;
if (count % 50 == 0 || count == recipients.Count)
{
var list = new List<EmailSent>();
while (!bag.IsEmpty)
{
EmailSent email;
if (bag.TryTake(out email))
{
list.Add(email);
}
}
repo.InsertBulk<EmailSent>(list);
}
});