易客CRM,中小企业最忠实的合作伙伴!

易客CRM5.1群发邮件采用队列机制

php admin 940℃ 0评论

新浪微博发微博时之前采用直接发送的机制,由于移动网络在国内还不稳定,经常发生发布失败的现象,在新版本中新浪微博采用队列的机制,发布微博后先把内容放在队列里,然后再逐条发布。

在易客CRM5.1.0新版本中,群发邮件也采用队列机制,群发邮件发送后,发送邮件将保存在队列中,CRM系统后台通过任务计划(windows)和crontab(Linux)逐条发送。由于国内的smtp服务器均有反垃圾邮件的功能,如果一个邮件账号在一定时间内频繁发送邮件,邮件系统将视为这个账号在发垃圾邮件。为了避免被SMTP服务器视为垃圾邮件,在易客CRM中设置smtp账号时可以设置间隔时间,一般都要超过5s,群发邮件时系统将每隔一定时间发一封邮件,这个时间就是设置smtp账号时所设置的间隔时间。

什么是队列?
队列(Queue)是运算受到限制的一种线性表。只允许在表的一端进行插入,而在另一端进行删除元素的线性表。队尾(rear)是允许插入的一端。队头(front)是允许删除的一端。空队列是不含元素的空表。假设有个队列Q=(a1,a2,…,an),则a1为队头元素,an为队尾元素。元素入队的次序为a1,a2,…,an,而出队的次序为a1,a2,…,an。可见队列的操作是按照先进先出的原则进行的。队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。
PHP的队列
在PHP中队列以数组的形式表现。数组中的第一个元素作为队头,最后一个元素作为队尾,这样就可以操作这个队列了。
PHP自带的函数中有很多封装好的数组函数,可以直接使用。
array_push:将一个或多个单元压入数组的末尾(入栈)
array_unshift:在数组开头插入一个或多个单元
array_pop:将数组最后一个单元弹出(出栈)
array_shift:将数组开头的单元移出数组

Ruby Starling
Starling是一个支持MemCache协议的轻量级持久化服务器。Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台机器间的异步工作进程。它是着名微博客网站Twitter开发用来处理大量的队列消息,以及保持服务的响应。Starling已经在生产环境中使用,不仅是Twitter在使用,FiveRuns同样在使用。FiveRuns甚至还根据自己的应用做了改进。

张宴作品HTTPSQS
HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。
有兴趣的可以看看网址:http://blog.s135.com/httpsqs_1_2/

Zend FrameWork的队列
Zend Framework内置了ActiveMQ和JobQueue第三方队列服务程序,另外自身还实现数据库DB和数组Array这两种方式。易客CRM采用的就是数据库DB方式,只需要两个表,就可以通过Zend Framework实现多队列服务。
CREATE TABLE IF NOT EXISTS ec_queuemessage (
message_id bigint(20) unsigned NOT NULL auto_increment,
queue_id int(10) unsigned NOT NULL,
handle char(32) default NULL,
body longtext NOT NULL,
md5 char(32) NOT NULL,
timeout decimal(14,4) unsigned default NULL,
created int(10) unsigned NOT NULL,
PRIMARY KEY (message_id),
UNIQUE KEY message_handle (handle),
KEY message_queueid (queue_id)
)
CREATE TABLE IF NOT EXISTS ec_queue (
queue_id int(10) unsigned NOT NULL auto_increment,
queue_name varchar(100) NOT NULL,
timeout smallint(5) unsigned NOT NULL default '30',
PRIMARY KEY (queue_id)
)

通过Zend_Queue的send方法发送群发邮件任务,通过receive方法获取群发邮件任务信息执行发送邮件。
$queue = new Zend_Queue('Db', $options);
$queue->send('postdata=1&name=1');
$messages = $queue->receive(100);

转载请注明:易客CRM官方博客 » 易客CRM5.1群发邮件采用队列机制

喜欢 (0)or分享 (0)