我必须使用 AWS SES 发送大量电子邮件(比如每个工作 10,000 封)。找到了一个关于如何并行执行的很棒的博客,现在有一个关于如何将发送事务数据写入数据库的问题。我正在使用 npoco ORM 和 InsertBulk,从我粗略的看,它打开一个连接并通过迭代每个 poco 来插入,然后关闭连接。缺少每次发送的打开、写入和关闭,这是一个进步。我的想法是将数据库操作保持在最低限度,但我应该每隔 50 左右的电子邮件发送一次写入数据库,以防服务器或作业中断,该作业稍后可以从中断的地方继续,而不会发送重复等.
所以我开始使用 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);
}
});