项目总结(四)邮件订阅

理想需求:

  1、订阅用户可以自定义发送时间,发送动态模板和数据。

  2、订阅服务化,为需要的系统开发者提供最通用编辑的使用方式。

技术实现:

  相关模块工具: pm2node-schedule,  nodemailermysql,  sequelize

  一个数据库表,保存订阅任务的配置信息,包括发送时间,主题,收件人,邮件模板和数据等;一个更新订阅任务列表的定时任务mainSchedule;为每个订阅任务生成定时事务的方法createMailSchedule。

  每次服务器重启调用mainSchedule,启动轮询数据库列表的定时任务;每次任务,先取消掉旧的邮件任务,查询数据库列表,使用createMailSchedule方法创建新的邮件发送任务。

过程问题:

  1、 邮件发送数据为动态更新的数据,数据库表内的保存信息如何实现

  2、 定时任务跟随服务器自动启动

  3、 服务器重启过程、更新订阅任务过程错过邮件发送时间

  4、多进程,多服务器的环境重复发送邮件

解决方案:

  1、 邮件发送的内容需要动态生成,需要由使用订阅服务的开发自行开发,数据库表存储的需要是一个可调用的接口信息,由回调返回值组装邮件内容。

  2、 最初的定时任务是使用服务器linux的定时任务设置,每天定时调用更新订阅服务的接口。不用担心服务器重启的问题。使用node-schedule后,定时任务需要依赖node进程,在服务启动脚本代码执行完成后,调用更新订阅任务的启动controller。

  3、 订阅服务要减少不必要的发布重启,pm2 reload命令可实现零秒重启,降低重启的影响。

  

  更新订阅任务的轮询时间可以与订阅任务的时间点错开,比如订阅任务都是整点执行,更新订阅任务就避开整点来执行。

  4、 多种原因会造成重复发送邮件。

  每次订阅任务更新前,都要调用cancel方法确认取消掉旧的定时任务;

 

  开始订阅任务和业务代码是放在一起的,Pm2守护进程多半会根据CPU的核数开启多个进程。导致每个独立的进程都会启动订阅任务,需要在识别不同的进程,只允许启动一个定时事务。

  使用NODE_APP_INSTANCE环境变量可以实现在一个服务器应用内的识别不同进程但是如果扩展到多台服务器应用,又会出现重复

  

  应该将订阅任务从业务站点分离出来,单独启动一个服务,同时使用pm2进行管理,才是可行方案。继续使用环境变量区分测试与生产环境,避免出现不同环境造成的重复。

posted @ 2019-06-29 16:27  最是少年时  阅读(504)  评论(0)    收藏  举报