我正在研究 Spring Boot。该场景是使用 java 邮件发件人实现的电子邮件发送,但问题是如果所有操作成功执行,rest api 必须发送电子邮件并在最后返回成功响应。但是,如果在发送邮件时发生异常,则 api 失败。为了避免这种情况,我想在新的执行者线程上发送电子邮件,这样它就不会影响 api 响应。但是发送电子邮件是必需的。我该如何处理这种情况。我可以使用任何队列发送电子邮件吗?但我不知道队列是否可行,那么发送邮件的最佳队列可能是哪个,或者是否有其他解决方案来处理这种情况? 任何建议如何实现这一目标?
我想尝试使用 rabbitMQ,但我不知道它是否能解决问题。
您所描述的方式似乎是在使用同步通信方式,这意味着 API 必须执行所有操作以及发送电子邮件,最后,如果一切顺利,则发送响应。我建议在发送电子邮件时使用异步通信方法。为此,您可以将电子邮件数据存储在任何数据库或任何消息代理服务(如 Kafka、RabbitMQ 等)中
假设您有服务 A,它公开了 API,它正在执行一些业务操作,一旦它们完成,您就可以将邮件存储到上述任何存储系统。
现在创建单独的微服务(我们将其命名为
mailing-service
),它将从您的邮件数据源(数据库或像kafka这样的消息传递系统)读取/获取电子邮件并发送电子邮件。
如果你去......
DB 存储 - 如果您像 MongoDB 一样使用 NoSQL DB,那么您可以使用它的功能之一,即
Change Streams
。 MongoDB Change Streams 允许应用程序访问实时数据更改;订阅单个集合、数据库或整个部署的所有数据更改,并立即对它们做出反应。阅读此处 - https://www.mongodb.com/developer/languages/java/java-change-streams/。它带有同步和异步两个版本以及 Soring 启动集成。
基于消息系统的存储 - 如果你使用事件流平台 Kafka,你可以使用
spring-kafka
并且 @KafkaListener 方法将自动接收事件(在你的情况下是邮件)。请记住,在 kafka 中,默认保留时间为 7 天,但它是可配置的。基于数据库的存储系统没有这样的限制。 Kafka 主题可能有多个分区以允许并行消费消息。