o***g 发帖数: 2784 | 1 假设是一些tips
每天要给不同的用户推不同的tip
但是每个tip的触发条件都可能是不同的
比如生日 冬天 地理位置 某个tip之后的几天。。。。
这个触发条件怎么设计比较好?或者有轮子? |
o***g 发帖数: 2784 | 2 自己顶一下
各位大神,出手啊
【在 o***g 的大作中提到】 : 假设是一些tips : 每天要给不同的用户推不同的tip : 但是每个tip的触发条件都可能是不同的 : 比如生日 冬天 地理位置 某个tip之后的几天。。。。 : 这个触发条件怎么设计比较好?或者有轮子?
|
w**z 发帖数: 8232 | 3 trigged event 事先都要insert 到 table 里。搞个cron job, 定时query table。
【在 o***g 的大作中提到】 : 自己顶一下 : 各位大神,出手啊
|
w***g 发帖数: 5958 | 4 做一个规则引擎。
【在 o***g 的大作中提到】 : 假设是一些tips : 每天要给不同的用户推不同的tip : 但是每个tip的触发条件都可能是不同的 : 比如生日 冬天 地理位置 某个tip之后的几天。。。。 : 这个触发条件怎么设计比较好?或者有轮子?
|
N********n 发帖数: 8363 | 5
Workflow, if you are using .Net
【在 o***g 的大作中提到】 : 假设是一些tips : 每天要给不同的用户推不同的tip : 但是每个tip的触发条件都可能是不同的 : 比如生日 冬天 地理位置 某个tip之后的几天。。。。 : 这个触发条件怎么设计比较好?或者有轮子?
|
z****e 发帖数: 54598 | 6 用户login的时候,触发一个event
然后这个event依次判断每个tips的产生
你这些tips不是mutually exclusive的吧?
一个用户会有[0,n]个tips返回
自己写这些也没多难维护撒,不用轮子也没啥 |
p**r 发帖数: 5853 | 7 +1,个人感觉这样比较节约资源。
【在 w**z 的大作中提到】 : trigged event 事先都要insert 到 table 里。搞个cron job, 定时query table。
|
o***g 发帖数: 2784 | 8 好吧,我需求没说清楚
这些tip不是开发阶段能确定的,是business user维护的
触发条件可能还带and or
需要在功能强大和开发简单之间做一个折中,找到合适的点,并且也别整的太复杂,
business user不需要学习最好了
楼上有人提规则引擎,这个就属于功能太强大
还有db怎么存这些触发条件也是个问题 |
p**r 发帖数: 5853 | 9 wwzz那个方案是最适合这种情况的,
biz user添加的触发一个逻辑层产生events,
所有的events存一个list,
db如果和trigger自己google去,
或者写个check function定时查也可以。
【在 o***g 的大作中提到】 : 好吧,我需求没说清楚 : 这些tip不是开发阶段能确定的,是business user维护的 : 触发条件可能还带and or : 需要在功能强大和开发简单之间做一个折中,找到合适的点,并且也别整的太复杂, : business user不需要学习最好了 : 楼上有人提规则引擎,这个就属于功能太强大 : 还有db怎么存这些触发条件也是个问题
|
o***g 发帖数: 2784 | 10 你是说这个?
http://dev.mysql.com/doc/refman/5.5/en/triggers.html
【在 p**r 的大作中提到】 : wwzz那个方案是最适合这种情况的, : biz user添加的触发一个逻辑层产生events, : 所有的events存一个list, : db如果和trigger自己google去, : 或者写个check function定时查也可以。
|
|
|
p**r 发帖数: 5853 | 11 db trigger能做得有限,
你这情况肯定需要通知用户,搞不好还要整些图片,啥的。
我建议你写个本地或远程funciton,定期检查比较方便。
biz用户可以各种定events,然后添加到list里
比如这是events list
#1 call zhaoce, 1/1/2015
#2 send gift to goodbug, 2/1/2015
#3 fuck someone, 3/1/2015
你写个功能定期检查这个list,
要是不频繁,用个time range把前后时间覆盖了
不久搞定了。
【在 o***g 的大作中提到】 : 你是说这个? : http://dev.mysql.com/doc/refman/5.5/en/triggers.html
|
N********n 发帖数: 8363 | 12 Try not to use db triggers. Hard to manage in the long run. |
o***g 发帖数: 2784 | 13 我举个例子
所有用户生日那天收到生日快乐这个tip
这个咋做?
biz user咋操作?内部咋运转的?
【在 p**r 的大作中提到】 : db trigger能做得有限, : 你这情况肯定需要通知用户,搞不好还要整些图片,啥的。 : 我建议你写个本地或远程funciton,定期检查比较方便。 : biz用户可以各种定events,然后添加到list里 : 比如这是events list : #1 call zhaoce, 1/1/2015 : #2 send gift to goodbug, 2/1/2015 : #3 fuck someone, 3/1/2015 : 你写个功能定期检查这个list, : 要是不频繁,用个time range把前后时间覆盖了
|
N********n 发帖数: 8363 | 14
You need some kinda periodical tasks / services scanning the db
records and execute.
【在 o***g 的大作中提到】 : 我举个例子 : 所有用户生日那天收到生日快乐这个tip : 这个咋做? : biz user咋操作?内部咋运转的?
|
p**r 发帖数: 5853 | 15 我算是明白,你丫是找人做项目,不是问问题,哈哈。
你先说说你自己打算怎么做?
【在 o***g 的大作中提到】 : 我举个例子 : 所有用户生日那天收到生日快乐这个tip : 这个咋做? : biz user咋操作?内部咋运转的?
|
o***g 发帖数: 2784 | 16 流程上肯定是这么做
我的问题是trigger的条件怎么做
有一种做法是,把公式存下来,数据库里就一列,就存这个公式
比如"$age>18 && $age<25"
但是读这个公式的就需要parse等等事情
biz user的后台界面得能产生这个公式,这个也是很复杂的
如果这么做,有没有轮子?公式解析和界面上管理这个公式都需要轮子
还有一种土法,比如光age,可是加两列ageFrom ageTo。还有其他各种变量都往上加,
这个处理起来方便很多,但是限制也是很多。比如biz user想要所有属羊的,就做不了。
【在 N********n 的大作中提到】 : : You need some kinda periodical tasks / services scanning the db : records and execute.
|
X****r 发帖数: 3557 | 17 抛个砖:把每个条件的逻辑和参数分开。逻辑用代码实现,每种有一个名字,不放在数
据库里。数据库里每个条件包括它所用的逻辑的名字,以及参数列表。
了。
【在 o***g 的大作中提到】 : 流程上肯定是这么做 : 我的问题是trigger的条件怎么做 : 有一种做法是,把公式存下来,数据库里就一列,就存这个公式 : 比如"$age>18 && $age<25" : 但是读这个公式的就需要parse等等事情 : biz user的后台界面得能产生这个公式,这个也是很复杂的 : 如果这么做,有没有轮子?公式解析和界面上管理这个公式都需要轮子 : 还有一种土法,比如光age,可是加两列ageFrom ageTo。还有其他各种变量都往上加, : 这个处理起来方便很多,但是限制也是很多。比如biz user想要所有属羊的,就做不了。
|
s*i 发帖数: 5025 | 18 可以考虑这么设计:
1. 一个尚未发生的Event表,按时间排序,每个event有个expected trigger time;
2. 一个Action的列表。注意,Action本身可以产生events的;
3. 一个events到actions的map (1: n)
具体到怎么加新的event,是另一个话题。比如“生日前一天”就可以是一个event。生
日那天也是一个 event。
当event handler(基本上就是处理 now > event expected time)发现可以发生的
event的时候,去执行map里的actions。
[发表自未名空间手机版 - m.mitbbs.com] |
o***g 发帖数: 2784 | 19 思路很好,多谢
还是万黑给力啊
【在 X****r 的大作中提到】 : 抛个砖:把每个条件的逻辑和参数分开。逻辑用代码实现,每种有一个名字,不放在数 : 据库里。数据库里每个条件包括它所用的逻辑的名字,以及参数列表。 : : 了。
|
a*f 发帖数: 1790 | 20 rule engine最灵活吧,用户改动也容易 |
|
|
w**z 发帖数: 8232 | 21 rabbitmq 有delayed message
http://www.javacodegeeks.com/2012/04/rabbitmq-scheduled-message
可以看看
【在 s*i 的大作中提到】 : 可以考虑这么设计: : 1. 一个尚未发生的Event表,按时间排序,每个event有个expected trigger time; : 2. 一个Action的列表。注意,Action本身可以产生events的; : 3. 一个events到actions的map (1: n) : 具体到怎么加新的event,是另一个话题。比如“生日前一天”就可以是一个event。生 : 日那天也是一个 event。 : 当event handler(基本上就是处理 now > event expected time)发现可以发生的 : event的时候,去执行map里的actions。 : [发表自未名空间手机版 - m.mitbbs.com]
|
z****e 发帖数: 54598 | 22 其实你自己弄个scheduler也可以
但是我觉得,这个功能只有在用户登陆时候才有用
干脆就在登陆的时候计算就是了
难道用户会长时间在线,需要推送? |
s*i 发帖数: 5025 | 23 如果要是发送spam电邮,光靠用户登录的话不太可靠了。
【在 z****e 的大作中提到】 : 其实你自己弄个scheduler也可以 : 但是我觉得,这个功能只有在用户登陆时候才有用 : 干脆就在登陆的时候计算就是了 : 难道用户会长时间在线,需要推送?
|
s*i 发帖数: 5025 | 24 这个轮子好!用Apache 的 dead letter channel实现的。
【在 w**z 的大作中提到】 : rabbitmq 有delayed message : http://www.javacodegeeks.com/2012/04/rabbitmq-scheduled-message : 可以看看
|
o***g 发帖数: 2784 | 25 app里的notification能从服务器推么?
【在 z****e 的大作中提到】 : 其实你自己弄个scheduler也可以 : 但是我觉得,这个功能只有在用户登陆时候才有用 : 干脆就在登陆的时候计算就是了 : 难道用户会长时间在线,需要推送?
|
z****e 发帖数: 54598 | 26 ……这个我们用scheduler实现
【在 s*i 的大作中提到】 : 如果要是发送spam电邮,光靠用户登录的话不太可靠了。
|
z****e 发帖数: 54598 | 27 这个难点应该在于app端编程
只要app能够通知server并接收notification,都好办
【在 o***g 的大作中提到】 : app里的notification能从服务器推么?
|
m***h 发帖数: 77 | 28 一个比较简单直接的办法,主要用数据库。
你要多多少少山寨个configurable的rule repo,让后围绕它做文章。
1, rule
可能在开始的时候business会提供你一些简单的rule to start,以后会增加更复杂的
rule,turn on/off, 或者改参数。
假设business想给第二天生日的用户发封生日快乐邮件,可以用这么个rule table
rule_id: 123
rule_trigger:MORNING_BATCH
rule_name:one_day_befor_user_birthday
rule_sql: select user_id, first_name, last_name, email from user where user.
birth_day = system_date + [DAY_BEFORE_BIRTH_DAY]
parameters: DAY_BEFORE_BIRTH_DAY=1
email_template:202
active:true
另外一个table存email_template
template_id: 202
email_subject: Happy Birth Day [FIRST_NAME]
email_body: Hello, [FIRST_NAME], happy birthday to you!
更复杂点的rule,假设marketing想给那些过去30天买过裤衩的用户促销拖鞋
rule_id: 124
rule_trigger:NIGHT_BATCH
rule_name:marketing_promotion_based_on_last_purchase
rule_sql: select user_id, first_name, last_name, email, user_order.item_desc
,’[PROMOTION_ITEM]’ promotion_item from user, user_order where user.user_
id=user_order.user_id and uesr_order.item=‘[PURCHASED_ITEM]’ and user_
order.purchage_date>systemDate-30
parameters: PURCHASED_ITEM =‘裤衩’,PROMOTION_ITEM=‘拖鞋’
email_template:205
active=true
对应的email_template
template_id: 205
email_subject: here is something for you [FIRST_NAME]!
email_body: Hello, [FIRST_NAME], we think you might be interested in [
PROMOTION_ITEM]
在这个例子里,通过rule SQL和parameters我们能得到一个能“run“ 的SQL或者
script,然后email template定义要送的email内容,这里要用到free marker或者自己
写个东西来替换template里的token。
2,然后做一个UI让business控制这些rule,和template,turn on或者turn off,该时
间,该参数,改email之类,甚至copy一个存在的rule建立新的rule with不同的参数。
基本的crud操作。这个SQL部分得你写。
3,要写一个简单的workflow来run这些rule,比如
void runRule(int ruleId){
Map rule = DB.queryByRuleId(ruleId);
//figure out the sql
String realSql = StringUtil.replaceToken(rule.get(“rul_sql”), rule.
get(“parameters”);
//find the email template
Map emailTemplate = DB.queryTemplateById(rule.get(“
email_template”));
String emailSubjectTemplate=emailtemplate.get(“email_subject”);
String emailBodyTemplate = emailTemplate.get(“email_body”);
//run sql
List |
s*i 发帖数: 5025 | 29 app端是polling 还是双向通信(web socket?)?
【在 z****e 的大作中提到】 : 这个难点应该在于app端编程 : 只要app能够通知server并接收notification,都好办
|
m***h 发帖数: 77 | 30 如果client端是mobile app的话,常用push notification,有third party service像
urbanairship,parse什么的。pull得自己整infrastructure. |
|
|
N********n 发帖数: 8363 | 31
Said it early on: use Workflow if on .Net, or FOSS counterparts
if not.
【在 o***g 的大作中提到】 : 流程上肯定是这么做 : 我的问题是trigger的条件怎么做 : 有一种做法是,把公式存下来,数据库里就一列,就存这个公式 : 比如"$age>18 && $age<25" : 但是读这个公式的就需要parse等等事情 : biz user的后台界面得能产生这个公式,这个也是很复杂的 : 如果这么做,有没有轮子?公式解析和界面上管理这个公式都需要轮子 : 还有一种土法,比如光age,可是加两列ageFrom ageTo。还有其他各种变量都往上加, : 这个处理起来方便很多,但是限制也是很多。比如biz user想要所有属羊的,就做不了。
|
l******t 发帖数: 55733 | 32 这应该倒过来,生日自己注册递归事件
【在 N********n 的大作中提到】 : : Said it early on: use Workflow if on .Net, or FOSS counterparts : if not.
|
c*********e 发帖数: 16335 | 33 这个太容易了,就是建立一个表,把所有的判断的items各自写一个row放表里。然后用
户登录了首先就query这个表,可以写个stored procedure来拿到结果。
【在 o***g 的大作中提到】 : 我举个例子 : 所有用户生日那天收到生日快乐这个tip : 这个咋做? : biz user咋操作?内部咋运转的?
|
d******e 发帖数: 2265 | 34 这个你抽象一个engine.
里面有很多obj.
每个obj,有一组规则
加上一个state changed event call back来激活。
还需要什么?
【在 o***g 的大作中提到】 : 假设是一些tips : 每天要给不同的用户推不同的tip : 但是每个tip的触发条件都可能是不同的 : 比如生日 冬天 地理位置 某个tip之后的几天。。。。 : 这个触发条件怎么设计比较好?或者有轮子?
|
o***g 发帖数: 2784 | 35 多谢,看来这个是商业上的正统解决方案
sql是谁写的?biz user还是开发人员?
user.
【在 m***h 的大作中提到】 : 一个比较简单直接的办法,主要用数据库。 : 你要多多少少山寨个configurable的rule repo,让后围绕它做文章。 : 1, rule : 可能在开始的时候business会提供你一些简单的rule to start,以后会增加更复杂的 : rule,turn on/off, 或者改参数。 : 假设business想给第二天生日的用户发封生日快乐邮件,可以用这么个rule table : rule_id: 123 : rule_trigger:MORNING_BATCH : rule_name:one_day_befor_user_birthday : rule_sql: select user_id, first_name, last_name, email from user where user.
|