SpringBoot开发案例之整合mail队列篇
2017-09-10 00:00
323 查看
摘要:前言 前段时间搞了个SpringBoot开发案例之整合mail发送服务,也是基于目前各项目平台的邮件发送功能做一个抽离和整合。 问题 以发送方为例,比如网易的反垃圾邮件政策,过多或者频率过快的发送都会被判定为垃圾邮件,即使发再多的邮件也无济于事。
前言
前段时间搞了个SpringBoot开发案例之整合mail发送服务,也是基于目前各项目平台的邮件发送功能做一个抽离和整合。
以接收方邮件为例,比如腾讯邮箱就有类似说明:如果内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件,也就通过不了收件方的"安检",如下图:
方案
为了解决以上实际场景中遇到的问题,使得其更像一个安全高效的邮件服务平台,我们尝试引入了任务队列对邮件发送进行流量削锋、间隔发送以及重复内容检测。
首先,我们先建一个队列MailQueue:
如文章开头图片所描述,这里我们还需要建一个消费线程池ConsumeMailQueue:
改造service:
部分接口:
部分实现:
队列说明
以上代码,大家可以看到我们有使用到了linkedblockingqueue来实现邮件发送队列。
LinkedBlockingQueue作为一个阻塞队列是线程安全的,同时具有先进先出等特性,是作为生产者消费者的首选。
LinkedBlockingQueue可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE。
其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
最后给大家补充一个非阻塞队列ConcurrentLinkedQueue,有兴趣的同学可以自行查阅资料。
分享总结
如果,你看到你写的代码是一坨屎的时候你就该去优化她了,好好爱护她,未来的你会为昨天的你而感到骄傲的。
其实,想表达的是,架构优化是无止境的,随着业务的增长以及平台的发展,我们会遇到各种各样的问题。
1. 邮件服务挂了,队列还没消费完怎么办?
2. 邮件服务挂了,我们是否应该做个高可用?
3. 邮件服务爆了,我们是否应该做个负载均衡?
以上问题,你又会怎么解决呢?下一篇为大家带来高可用的邮件服务平台。
项目案例:码云
作者: 小柒
分享是快乐的,也见证了个人成长历程。文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
本文版权归作者和云栖社区所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。
前言
前段时间搞了个SpringBoot开发案例之整合mail发送服务,也是基于目前各项目平台的邮件发送功能做一个抽离和整合。问题
以发送方为例,比如网易的反垃圾邮件政策,过多或者频率过快的发送都会被判定为垃圾邮件,即使发再多的邮件也无济于事。当然如果是自建邮件服务器,也是要考虑发送服务的并发能力。以接收方邮件为例,比如腾讯邮箱就有类似说明:如果内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件,也就通过不了收件方的"安检",如下图:
方案
为了解决以上实际场景中遇到的问题,使得其更像一个安全高效的邮件服务平台,我们尝试引入了任务队列对邮件发送进行流量削锋、间隔发送以及重复内容检测。首先,我们先建一个队列MailQueue:
如文章开头图片所描述,这里我们还需要建一个消费线程池ConsumeMailQueue:
改造service:
部分接口:
部分实现:
队列说明
以上代码,大家可以看到我们有使用到了linkedblockingqueue来实现邮件发送队列。LinkedBlockingQueue作为一个阻塞队列是线程安全的,同时具有先进先出等特性,是作为生产者消费者的首选。
LinkedBlockingQueue可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE。
其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
最后给大家补充一个非阻塞队列ConcurrentLinkedQueue,有兴趣的同学可以自行查阅资料。
分享总结
如果,你看到你写的代码是一坨屎的时候你就该去优化她了,好好爱护她,未来的你会为昨天的你而感到骄傲的。其实,想表达的是,架构优化是无止境的,随着业务的增长以及平台的发展,我们会遇到各种各样的问题。
1. 邮件服务挂了,队列还没消费完怎么办?
2. 邮件服务挂了,我们是否应该做个高可用?
3. 邮件服务爆了,我们是否应该做个负载均衡?
以上问题,你又会怎么解决呢?下一篇为大家带来高可用的邮件服务平台。
项目案例:码云
作者: 小柒
分享是快乐的,也见证了个人成长历程。文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
本文版权归作者和云栖社区所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。
相关文章推荐
- SpringBoot开发案例之整合mail队列篇
- SpringBoot开发案例之整合Kafka实现消息队列
- SpringBoot开发案例之整合mongoDB
- SpringBoot开发案例之整合Swagger篇
- SpringBoot开发案例之整合Dubbo消费者
- SpringBoot开发案例之整合mail发送服务
- 7月20日云栖精选夜读:SpringBoot开发案例之整合mongoDB
- SpringBoot开发案例之整合Dubbo提供者(一)
- SpringBoot开发案例之整合Dubbo提供者(二)
- SpringBoot开发案例之整合Quartz任务管理系统
- SpringBoot开发案例之整合mongoDB
- SpringBoot开发案例之整合Dubbo提供者(一)
- 详解SpringBoot开发案例之整合定时任务(Scheduled)
- SpringBoot开发案例之整合Spring-data-jpa进阶篇
- 《实战突击 ASP.NET项目开发案例整合》pdf电子书免费下载
- 实战突击:PHP项目开发案例整合(第2版)
- Spring整合RabbitMQ进行消息队列开发
- SpringBoot开发案例之整合Swagger篇
- Ssh整合开发介绍和简单的登入案例实现
- Ssh整合开发介绍和简单的登入案例实现