10
回答
如何实现本站,个人行为(好友)的动态通知
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

感觉这个在网站技术中不太好实现,类似于,事件触发机制和发布者/订阅者设计模式这样的东西,必须记录每个user的动作,到数据库中,还要记录那些人订阅了那些好友的动作,哎!感觉挺难的,有实现过的朋友,帮忙解释下。

<无标签>
举报
亦清95
发帖于7年前 10回/622阅
共有10个回帖 最后回答: 7年前

数据量不太大的话可以考虑:

搞个操作日志表,用来记录每个用户的动作

封装统一的方法用来控制此表的数据写入

在这个统一方法中实现对好友的动态通知发送。

主要是数据量和高并发的问题吧,一般情况下消息可以通过从业务上限制单用户最高消息数来解决,太多的消息通常对用户没意义——反而是一种骚扰,高并发那就用消息队列来搞定了。

引用来自#3楼“小猪猪”的帖子

activeMQ

那个是java实现,我现在使用 php 

再说java太庞大复杂了,一个人搞不定(我以前学java的,学了好几年,最后觉得发展太快,不学了,等他啥时停了,再学,直接研究AspectJ 的java扩展语言了)

引用来自#7楼“Loudyn”的帖子

AspectJ是Java的扩展语言?

到google或百度搜一下呗,你这么一问 我都怀疑我以前对aspectJ的认知了。

aspectJ是施乐公司首先开发的aop语言实现 也是迄今最成熟的aop实现,最后开源贡献了出来,当然各种语言都有的

如果你学那个主流语言就可以搜索一下该语言的实现,据我所知就目前php对aop的支持还不行,其他语言应该都有实现版本或者实验性版本

其实中间有人说了很好的建议:uc+uchome方案

我告诉你uccenter的做法,主要是几个大的操作,都会将用户的操作写入到一个叫做feed表。

然后你常见的谁谁干了什么,实际上就是通过feed表查询出来的。

不过康盛为了保证数据灵活性,牺牲了一定性能,早期我接触ucenter 1.0的代码,这个主字段有一个是描述用户具体操作的内容,比如xx发了yy,后面有一个字段用于记录xx的具体值,yy的具体值。

其实如果你用mvc框架,做这种东西真的容易过“吃生菜”。

** 最最粗暴的,每个用户登录、评论、发表博客、相册等操作相关model的时候,就是发生了save(包括create和update),直接在afterSave里面进行关联性的验证,记得不要用表间关联,用逻辑做松耦合关联即可,无相关记录的别插feed表。

** 精致点,你可以定义接口,比如Feedable,不过php不像Java,他不能限制函数返回类型,接口这玩意有等于没有。但是出于为了让你的程序设计能力更强一些(毕竟Java、C\C++还是有的),还是推荐你这么干,而且后续的开发者看你的代码也容易接受一些。

另外,有一样事情你要清楚,基于BS结构,开发服务器主动通知客户端的东西是不现实的(虽然为此我曾经将我的MVC框架扩展了comet支持,但只是在内部OA系统使用),好像百威2009年的官方社区www.bud.cn/kingdom,最初就是由ucenter 1.0改的,不过康盛的东西太垃圾,是个花瓶,经不起性能考验。最后我们还是用我的MVC框架进行重构。最后我们使用Ajax没60秒定期请求一次,用于获取用户最新的互动信息。不过这个没什么意义,一个用户只要保证1-3分钟内都会点击刷新一次页面(即比如点击连接进入新页面,或者提交些数据什么的),你就根本不用自己主动去刷(事实上我们从最初设定10秒刷一下,到60秒,到用定时器检查用户180秒内不刷新才去刷一次,到最后关闭自动刷新),可见这个东西使用率真的很低,没什么实际作用。

我最近建了这样一个表 为了存储系统内用户所有的动态信息 因为用户行为可能是多种多样的,所以表结构不好设计,

最后从小学语文的角度考虑了 人物 地点 时间 做了什么 也就是语法角度的 { 主语 时间状语 谓语 表语 宾语 }这样的思路设计了一个表 还没用上呢只是以备后用:

CREATE TABLE `actiontrack` (

  `actor` int(11) NOT NULL COMMENT '行为执行者,参考user表',

  `ctime` datetime NOT NULL COMMENT '什么时间',

  `action` varchar(25) default NULL COMMENT '行为:比如uploadPhoto,modifyUserInfor,addFriend等',

  `whose` int(11) default NULL COMMENT '谁的,比如我评价了大山的照片,这里记载大山的id,参考user表',

  `what` int(11) default NULL COMMENT 'action的目标对象,这里参考相应表,比如发表了日志,这里就是日志的id,上传照片这里就是照片id',

  `id` int(11) NOT NULL auto_increment COMMENT '事件id,通知监听者时发送该id号,监听者用此id号来取通知html文本',

  `notifyText` text,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='行为踪迹表,记录用户都干过什么,此表用于记录用户的实时信息,';

有一个通知消息字段用来生成直接可用的html输出 还有两张表做配合:

CREATE TABLE `notify` (

  `id` int(11) NOT NULL auto_increment COMMENT '业务无关主键,删除时用到',

  `toWhom` int(11) NOT NULL COMMENT '给谁的通知,参考user表',

  `eventId` int(11) default NULL COMMENT '通知的内容,需要是组装好的html片段,这样可以通过连接查看 参考 actionTrack表的id',

  `notifyText` text COMMENT '同actionTrack中的,因为actionTrack中的内容不能保存过长时间定期会删掉一些数据,当删除时,eventId所指的记录也被删除,此时把数据转储的这个字段,一般不会用该字段,这样就防止 通知失效,找不到记录问题,当然这个字段数据也不一定非得来自actionTrack表可以凭空创建',

  `type` varchar(25) default NULL COMMENT '通知类型,用来决定渲染方式',

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='通知表,用于通知用户发生了什么,比如xxx回复了你的评论,';

CREATE TABLE `subscribe` (
  `subscriber` int(11) NOT NULL COMMENT '订阅者,参考user表',
  `frdGroup` int(11) default NULL COMMENT '朋友分组 -1表示所有分组,null表示非分组订阅,而是个人订阅,其他值时分组id',
  `whose` text COMMENT '订阅对象,参考user表,可以订阅多人的,多个人用逗号隔开userId,如果将来采用用户名唯一做键这里也可以',
  `actions` varchar(200) default NULL COMMENT '对被关注对象,对象组的那些行为进行订阅,比如:blog|cmt|addFriend|modifyUserInfor,多个行为用单竖线分隔',
  `id` int(11) NOT NULL auto_increment COMMENT '业务无关主键,用于删除或修改,业务语义就是取消订阅或修改订阅',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='订阅表,对系统内其他成员行为的订阅';
顶部