【发布时间】:2016-06-28 07:01:26
【问题描述】:
我必须使用 AWS SES 发送大量电子邮件(比如每个工作 10,000 封)。找到a great blog 了解如何并行执行此操作,现在有一个关于如何将发送事务数据写入数据库的问题。我正在使用 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);
}
});
【问题讨论】:
-
如果您为每封电子邮件生成一个唯一的 ID,这样它就不会在数据库中重复,并且还知道上次它在哪里被遗漏了。我肯定会在数据库应该很快..所以每发送 50 封电子邮件插入应该在一个线程中快速完成..
标签: .net amazon-web-services npoco amazon-ses