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