2019独角兽企业重金招聘Python工程师标准>>>

系统需求

本文以Celery 实现分布式任务队列为基础,简述了一个邮件推送系统的模型。

Celery 是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农。

需求:

1.在邮件推送系统中,我们需要对成千上万的用户发送邮件,发送邮件具有时效性,即不能说今天开始发邮件,要等到明天才能发送完毕。

2.发送邮件过程中,可能会遇到过于频繁,邮件服务器上信件堆积无法及时接受新信件而产生的拒信,或者邮件服务器将我们的邮件判决为垃圾邮件。

3.邮件发送的 I/O 时间较长,不能让程序在等待邮件服务器返回消息上浪费时间。

所以我们的推送系统要有以下特性:1.分布式处理作业;2.闭环监控;3.异步式分发作业

系统框图

前端通过 ajax 调用 views 中的 callpush 接口,该接口将被推送用户的筛选条件传入 service,然后 service 请求数据库,将返回数据作为参数调用 celery 接口中 addtask 函数。celery 接口中 addtask 根据 action 参数来判断所要添加的任务类型,根据不同的类型分别进行处理,放入队列。

系统的另外一头,worker 从队列中取出任务,用 mail 函数推送邮件,如果发送失败就调用 error_handler 进行异常处理,此处我们将所有 task 的执行情况放入 redis 中,给每个任务进行标记,如果成功则标记为 1,失败则 0.

前端可以通过 ajax 调用 pushstatus 来向 redis 中读取任务执行情况,此处我们返回了成功和失败任务的个数。

伪代码实现

# Controller
from redis import StrictRedis
red = StrictRedis(host='localhost', port=6379, db=0)def callpush(request):area = request.POST.get('area')return HttpResponse(str(mailpush(area)))def pushstatus(request):failure = red.scard('status:0:task')success = red.scard('status:1:task')return HttpResponse('Failures: ' + str(failure) + '\nSuccess: ' + str(success))# Service
def mailpush(**kargs):targets = MtUser.objects.filter(kargs).values('username', 'address')addtask(action='mailpush', data=targets, content='Hello %s!', subject='Greetings')return len(targets)# Celery Interface (Dispatcher)
from celery import Celeryapp = Celery()
app.config_from_object('celeryconfig')def addtask(action, data, **kargs):if action == 'mailpush':for (address, username) in data:app.send_task('worker.mail', args=[kargs['subject'], kargs['content'] % username, address], link_error=app.signature('worker.error_handler'))elif action == 'messagepush':passelse:pass# Celery Backend (Worker)
from celery import Celery
from celery import Task
from redis import StrictRedisapp = Celery()
app.config_from_object('celeryconfig')
red = StrictRedis(host='localhost', port=6379, db=0)@app.task(bind=True)
def mail(self, subject, content, address):from django.core.mail import EmailMessagemsg = EmailMessage(subject, content, 'admin@admin.com', address)msg.content_subtype = 'html'msg.send()red.sadd('status:1:task', self.request.id)# Overwrite the on_failure function in trace.py
@app.task
def error_handler(uuid, args):print uuidprint argsred.set(uuid, args)red.sadd('status:0:task', uuid)red.srem('status:1:task', uuid)

转载于:https://my.oschina.net/shinedev/blog/500554

用 Celery 实现邮件推送系统相关推荐

  1. 钉钉一行代码_利用Python快速搭建钉钉和邮件数据推送系统

    前面的文章我们写到了利用Python实现钉钉和邮件的数据推送,在数据处理这一块实现了对mysql和odps的数据获取和处理,可以满足常规业务大部分数据场景需求,在一家初创公司数据基础建设还不完善的时候 ...

  2. 异步获取邮件推送结果

    邮件推送服务提供了事件通知功能(可在其控制台上打开异步通知功能),支持将邮件推送的结果以消息的方式异步通知给用户.用户可以通过创建事件通知的规则,来指定在邮件推送过程中触发不同的事件时,将邮件推送的结 ...

  3. [转]关于安卓与ios的推送系统,我说说自己的看法。

    http://www.miui.com/thread-328820-1-1.html 刚刚看到一个关于集成米聊微信等推送系统的投票贴,感触很深,确实用Android以来其推送的占用资源和不稳定性让我有 ...

  4. RedMine项目管理系统邮件推送设置(Windows环境)

    RedMine项目管理系统有邮箱推送功能,当Bug,安全漏洞等内容被修改.解决.评论的时候,系统会通过邮件 及时的通知你的团队和客户.邮件通知的环节.形式.时间.接受人均可定制,功能十分实用. 下面是 ...

  5. 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题

    在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...

  6. 利用SpringBoot+RabbitMQ,实现一个邮件推送服务

    一.流程图 本文内容主要围绕这个流程图展开,利用 RabbitMQ 消息队列,实现生产者与消费者解耦,所以有必要先贴出来,涵盖了 RabbitMQ 很多知识点,如: 消息发送确认机制 消费确认机制 消 ...

  7. 使用阿里云邮件推送服务架设自己邮件验证与推送体系

    提示:阅读本文需提前了解的相关知识 1.电子邮件协议(http://baike.baidu.com/view/2367542.htm) 2.阿里云邮件推送(https://www.aliyun.com ...

  8. 原型模式-广告邮件推送

    1. 广告邮件推送 现在大部分系统都有「发送邮件」的功能,系统可以通过邮件的方式给客户发送一些通知.消息提醒.广告推送的邮件. 其中,「广告邮件」比较特殊,它的邮件内容都是一样的,唯一不同的目标邮箱, ...

  9. 微博Rss邮箱推送系统

    微博Rss邮箱推送系统 微博Rss邮箱推送 ? Weibo subscription and sentiment analysis. 假期在家无聊,想到做一个微博订阅系统,可以将朋友or女朋友的微博更 ...

最新文章

  1. html font后面跟多种字体
  2. React 入门手册
  3. PXC集群常见错误(一)
  4. sso集成shiro_Keycloak SSO集成到jBPM和Drools Workbench中
  5. HTML5在线编辑器Wysihtml5之Bootstrap扩展
  6. 使用PowerPoint
  7. 如何发布ArcGIS Server离线地图(google 瓦片)
  8. 常见HTTP状态码大全
  9. Linux必学书籍!五本强烈推荐,你读过几本?
  10. mt管理器主题修改教程_手机全局主题:美乐蒂
  11. 安兔兔:2018年8月iOS设备性能排行榜
  12. [转]VC知识库文章 - 在MFC中用正则表达式对窗体进行有效性验证
  13. 线性代数中自由变量为什么取0和1?
  14. 系统内存占用率高导致电脑卡顿的解决方案
  15. mfrc522 c语言程序,MF RC522 51单片机测试程序
  16. VUE搭建云音乐播放器(App版本)
  17. 在 Linux中安装中文输入法
  18. 关东升给的ios学习路线图(可以借鉴)
  19. 深刻认识 -- 立即数
  20. Matlab基本操作函数 abs函数

热门文章

  1. 全网唯一的Microsoft?NETFramework3?5SP1简体中文完整版离线安装包安装netframewo
  2. ftp服务器搭建(离线安装vsftpd),配置
  3. 1102面向对象和类原型
  4. JVM(3)——Java GC分析
  5. Linux 文件夹含义(转)
  6. 阿里云助力合作伙伴帮助政府、企业体验云计算大数据魅力!
  7. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password
  8. 2-4. BCD解密(10)
  9. QTP中使用ExecuteFile加载vbs脚本
  10. 几个ARX取CAD窗口句柄的函数