【发布时间】:2019-03-21 14:28:13
【问题描述】:
我们的是 Spring Boot 应用程序,我们通过调用 Exchange 服务器向我们的供应商发送电子邮件,但在某些时候我们收到了许多请求并且我们发送了如此多的电子邮件,以至于电子邮件服务器抛出错误,例如超出速率限制和连接重置,连接关闭,
谁能建议如何克服这个问题?我们无法控制电子邮件服务器,我们只是使用电子邮件服务器。
即使我们收到了这么多客户的请求,如何在缓慢的阶段发送电子邮件?
【问题讨论】:
-
我认为你需要实现一些队列机制。例如卡夫卡。收集所有对 kafka 主题的邮件请求,并通过预定作业进行处理。
-
无需拖入大锤(Kafka)来破解这样的小问题。将您的电子邮件任务交给
ThreadPoolExecutor,其中一个线程由DelayQueue支持。您所要做的就是计算添加的每个项目的最佳延迟,这样您就不会超过您的速率限制。 -
@AndyBrown,您能提供详细信息吗?还有一个疑问,如果应用程序在两者之间重新启动并且我们使用 ThreadPoolExecutor ,那么所有待处理的请求都将丢失,我是否正确,那么这是一个大问题,我是否正确?
-
是的,如果应用程序重新启动并且您的请求未序列化,那么您将丢失队列中的任何请求。如果这对您很重要,那么您始终可以使用持久存储(例如数据库或磁盘上的文件)来支持您的队列。这是额外的工作,但总成本可能比告诉您的生产支持团队他们现在必须支持作为依赖项引入的大型第三方消息传递系统。
标签: java spring spring-boot