Reb*_*cca 8 c# performance multithreading producer-consumer amazon-web-services
我已经构建了一个应用程序,通过Amazon SES为网站发送电子邮件邮件.它用C#编码.
每封电子邮件需要0.3秒才能通过Amazon SES API发送.这意味着,使用单线程应用程序,我每秒只能发送3封电子邮件.
我已经实现了一个生产者/消费者,多线程应用程序,其中1个生产者用于查询为每个客户定制电子邮件,25个消费者从队列中提取并发送电子邮件.
我的多线程应用程序每秒发送12封电子邮件(速度提高四倍).我原本预计25线程应用程序的速度会有更大的提升.
我的问题是:我能在单处理器机器上真正加快发送邮件的速度吗?我的收益是否合理,或者我的速度问题更可能是由于编码而不是计算机无法快速处理电子邮件?
提前致谢!
更新:如果其他人面临同样的问题....连接到AWS以发送电子邮件需要花费大量时间.AWS Developer论坛上的以下主题提供了一些见解(您可能需要向下滚动才能获得更有用的帖子).
我的问题是:在单处理器计算机上我真的可以将邮件发送速度加快多少?我的收益看起来是否合理,或者我的速度问题更有可能是由于编码而不是计算机无法更快地处理电子邮件?
一般来说,线程数增加 25 倍而速度提高 4 倍并不算离谱,但也不是很好。
只有当你的CPU使用率很高时,单个CPU才会成为瓶颈。您可以通过查看应用程序运行时的总 CPU 使用情况来判断这是否是您的问题。理论上,发送批量电子邮件应该是 I/O 受限的操作;如果您的情况并非如此,那么您的代码可能有问题。
虽然我没有使用过 Amazon SES,但我知道其他 Amazon 产品肯定会使用各种形式的带宽/请求限制。您的吞吐量可能更多地受到亚马逊的限制,而不是您的应用程序的限制。
我不久前编写了一个高性能的批量邮件应用程序,我所做的是:
SmtpClient
类(它有一个SendAsync
方法)来实际发送邮件。这种方法还可以让我在发送邮件时查看并记录错误,从而为用户提供更好的反馈。另一种方法是依靠从网关服务器接收和解析错误邮件,至少可以说,这很容易出错。