关于给用户发送邮件的一些问题


现在要给全部用户或者指定用户发送邮件,“发送”操作是由我们后台人员触发的。

发送操作提交后,我们就要给用户发送了,在发送过程中可能会存在一个问题,就是发送了一段时间后,程序因某些原因死掉了,这样就导致一些用户没有收到邮件,所以我的想法是发送前先把数据库里的用户全写入到一个文件中,发送时从文件中取用户,然后再弄个用户发送日志以记录哪些用户发送了,这样出问题后,可以从出问题的“那个地方”接着执行发送.....

不知道我的想法行不行,另外我担心“把数据库中的用户写入到文件中”这个过程所花费的时间会很长,从而导致性能上会存在隐患。谢谢大家讨论我的想法,给些意见或指点!

Redis memcached php mysql nginx

爱笑的有希 11 years, 4 months ago

还有什么呢,继续吧...

liege answered 11 years, 4 months ago

我的做法是邮件队列,放redis,crontab每分钟发送,脚本起来的时候发现上个脚本还在跑就退出,为了避免异常,脚本最多执行110秒。做好失败的监控,没啥问题。

sad十大 answered 11 years, 4 months ago

@舞林 同学的想法有点相似:

  • 把待发的邮件,存储到列表( Lists )中,通过 lpush 插入到 Redis 消息队列中
  • 负责发送邮件的代码中通过 BRPOP 依次消息队列中的内容并进行处理,如果没有新邮件则会阻塞等待直到有新的消息

这样的话不管程序死掉或者什么原因都不会千万消息丢失,同时也可以不用另外加一个定时任务


相比于写文件或者是其它的方法, Redis 是目前最合适的

Redis是一个开源、支持网络、基于内存、键值对存储数据库

参考: http://zh.wikipedia.org/zh/Redis

和谐的BB answered 11 years, 4 months ago

Your Answer