系统消息的一种发送方式

   最近一次,有个需求,需要给3kw的用户发系统消息,按照以往的设计是这样的:

   后台输入系统消息--->从用户系统得到用户的id--->根据用户id给每个用户生成一个存储消息的key,进行消息存储,更新用户的未读消息数--->用户登录系统,看到未读消息数,点击进入阅读页面--->读取系统消息,更新未读消息数为0

   这个方案在用户数非常少的情况下面是完全ok的,但是在用户数很大的时候,出现了以下问题:

  1.系统消息对于每个用户是一样的,即使有可能有一些差别,但是通过用户系统的数据可以组装出不一致的消息,这样的话,如果存储一份数据用的存储大大小于存储3kw数据用户的存储

  2.给每个用户存储消息是个漫长的过程,假设底层存储系统TPS为1000条/秒,3kw需要3kw/1000*2=60000秒,也就是大约16.5个小时(消息实体和未读消息数都要存储),这个时间在某种需求下是不能够接受的,这样也将导致用户接受到的系统消息的时间是有差别的。

  于是,我们进行了改造,顺着解决上面两点问题的思路,进行如下解决:

  1.系统消息存储一份,这样存储消耗的容量和时间没有问题了

  2.未读消息数和系统消息一样,也存储一份

  3.当用户登录时,此次未读消息最多需要二次查询,一是查询有无系统消息,如果有,继续查询为每个用户存储的已读消息记录,这个用户此前没有读过系统消息的话记录是为空的,如果读过的话这个记录就是上次读过的消息记录,系统消息去除已读消息就是这个用户的未读消息。

  4.当用户阅读未读消息时,存储这条消息为已读消息记录。

 

改进后的好处是存储系统消息的容量小和时间短,用户读取消息的时间是一致的,根据二八原则,20%的活跃用户的已读消息记录也比原来的消息存储小得多。

   

posted @ 2011-11-20 14:23  nod0620  阅读(505)  评论(0编辑  收藏  举报