每小时执行一次数据筛选策略
每个功能模块执行完都会进行Judge,如果模块执行不成功,那么向负责人发Email和SMS
基本数据的实时获取
报警邮件:如果检测没有上一小时的结束文件%Y%m%d%H.done ,那么发送报警邮件
获取HourIpLog:从DB获取小时级iplog,上传到hadoop,用于计算LastLoginTime
等待上小时任务结束:如果发现没有上一小时的结束文件%Y%m%d%H.done,那么sleep
消息过滤
LastLoginTime计算用户最近登录时间:
用前一天的LastLoginTime结果和今天的HourIpLog计算出最新的LastLoginTime(精度为一小时)
MsgUpdate消息(邮件)数据更新,替换或者追加新消息,过滤失效的老消息:
1.如果etype="ugc" or etype="chat" 那么now-ts如果大于7天,就认为该消息已经失效
2.reduce中当发生uid或者类型转变时,需要输出上一条消息
3.ugc消息可以累计add,其他消息的都是update
4.结果存于MsgUpdate目录
Unsubscribe过滤已退订的消息:
1.从email_unsubscribe中load所有退订用户和退订邮件类型,用于过滤MsgUpdate的数据
2.结果存于FilterUnsubscribe目录
MsgDoneFilter过滤已处理的消息(如果最近两周给此uid发过邮件,就过滤掉):
1.用最近两周的MsgDone的数据,用于过滤Unsubscribe的数据
2.结果存于MsgDoneFilter目录
#MsgReadFilter过滤已过期(失效)的消息(暂时被注释掉):
1.假设用户最后一次登陆的持续时间为1小时
2.消息产生时间在最后一次登录之后,就可以认为此消息已经被阅读过,不需要以邮件形式发送
3.遵循上面两条原则,用LastLoginTime过滤MsgDoneFilter的数据
4.结果存于MsgReadFilter
MsgUserLossFilter根据用户流失时长过滤消息:
1.用now()-LastLoginTime算出用户流失时间
2.只有用户流失时间足够长才给他发邮件,例如dictDelta["ugc"] = 1.0 * 24 * 3600,说明ugc类型的必须流失1天以上才给他发
3.根据此原则过滤MsgDoneFilter中的数据
4.结果存于MsgUserLossFilter
LastMsgDoneTime更新用户每类邮件的最近推送时间:
1.用前一天计算出的LastMsgDoneTime和今天的MsgDone计算出最新的LastMsgDoneTime
2.更新用户每类邮件的最近推送时间,结果存于LastMsgDoneTime
MsgFrequency发信频率过滤:
1.每个uid的每类邮件都有发信频率,有的很小有的很大,139的邮箱30天才能发一封
2.用LastMsgDoneTime和每类邮件的发信频率 过滤MsgUserLossFilter的数据
3.结果存于MsgFrequency
消息发送控制
1.MsgSelect消息优先级
为各个类型的邮件设置优先级,从0为最高,优先级高的经排序排在前面,可以优先发送
#2.SendTimeCtrl(暂时没有用到)
更具规则挑选用户打开的时间发
3.TemplateCtrl模板控制
我们和网易有合作的绿色通道,可以保证发往网易的邮件可以100%到达。
所以每类发往网易的邮件 都新起一个task和template(Why?)
另外其实和139邮箱也有合作的绿色通道,但是139收件敏感词过滤规则太严格,导致收件率太感人。
4.QQSendTimeCtrl QQ发送时间控制
经验告诉我们QQ邮箱夜间的收件率太低,所以在这个Controller中我们限制QQ邮件只在9-23点发送
不满足规则的直接扔掉
5.SpeedCtrl 速度控制(重要)
6.SenderCtrl 发件人控制
网易邮箱的选网易诚信通道的发件人,139的选139诚信通道发件人
消息处理(消费)
最后SenderCtrl中的就是策略过滤结束的数据,这时才真正的向kafka中写入元数据,并上传hadoop的MsgDone中
file_meta_suc=${year}${mon}${day}${hour}.meta.suc
file_meta_log=${year}${mon}${day}${hour}.meta.log
hdfs_in="`eval echo -e ${HDFS_OUTPUT_DIR_DAY}/SenderCtrl`"
hdfs_out="`eval echo -e ${HDFS_OUTPUT_DIR_DAY}/MsgDone`"
echo"producer"
${HADOOP} fs -cat ${hdfs_in}/* > tmp.log
java -cp offline-message-system-1.0-SNAPSHOT.jar:lib/* com.renren.edm.offlinems.platform.PlatformProducer tmp.log 1>../Logs/${file_meta_suc} 2>../Logs/${file_meta_log}
${HADOOP} fs -rmr ${hdfs_out}/${file_meta_suc}
${HADOOP} fs -put ../Logs/${file_meta_suc} ${hdfs_out}
至此,我们千辛万苦过滤出的元数据终于生产进了kafka,等待着delivery消费。
浙公网安备 33010602011771号