百万级用户量的站内信发数据库设计
百万级⽤户量的站内信发数据库设计
随着WEB2.0的发展,⽤户之间的信息交互也变得⼗分庞⼤,⽽且实时性要求越来越⾼。现在很多SNS⽹站和⼀部分CMS⽹站都⼴泛地应⽤了站内信这⼀模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的设计细节,要做好这个“邮递员”是很不容易的。为什么这么说呢?下⾯我们就⼀步步来探索设计⼀个百万级⽤户量的站内信发数据库,看完以后你就会明⽩什么是真正可靠⾼效的“邮递员”。
1、⼏⼗——⼏百的⽤户量
这样的⽹站规模最⼩,可能是⼀个中⼩企业的CMS系统,⾯对这样的⽤户量,我们就不必要考虑短消息数据量太⼤的问题了,所以按照怎么⽅便怎么来的原则,发就每⼈复制⼀条消息数据,这样⽤户可以⾃⼰管理⾃⼰的消息,可以⾮常⽅便进⾏“已读、未读、删除”等操作。按照这个思路,我们的数据库设计如下:
表T_Message最性感的动漫
这样,我们接受⾃⼰的消息时只要做如下查询:
查询⾃⼰的未读消息只要做如下查询:
这种⽅法很简单,可能是我们第⼀个想到的,对于这样的⽤户量的情况这样的设计确实也⾜够了。
2、⼏千——⼏万的⽤户量
挣钱的行业
⽤户量到了这样的级哦别,这个⽹站应该算是⽐较⼤了,笔者估计,可能是⼀个地区性的SNS⽹站。那么⾯对这样的⽤户量,我们⼜该如何来设计站内信发呢?上⾯第⼀种思路还⾏得通吗?应该这样说,如果勉强要⽤上⾯那种设计,也是可以的,只不过T_Message可能要考虑分区。但是,⼤家会不会觉得消息正⽂复制那么多条对于这样的⽤户量来讲空间浪费太⼤,因为考虑到接收者⼀般是不修改
消息正⽂的,所以我们可以让所有接收者共享⼀条消息正⽂。具体数据库设计⽅法和上⾯⼤同⼩异:
T_Message
T_MessageText
这样,我们就⼤⼤节省了消息的存储空间,但是查询的时候就稍微⿇烦⼀点,就需要进⾏联合查询了,查询⾃⼰的未读消息可以这样(意思⼀下,可能还有更⾼效的查询⽅式):
合同订立⽤这种⽅法除了正⽂我们不能随便删除外,⽤户还是可以⾃⼰管理⾃⼰的消息。
家庭装修步骤3、百万级⼤⽤户量
如果⼀个⽹站到了百万级的⽤户量了,那我不得不膜拜该⽹站和⽹站经营者了,因为经营这样的⽹站⼀直是笔者的梦想:)好了,回归正题,如果这样的系统放你⾯前,让你设计⼀个站内信发数据库,你该何去何从,总之,上⾯两种常规的办法肯定是⾏不通了的,因为庞⼤的数据量会让消息表撑爆,即使你分区也⽆济于事。这时候作为⼀个系统架构师的你,可能不仅仅要从技术的⾓度去考虑这个问题,更要从⽤户实际情况去着⼿寻解决问题的办法。这⾥,有⼀个概念叫“活跃⽤户”,即经常
登录⽹站的⽤户,相对于那些⼀时冲动注册⽽接下来⼜从来不登录的⽤户来说,活跃⽤户对⽹站的忠诚度很⾼,从商业的⾓度来讲,忠诚的客户享受更⾼端的服务。
根据这个思路,我们来探索⼀种⽅法。假设⽹站有500万注册⽤户,其中活跃⽤户为60万(这个⽐例真很不错了),现在我们要对所有⽤户发⼀封致谢信。还是上⾯两张表,⾸先我们可以先往消息表中插⼊⼀条发标识为发标识为-1的消息,这⾥我们⽤字段SourceMessageId (原始消息)来标识(-1为原始发消息本⾝,其他则是原始消息id ),这样其实发的⼯作已经完成了,⽤户可以看到这条公共的消息了。但是⽤户需要有消息的控制权,所以必须让每个⽤户拥有⼀条⾃⼰的消息。要达到这个⽬的,我们可以让⽤户登录时检查是否已经拷贝原始消息,如果没有拷贝,则拷贝⼀份原始消息并插⼊消息表,发标识为原始消息的发标识为原始消息的id ;如果已经存在原始消息的拷贝,则什么都不做。这样,我们就只要为这60万活跃⽤户消耗消息空间就可以了。具体数据库设计如下:
T_Message
表T_MessageText与上⾯⽅法的⼀样。
qq黄钻退订当然,如果你的活跃⽤户达到100%,那这种⽅法相对前⼀种就没有优势了,但这种情况基本上不太可能,所以,笔者觉得这种⽅法来处理⼤⽤户量的消息发还是可⾏的。
4、总结
本⽂只是⼤致阐述了实现的原理,很多细节都忽略没有考虑,纯粹⼀个设计想法⽽已,有兴趣的朋友可以去⾃⼰实践⼀下,另外,笔者对数据库也不是很精通,如果有哪⾥阐述错误的还请指出,让我们⼀起进步。
5、如果你喜欢设计和架构,你可能还会喜欢以下⽂章
a卡和n卡的区别

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。