`

QQ的架构讨论

阅读更多

QQ的架构讨论

 

网址:http://groups.google.com/group/dev4server/browse_thread/thread/0d72668d11c4886b/a6d202489cabf285#a6d202489cabf285

 

hi, all:
    top说他那里现在无法访问google网站, 不知道各位能否正确访问?
    下面是代top发的他关于QQ架构的理解:

top(木……) 说:
    一个必要考虑的问题是登陆时要以地域就近的原则,提供最快的网络响应,所以实际服务应用层应与数据层耦合的.分段式管理可以运用在数据存储的分布式构架中,这是一个数据层的概念,即如何有效的组织分布式数据.因为QQ在实际操作中在即时通讯中需要查询的数据量极少,写入数据层的信息量在所有通讯量中也占很小的比重.所以考核负载可从服务应用层和数据层两方面来考虑.服务应用层主要考虑用户的时实性与服务器负载平衡问题.数据层主要考虑如何提供更有效的分布式存储方案.即采用黑盒的想法,我们在设计服务层时,可意想的认为我们象一个虚拟的数据服务器提出数据请求必然会获得响应.至于服务层如何实现认为是一个黑盒,无须考虑.接着我们只需考虑在服务层的各服务器上如何存储转发暂存取得的数据以提高效率(减少向虚拟数据服务器的查询量,减少与客户端的通讯量,减少服务层各服务器之间的通讯量为目的)

top(木……) 说:
    其实我们只是说了一个大框架,其实在服务器的配置功能的划分服务层网络的构架上有很多细节问题.这些要针对实际运用需求而分别配置,所以,在设计之前最好先将需求梳理归纳.不过这个工程玩大了,呵呵

    我(sodme)的观点:
    与top想法一样, 数据层是个黑盒, 相对独立. 至于其内部, 采用分段管理.

On 2/19/06, 大宝(sodme) <sodme.... @gmail.com> wrote:

> 关于我的思路的优缺点:

> 优点是:
> 这样的思路类似于现实生活中电话号码的管理,它是分地区的,也就是分段的,我个人认为这样以后的扩展相对来说可能简单一点.

> 缺点是:
> 作为一个解决方案,这个思路并没有充分考虑到根据当前用户在线数来实现动态平衡的目标.比如说1~100万内的在线人数很少,而100万~200万号内在线的人很多,那么这两个不同号段的服务器负载就会完全不一样,从而浪费了服务器资源.

> 克服缺点的办法:
> 如果要实现完全根据当前在线用户数来实现服务器负载的动态平衡,那就得将chat server与db server拨离, 让chat
> server这一层完全按动态均衡的思路来作,
> 而db这一块的工作,可以抽象成一个数据管理层来作,但具体的用户数据存储仍然采用分段存储的方式,为不同的号段作不同的数据库存储. 而chat
> server这一层的思路, 基本上也是master + chunk的方式,客户端最终仍然是与chat保持长连接.

> 在 06-2-19,大宝(sodme)<sodme.... @gmail.com> 写道:
> > 很高兴能看到大家积极讨论,这两天针对于这个问题,我也有了一些自己的初步想法,拿出来与大家共享.

> > 前两周,听杭州研究院的同事介绍了海量数据存储方面的东西,这个讲座对我还是有点启发的.其中,在介绍有关GFS(GOOGLE自己的文件系统)的内容时,他阐述了这样一个思想:高性能的应用系统,并不全是由高性能的硬件服务器来支持的,甚至,他们有时更多的就是一些普通的服务器,而再甚至,他们可能是目前已经不是市场主流的废旧机器,我们就是要在这些廉价的硬件基础上,通过我们的架构设计和软件设计完成可观的高性能应用,这才是我们所应该追求的目标,也是符合绝大多数网络公司发展现状的选择,因为网络应用系统所承载的未来用户数是不可预期的,它只会不断增大.

> > 如果有需要的朋友,我可以给你们发一份当时讲座用到的GFS资料.在谈到GFS的时候,我觉得对于我而言,收获最大的就是chunk server
> > 与 master server之间的分工,让我很受启发.简单地说,chunk server才是负责作真正逻辑的地方,而master
> > server只是作了一个中介者,传递了一个信息而已,在具体的应用环境中,GFS client会向master
> > server询问所要查询的数据文件在哪个chunk server上,然后GFS client就会与chunk server之间直接进行通信.

> > 说到QQ的架构,我想我们现在更多的是站在自己已有的知识架构上去想象和理解它,或者说,这个讨论的主题是这样更为合适些:"如果让你作QQ的网络架构,你会怎么作?"不然,当我们在这时煞有介事地讨论QQ架构的时候,腾讯的朋友看到了,可能会觉得我们讨论的与他们实现的差别太大.所以,我想,我下面的发言内容,将会以这个主题来进行:如果让我来作QQ的架构,我会怎么作?

> > OK,现在我就把自己当作是一个QQ架构的设计者,我想象一下我会怎样在廉价的硬件服务器基础上去搭建这样的一个海量用户的网络应用系统.

> > 在讨论问题时,我喜欢把问题细化.我们先看一下QQ在聊天(请注意:先只谈聊天)方面具有哪些大致的功能.对于一个网络聊天程序而言,它会具有以下大致功能:
> > 1.账号管理(包括注册,登录验证等)
> > 2.好友管理(包括好友的增,删,黑名单的增,删)
> > 3.消息通知(用户上下线信息的转发,离线消息转发)

> > 总体而言,我把QQ系统的设计难点归纳为两个:一是应用服务器如何部署,二是数据库如何部署.下面,是我的设计思路.

> > 我的基本设计思想是:把QQ号按分段的思想进行管理(比如每100万是一个号段),每段是一个单独的QQ管理集群(暂且称为QQ server
> > cluster),每个集群之间通过分布式架构支持海量用户在线.同时,会有一个全局唯一的QQ master
> > server存放全局索引信息,这些信息将主要包括:号段所对应的服务器信息及状态. QQ
> > cluster的主要组成,将同时包括:应用服务器(称为QQ chat server)和数据库服务器(QQ db
> > server).我的可扩展架构设想是:当发现现有的用户数已经接近饱和状态时,只要增加一个相对独立的cluster,并把这个新的cluster的相关信息注册到全局唯一的QQ
> > master server上即可.

> > 每一个QQ server cluster应该提供哪些基本服务:
> > 1.对于客户端,每个cluster是一个相对独立的逻辑组,它承担了用户需要服务器支持的大多数逻辑,比如:好友上下线消息通知,离线消息转发等.
> > 2.同时,对于其它的cluster,要向它们提供这样的接口:好友在线状态查询,用户详细信息查询等.
> > 3.为了实现P2P,还要打通两个客户端之间的UDP通信通道.
> > 4.当客户端选择采用TCP进行通信时,还要负责消息的转发.

> > 那么,每一个cluster里的db都存放了哪些信息呢?
> > 1.存放属于本段用户的详细个人资料(包括除了必要的昵称信息等之外,还包括诸如:年龄,住址等的详细信息)
> > 2.存放好友名单及黑名单(而在这两个名单中,在本地的db上应该只包括必要的基本信息:好友QQ号,好友昵称等)

> > 当客户端登录时,客户端首先只能获得好友的简单信息,如果要想获得详细详细,就需要向本号段的cluster查询,如果cluster发现好友的号不在本号段内,它会向其它cluster查询好友的详细信息(当然,这里的查询方法也是有多种方式的).

> > 说到这里,还有很重要的一点,QQ的登录又该如何来处理呢?

> > 1.首先,我会设置若干个(假设n个)对外开放的登录域名(比如login01.qq.com~login08.qq.com),这些域名中的每一个是可以同时指向多个登录服务器(称为QQ
> > login server)IP的,这样可以有效分担连接负载;
> > 2.当客户端连接到login server之后,login server将对用户进行账号认证,成功后,会向客户端发送一个cluster
> > server的ip,将客户端引导到cluster上去;
> > 3.一旦客户端连接到cluster上成功后,所有的逻辑就由cluster来控制了.

> > 当然,这里仍然还有很多细节问题要考虑,比如:对于这样的分段管理,每个cluster中的QQ chat
> > server可能一个还不行,那这些chat server之间就要考虑还要加一个chat
> > master了.不过,这样的话,分层是不是多了一点呢?还有待更进一层的细想,等我想清楚了详细设计方案的时候,会以附件的形式配以图表发上来,此文全当一个引子.

> > 2006/2/19, top(木) <zergseptem... @gmail.com>:

> > > 象QQ这样的规模是采用分布构价的,有点象DNS服务器不是完全一样,但是可以用来理解巨大的访问量可以被复数的服务器分担。QQ的服务器也应该分DS、NS、SB三种或其他若干,其实就是在实际应用中服务器设置的比例不同,我不知道非会员是否服务器需要记录聊天记录如果不要NS负荷也不大,在线也不用实时连接的这样NS的负荷就大幅度下降了。而P2P是QQ用户之间交换数据于服务器无关忽略不计。而离线问题,只有在一位用户已经不在线的情况下,才向服务器发送聊天记录,或者该用户是会员在向对方发送记录的同时在向服务器发送记录,这样服务器只需要处理会员的聊天记录和暂时无法到达的聊天记录。一台服务器用10万的并发流量来说(理论),而且10W个用户并非同时向服务器发送记录。用户登陆由DS
> > > NS负责的,通知到所有的好友。这个由其他服务器负责,登陆、离线发生的频率更加稀疏。这样负载不会很大。其实不够了再加服务器。关键是构架可以扩展。对于数据库我觉得他们是采用分布式数据库。QQ对用户没有汇总式查询。将一些用户的数据放在树的某的节点上。可以把每个节点设置成数据服务器。这样就把查询量分散了。所有数据并不在一台服务器上,QQ应该是分布式的因为理论上不需要汇总数据,除非需要高效的汇总查询。

 

分享到:
评论

相关推荐

    基于QQ的软件体系结构剖析.zip

    本篇将从QQ的架构设计、模块划分、通信机制、数据存储和安全策略等多个方面进行详细剖析。 一、QQ软件体系结构概述 QQ的软件体系结构遵循了客户端-服务器(Client-Server,C/S)模式,这种模式下,用户通过客户端...

    QQ的架构讨论.doc

    ### QQ架构设计中的关键技术点分析 #### 登录时的负载处理 登录阶段是任何即时通讯系统面临的关键挑战之一,尤其是在用户基数庞大且活跃度高的情况下,例如QQ这种拥有数亿用户的平台。为了确保用户能够快速、顺畅地...

    防QQ讨论组头像

    在Android平台上,开发一款应用程序来模仿QQ讨论组的头像并进行优化,是一个涉及到多个技术领域的挑战。这个项目,名为"android-combination-avatar-master",显然旨在创建一个支持多种分辨率的自定义头像组件。下面...

    qq讨论组怎么建.docx

    - **灵活性**:讨论组相比于传统的群聊,更适合短期、特定目的的交流,因为讨论组没有固定的结构,成员可以根据需要加入和退出。 - **隐私性**:讨论组通常只包含必要的参与者,这使得信息更加私密,避免无关人员...

    QQ聊天分类 QQ聊天信息的加密 QQ所用的大致技术

    文件名“QQ软件所用的表.txt”可能包含了QQ软件内部使用的各种数据表结构,这些表可能是用于存储用户信息、聊天记录、好友关系等核心数据。"QQ聊天分类.txt"可能详细解释了QQ的各类聊天模式及其特点。"QQ所用的大致...

    QQ程序,腾讯qq

    它的界面设计和功能集成了多种通信和社交元素,使得用户能够方便地进行文字、语音、视频聊天,发送文件,以及加入群组和讨论组等。"模仿QQ界面"通常指的是开发者或爱好者尝试复刻或基于QQ的设计理念来创建自己的应用...

    C#仿qq设计

    下面将详细讨论涉及到的C#编程和QQ设计的相关知识点。 1. **C#语言基础**: C#是微软公司推出的一种面向对象的编程语言,广泛应用于Windows桌面应用开发、游戏开发和Web应用。在“仿qq设计”项目中,C#的类、对象...

    类似与腾讯QQ的企业QQ

    其次,企业QQ具备强大的组织架构管理能力。企业可以根据实际结构创建部门和岗位,员工账号自动关联到相应的组织单元,便于管理层级的管理和信息分发。此外,它还提供了权限管理功能,管理员可以控制不同员工的使用...

    读书笔记:《Spring Cloud与Docker微服务架构实战》配套代码。讨论QQ群731548893.zip

    读书笔记:《Spring Cloud与Docker微服务架构实战》配套代码。讨论QQ群731548893

    QQ 协议

    对于开发者来说,阅读这些文档和讨论可以更好地理解QQ协议的细节,并从中学习如何在C++中实现相应的功能。 总的来说,理解和实现QQ协议是一个涉及网络编程、数据处理、加密技术等多个领域的复杂任务。开发者需要对...

    java--QQ java--QQjava--QQjava--QQ

    4. **文件结构**:项目中至少有一个名为"java(QQ)"的文件,这可能是核心代码所在,负责处理与QQ相关的逻辑。 5. **编程实践**:开发者可能在学习或实践中遇到了与Java和QQ服务整合相关的问题,比如授权流程、数据...

    QQ代码简单的

    4. **数据结构与算法**:为了高效地存储和检索用户信息、聊天记录等数据,需要理解并运用合适的数据结构(如链表、树、队列、哈希表等)和算法(如排序、搜索等)。 5. **安全与隐私保护**:QQ程序需要考虑用户的...

    QQ号码交易网站源码

    在分析提供的压缩包子文件"728"时,由于没有具体的文件内容,我们无法深入讨论代码实现和细节。通常这个文件可能是源码的一部分,可能包含了网站的HTML、CSS、JavaScript、图片或其他资源文件。为了评估和使用这个...

    微信小程序-模仿QQ小程序

    开发者可能复刻了QQ的一些特性,如聊天、好友添加、动态展示等功能,并结合了知乎的问答、话题讨论等元素,以此来全面地展示微信小程序的开发能力。 开发过程中,开发者需要掌握以下几个关键点: 1. 数据绑定:...

    QQ喊话工具.rar

    易语言社区提供了丰富的学习资源,包括教程、论坛讨论和代码示例,可以帮助你更好地理解和使用易语言开发QQ喊话工具。同时,对于QQ API的使用,可以参考腾讯官方的开发者文档。 总的来说,通过分析和学习易语言QQ...

    绘制qq群的基础用例图

    高层用例图是用于描述系统高层次功能的模型,它帮助我们理解QQ群的整体架构以及各部分之间的关系。例如,创建群组用例可能涉及以下子步骤:选择群类型、设定群名称、上传群头像等。 #### QQ群用户组成用例图 QQ群...

    QQ空间的小工具(包看QQ好友是否在线)

    "QQ空间的小工具(包看QQ好友是否在线)"这个标题暗示了我们这里讨论的是一个能够查看QQ好友在线状态的应用或者扩展。 在QQ空间中,用户可以通过各种小工具来增强他们的社交体验。这些小工具通常是一些轻量级的应用...

    最新linux下QQ,适合各种版本linux平台

    这个最新的版本,"linuxqq_v1.0.2-beta1_i386",适用于多种Linux发行版,无论你是使用Ubuntu、Fedora、Debian还是其他基于Intel x86架构的Linux系统,都可以轻松体验到与Windows或Mac OS上类似的QQ功能。 首先,让...

    vb写的qq程序,直接登录qq

    基于这个项目,我们可以深入讨论以下几个相关的知识点: 1. **Visual Basic基础**:VB是Microsoft开发的一种面向对象的编程语言,以其简单易学而受到初学者欢迎。在VB中,可以通过控件拖放、事件驱动编程等方式快速...

    .net做的QQ程序

    本文将深入剖析.NET平台如何被用来构建这样一个复杂的通讯应用,并讨论相关的技术要点。 首先,.NET框架是由微软公司推出的面向对象的开发平台,它提供了丰富的类库和开发工具,支持多种编程语言,如C#、VB.NET和F#...

Global site tag (gtag.js) - Google Analytics