站内信

http://daihaixiang.blog.163.com/blog/static/3830134201111155381735/

如果一个网站到了百万级的用户量了,那我不得不膜拜该网站和网站经营者了,因为经营这样的网站一直是笔者的梦想:)好了,回归正题,如果这样的系统 放你面前,让你设计一个站内信群发数据库,你该何去何从,总之,上面两种常规的办法肯定是行不通了的,因为庞大的数据量会让消息表撑爆,即使你分区也无济 于事。这时候作为一个系统架构师的你,可能不仅仅要从技术的角度去考虑这个问题,更要从用户实际情况去着手寻找解决问题的办法。这里,有一个概念叫“活跃 用户”,即经常登录网站的用户,相对于那些一时冲动注册而接下来又从来不登录的用户来说,活跃用户对网站的忠诚度很高,从商业的角度来讲,忠诚的客户享受 更高端的服务。

根据这个思路,我们来探索一种方法。假设网站有500万注册用户,其中活跃用户为60万(这个比例真很不错了),现在我们要对所有用户群发一封致谢信。还是上面两张表,首先我们可以先往消息表中插入一条群发标识为-1的 消息,这里我们用字段SourceMessageId(原始消息)来标识(-1为原始群发消息本身,其他则是原始消息id),这样其实群发的工作已经完成 了,用户可以看到这条公共的消息了。但是用户需要有消息的控制权,所以必须让每个用户拥有一条自己的消息。要达到这个目的,我们可以让用户登录时检查是否 已经拷贝原始消息,如果没有拷贝,则拷贝一份原始消息并插入消息表,群发标识为原始消息的id;如果已经存在原始消息的拷贝,则什么都不做。这样,我们就只要为这60万活跃用户消耗消息空间就可以了。具体数据库设计如下:

T_Message


1

2

3

4

5

6

7

Id                  bigint      --消息ID

SenderId            bigint      --发送者ID

ReceiverId          bigint      --接收者ID,如果为原始群发消息则为-1

SendTime            datetime    --发送时间

ReadFlag            tinyint     --已读标志,如果为原始群发消息则统一为0未读

SourceMessageId     bigint      --如果为-1则为原始群发消息,其他则为原始消息id

MessageTextId       bigint      --这里把消息正文内容换成消息正文Id

表T_MessageText与上面方法的一样。

当然,如果你的活跃用户达到100%,那这种方法相对前一种就没有优势了,但这种情况基本上不太可能,所以,笔者觉得这种方法来处理大用户量的消息群发还是可行的。

4、总结

本文只是大致阐述了实现的原理,很多细节都忽略没有考虑,纯粹一个设计想法而已,有兴趣的朋友可以去自己实践一下,另外,笔者对数据库也不是很精通,如果有哪里阐述错误的还请指出,让我们一起进步。

5、如果你喜欢设计和架构,你可能还会喜欢以下文章

Facebook和人人网的网站后台架构对比

facebook图片存储架构技术全解析

各大网站架构总结笔记

一步步构建大型网站架构

大型网站架构不得不考虑的10个问题

时间: 2024-10-29 11:34:01

站内信的相关文章

开源 免费 java CMS - FreeCMS1.9 站内信

项目地址:http://www.freeteam.cn/ 站内信 管理站内信数据. 1. 站内信 从左侧管理菜单点击站内信进入. 2. 发送 系统管理员可以直接发送站内信给会员. 点击"发送"按钮. 选择需要发送的会员,输入标题内容后点击"发送"按钮. 3. 查看 在站内信列表中直接点击标题可以查看站内信的详细信息. 4. 删除 选择需要删除的站内信,然后点击"删除"按钮. 提示:同时可以删除多个站内信. 为了防止误操作,系统会提示用户是否删除,

ASP.NET 实现站内信功能(点对点发送,管理员群发)

