百万级用户量的站内信设计

技术文章 2014年8月5日 11.48K

1. 方案描述

该方案用于系统站内信功能模块在百万级用户量情况下的效率问题,只是后台管理员给前台用户发送站内信,用户与用户之间的发送不在讨论内。

2. 方案详情

假设系统的用户量达到了200W,活跃用户为10W,系统后台管理员要给全体用户发送一条感谢信,如果按照之前的存储方式,消息队列需要插入200W条数据,可是除了活跃的10W用户,其他用户都忘了自己有该网站的账号,他都有可能不再登陆该网站了,数据库保存的消息队列无意义了。

现表结构如下:

消息表
编号    ID    NUMBER
标题    TITLE    VARCHAR2(50)    50
正文    CONTENTS    VARCHAR2(1000)
发送状态    STATUS    NUMBER
发送日期    SEND_DATE    DATE
发送方式    SEND_TYPE    NUMBER
最新创建人    FCU    VARCHAR2(50)    50
更新人    LCU    VARCHAR2(50)    50
创建时间    FCD    DATE
最新更新时间    LCD    DATE
删除标记    DELETE_TAG    CHAR(1)    1 

消息容器
编号    ID    NUMBER
站内信ID    MESSAGE_ID    NUMBER
收件人ID    MEMBER_ID    NUMBER
是否已读    READ_STATUS    NUMBER

会员表

主键    id    NUMBER
会员编号    u_number    NUMBER
电子邮箱    u_email    VARCHAR2(200)    200
密码    u_passwd    VARCHAR2(50)    50
企业认证    company_admit    NUMBER(1)    1
帐号禁用    帐号禁用    NUMBER(1)    1
创建人    FCU    NUMBER
最后更新人    LCU    NUMBER
首次创建时间    FCD    DATE
最后更新时间    LCD    DATE
删除标记    DETELE_TAG    char(1)    1 

在尽量不改变表结构的前提下,改变一下程序写数据库的方式:
后台管理员发送一条站内信,接收对象为全体会员,系统往站内信表插入一条站内信,其中发送方式区分接收的对象(0为全体发送,1为只发送给注册会员,2为只发送给企业会员,3为指定会员发送),这样,发送给全体会员的一条站内信暂时只生成了一条数据。

前台会员登陆的时候,根据会员自身的会员类型(普通会员,企业会员)查询站内信表中属于自己的最新消息(根据自己所持消息的最新时间与消息表的发送时间做 比对),往消息容器中插入自身与所持消息的关联数据,默认未未读,在前台会员点击某一条未读站内信的时候,将容器中的对应站内信状态改为已读。

如果后台管理员只指定发送站内信给某几个会员,则往站内信表插入一条站内信后,将这几个会员与该站内信的关联直接往消息容器中写关联,不需要前台会员取。
另:因为改变了发送接收方式,后台管理员只指定发送站内信给某几个会员,但是站内信状态未未发送,只是保存草稿,需要往站内信主表增加一个字段,保存指定会员的id串,用于关联此草稿与指定会员的关联,此处就要求发送给指定会员的数量不能太多,需要限制。
这样,百万级用户量的系统,活跃度为10%的用户登陆系统,只生成了10W的数据,用户活跃度越低,此方案效率越明显,如果是100%活跃度的话,此方案和现有方法无区别。

 


关注微信公众号『PHP学习网

第一时间了解最新网络动态
关注博主不迷路~

PHP学习网:站内收集的部分资源来源于网络,若侵犯了您的合法权益,请联系我们删除!
分享到:
赞(0)

文章评论

您需要之后才可以评论
0点赞 0评论 收藏 QQ分享 微博分享

PHP学习网

PHP学习网