基于rq的简单Python库,用于存储Django发送的电子邮件并在后台使用工作进程处理它们
项目描述
django-rq-mail是一个简单的Python库,基于rq,用于存储Django发送的电子邮件并在后台使用工作进程处理它们。
由于django-rq-mail基于rq,它完全由Redis支持。
架构
django-rq-mail向Redis添加了新的元素来享受排序集。
对于django-rq-mail的目的,它实现了WaitingQueue的概念,该概念使用时间戳延迟作业的处理。
rq的默认行为是通过BLPOP处理作业,当从任何给定队列中弹出元素时,它会阻塞连接。由于此行为,无法延迟处理作业,并且当它失败时,rq将其推送到失败队列。当然,您可以稍后重新排队此作业,但没有回退机制。
在django-rq-mail中,您可以定义回退步骤(以秒为单位)以重试作业,直到它不再失败。当一个作业在每个步骤上都被测试后,我们再次引入rq在将其推送到失败队列时的默认行为。
每个步骤都会创建一个等待队列,当任务失败时,我们记录当前时间戳加上延迟时间,以便未来重试。
这种机制可以通过ZADD实现,它将序列化的任务添加到队列中并带有分数,通过ZREVRANGEBYSCORE返回分数在最大(当前时间戳)和最小之间的所有元素。
如您所理解的,我们已经取消了默认的阻塞行为,用每秒运行一次的守护进程来代替。
安装
要么从GitHub检出包,要么通过PyPI获取版本。
pip install django-rq-mail
将‘rq_mail’添加到您的INSTALLED_APPS
INSTALLED_APPS = ( 'rq_mail', )
以使用django-rq-mail提供的rq_mail命令(通过Django命令行)。
此命令是将rq集成到Django中的最小集成,用于启动分发器。
定义EMAIL_BACKEND
EMAIL_BACKEND = 'rq_mail.backends.RqBackend'
定义RQ_MAIL_EMAIL_BACKEND,这是用于发送电子邮件的后端,例如
RQ_MAIL_EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
日志记录
RQ 0.3.3使用标准的Python的logging,这意味着您可以在django的settings.py中轻松配置rqworker的日志机制。例如
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'rq_console': {
'format': '%(asctime)s %(message)s',
'datefmt': '%H:%M:%S',
},
},
'handlers': {
'rq_console': {
'level': 'DEBUG',
'class': 'rq.utils.ColorizingStreamHandler',
'formatter': 'rq_console',
'exclude': ['%(asctime)s'],
},
},
'loggers': {
'rq.worker': {
'handlers': ['rq_console'],
'level': 'DEBUG'
},
}
}
使用方法
安装后,您可以从shell运行python manage.py rq_mail。
配置
RQ_MAIL_PREFIX
用于命名由django-rq-mail创建的所有队列的前缀。
RQ_MAIL_MAIN_QUEUE
主队列的名称。
RQ_MAIL_EMAIL_BACKEND
在后台处理时用于发送电子邮件的电子邮件后端。
RQ_MAIL_REDIS_HOST
连接时使用的Redis主机。
RQ_MAIL_REDIS_PORT
连接时使用的Redis端口。
RQ_MAIL_REDIS_DB
连接时使用的Redis数据库。
RQ_MAIL_REDIS_PASSWORD
连接时使用的Redis密码。
RQ_MAIL_REDIS_URL
连接时使用的Redis URL。
RQ_MAIL_REDIS_SOCKET
连接时使用的Redis套接字。
RQ_MAIL_FALLBACK_STEPS
创建等待队列的时间表简单列表。
您可以定义任意多的步骤,每个步骤都会转换成一个队列。因此,如果您定义了10个步骤,您将允许消息失败10次,然后才会进入失败队列。