正好这段时间在研究这个功能,还是得感谢这位大神,没有他的引路,我就不可能把站内信做出来. http://www.cnblogs.com/grenet/archive/2010/03/08/1680655.html 哈哈,再次感谢. 我们先来说说单点传送站内信,所谓的单点传送,就是用户与用户之间的短信发送,这里的用户可以是一个人,也可以是多个人, 上面的文章大家如果看了的话,想必有一个疑问,就是用户的阅读状态怎么定义? 我这里给大家一种解决方案,再建立一张表,也就是说,建立一张用户阅读状态表,因为

2015/05/13~研发站内信中遇到的问题

1.业务场景 管理员向其他管理员.商家.用户发送站内信,商家向用户发送站内信. 在用户基数百万级时,每次全站的站内信,都面临百万级数据的插入:用户每次访问都面临大量数据的查询操作... 2.调研 mysql单库最大容量: mysql单表最大容量: mongodb性能测试: 3.设计方案一 消息表: 消息id,消息主题,消息内容,发送时间 消息用户表

开源 免费 java CMS - FreeCMS2.1 会员站内信

项目地址:http://www.freeteam.cn/ 站内信 1.1.1 写信 从左侧管理菜单点击写信进入. 输入收信人.标题.内容后点击发送按钮. 1.1.2 收件箱 从左侧管理菜单点击收件箱进入. 查看站内信 点击标题可以查看站内信详细内容. 删除站内信 选择站内信然后点击删除按钮可以完成删除操作. 为了防止误操作,系统会提示用户是否删除,点击"确定"完成删除操作. 1.1.3 发件箱 从左侧管理菜单点击发件箱进入. 查看站内信 点击标题可以查看站内信详细内容. 删除站内信 选

开源 java CMS - FreeCMS2.3 站内信

原文地址:http://javaz.cn/site/javaz/site_study/info/2015/25048.html 项目地址:http://www.freeteam.cn/ 站内信 管理站内信数据. 站内信 从左侧管理菜单点击站内信进入. 发送 系统管理员可以直接发送站内信给会员. 点击"发送"按钮. 选择需要发送的会员,输入标题内容后点击"发送"按钮. 查看 在站内信列表中直接点击标题可以查看站内信的详细信息. 删除 选择需要删除的站内信,然后点击&q

6_2_站内信

站内信 一 需求描述 站内信是当前用户与所有用户间对话的一个功能. 站内信模块需实现三个功能: 1. 互相发送站内信(写出接口,没有单独页面,用@ResponseBody直接在Postman进行验证): 2. 显示当前用户的所有站内信(与多个用户间): 3. 显示当前用户与某个指定用户间的对话消息. 二 具体实现 实现流程:DB>Model>Dao>Service>Controller>HTML 1.DB创建表Message 1 DROP TABLE IF EXISTS `m

开源 java CMS - FreeCMS2.3会员站内信

原文地址:http://javaz.cn/site/javaz/site_study/info/2015/30531.html 项目地址:http://www.freeteam.cn/ 站内信 写信 从左侧管理菜单点击写信进入. 输入收信人.标题.内容后点击发送按钮. 收件箱 从左侧管理菜单点击收件箱进入. 查看站内信 点击标题可以查看站内信详细内容. 删除站内信 选择站内信然后点击删除按钮可以完成删除操作. 为了防止误操作,系统会提示用户是否删除,点击"确定"完成删除操作. 发件箱

【设计用例】站内信

[站内信]也被称作[站内消息],如果验证它呢?需要考虑的无非是2个方面: 功能验证 - 是否覆盖了所有的场景(开发人员会在代码里注释出来 会触发站内消息的场景 把这些沟通并记录下来 以免设计用例有所遗漏) 样式验证 - 站内消息里面包含的文字描述是否得到了正常的展示

“站内信”的实现

站内信分为"点到点"和"点到面","点到点"属于私信,用户之间传递的信息,一对一传递."点到面",属于系统消息或者公共信息,属于一对多发送. 站内信的设计既要考虑到投递的准确性(也就是该收到的人能收到信息),也要考虑信息持久化存储空间占用问题,在他的第一篇博文中详细进行了介绍. 我们在此仅把第三种情况拿出来说明,也就是用户量为百万级,活跃用户只占其中的一部分. 数据库的设计: 表名:Message ID:编号:SendID:发