每小时执行一次数据筛选策略

每个功能模块执行完都会进行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消费。

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

 

posted on 2015-11-19 14:03  酒仙桥吴彦祖  阅读(266)  评论(0)    收藏  举报