在写运维工单的消息推送时,直接使用邮件发送会导致系统反应特别慢,所以研究了一下rabbitmq+celery来实现邮件发送的异步执行

部署rabbitmq

RabbitMQ是基于Erlang的,所以首先必须配置Erlang环境。

从Erlang的官网 http://www.erlang.org/download.html 下载最新的erlang安装包,我下载的版本是 otp_src_R15B01.tar.gz。

tarxvzfotp_src_R15B01.tar.gzcdotp_src_R14B03./configuremakemakeinstall

安装完Erlang,开始安装RabbitMQ-Server。


主要参考官方文档:http://www.rabbitmq.com/build-server.html

需要安装一个比较新的Python版本。安装略。

'''

这一步我没有做,安装也没收到影响,在此仅是记载

需要安装simplejson。从此处下载最新的版本: http://pypi.python.org/pypi/simplejson#downloads 。我下载的版本是 simplejson-2.2.1.tar.gz

$tarxvzfsimplejson-2.2.1.tar.gz$cdsimplejson-2.2.1$sudopythonsetup.pyinstall

''''

然后安装RabbitMQ Server。从此处下载源代码版本的RabbitMQ: http://www.rabbitmq.com/server.html。我下载的版本是 rabbitmq_server-3.5.4.tar.gz

$tarxvzfrabbitmq_server-3.5.4.tar.gz$cdrabbitmq_server-3.5.4$make#TARGET_DIR=/usr/localSBIN_DIR=/usr/local/sbinMAN_DIR=/usr/local/manmakeinstall

在sbin/目录下出现了三个命令:

rabbitmqctl rabbitmq-env rabbitmq-server


安装成功。


运行

找到sbin/目录,运行程序:

/usr/local/sbin/rabbitmq-server–detached

停止程序:

/usr/local/sbin/rabbitmqctlstop

在settings.py中加入rabbitmq配置:

BROKER_HOST="127.0.0.1"BROKER_PORT=5672BROKER_USER="guest"BROKER_PASSWORD="guest"BROKER_VHOST="/"


'''以下为参考资料'''

配置

主要参考官方文档:http://www.rabbitmq.com/configure.html


一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:

一个是环境变量的配置文件 rabbitmq-env.conf ;

一个是配置信息的配置文件 rabbitmq.config;

注意,这两个文件默认是没有的,如果需要必须自己创建。


rabbitmq-env.conf

这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。

文件的内容包括了RabbitMQ的一些环境变量,常用的有:

#RABBITMQ_NODE_PORT= //端口号

#HOSTNAME=

RABBITMQ_NODENAME=mq

RABBITMQ_CONFIG_FILE= //配置文件的路径

RABBITMQ_MNESIA_BASE=/rabbitmq/data //需要使用的MNESIA数据库的路径

RABBITMQ_LOG_BASE=/rabbitmq/log //log的路径

RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins //插件的路径


具体的列表见:http://www.rabbitmq.com/configure.html#define-environment-variables

rabbitmq.config

这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。

它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。

文件的内容详见:http://www.rabbitmq.com/configure.html#config-items

部署celery

直接执行

pipinstalldjango-celery

在settings.py中加入以下配置

importdjcelerydjcelery.setup_loader()...INSTALLED_APPS=(...'djcelery',...)

最后创建Celery所需的数据表, 如果使用South作为数据迁移工具, 则运行:

pythonmanage.pymigrate

否则运行: (Django 1.6或Django 1.7都可以)

pythonmanage.pysyncdb

到此django+rabbitmq+celery的环境就部署完了,下面是邮件发送的代码,这里是用的django自带的邮件发送功能

在settings.py中加入邮件发送配置:

EMAIL_HOST='outlook.office365.com'EMAIL_HOST_USER='**@**.com'EMAIL_HOST_PASSWORD='***'EMAIL_USE_TLS=True

创建一个新py文件,命名为tasks.py

fromcelery.taskimportTaskfromceleryimporttaskfromworkflowimportmodelsfromdjango.core.mailimportEmailMessagefromdjango.templateimportloaderfromworksystem.settingsimportEMAIL_HOST_USER@task()defsend_email(subject,content,to_name_list):html_content=loader.render_to_string('sendmail.html',#需要渲染的html模板{'content':content})msg=EmailMessage(subject,html_content,EMAIL_HOST_USER,to_name_list)msg.content_subtype="html"#Maincontentisnowtext/htmlmsg.send()

sendmail.html模版:

<!DOCTYPEhtml><htmllang="en"><h>您好,您有新工单消息提醒,详情请点击http://**.**.com/</h><tableclass="cellspacing="1px""><thead><tr><th>列名</th><th>相应值</th></tr></thead><tbody>{%foritemincontent%}<tr><th>主键ID</th><th>{{item.id}}</th></tr><tr><th>工单名称</th><th>{{item.title}}</th></tr><tr><th>申请人</th><th>{{item.creator}}</th></tr><tr><th>工单类型</th><th>{{item.type}}</th></tr><tr><th>创建时间</th><th>{{item.create_time|date:"Y-m-dH:i:s"}}</th></tr><tr><th>审批人</th><th>{{item.approveuser}}</th></tr><tr><th>描述</th><th>{{item.description}}</th></tr><tr><th>处理人</th><th>{{item.deal_user}}</th></tr><tr><th>运帷回复</th><th>{{item.opsreply}}</th></tr><tr><th>状态</th><th>{{item.state}}</th></tr>{%endfor%}</tbody></table></html>