`
ansn001
  • 浏览: 93770 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

大型网站架构系列之四,多对多关系的以及并发缓存的设计

阅读更多

多对多关系以及多表查询优化处理
 
上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在2.0时代,这种简单的列表索引已经远远实现起来是问题的,多对多关系将是最常见的关系。现在我们针对web2.0数据中广泛存在的多对多关系进行阐述和具体行为判断,比如一个很简单的例子,在2.0时代,好友功能是最常被用到的,每个用户会有很多的好友,同时也会是很多人的好友,那么这个数据量将会是用户数的平方的级别。同样,对于文章标签,每个文章可以有多个标签,而每个标签又可以有多个文章,这又是一个几何乘积,数据量又会是个天文数字。这里不再介绍基于硬件,IO,集群方面的问题,我们以项目开发的角度来实现他
 
这里先介绍一个基本的施行方案,而后我们进一步的对它进行扩充以满足我们的以后的具体需求
 
对于多对多关系,传统的处理方案有三种,一种是通过SEARCH的方法来实现,第二一种是通过另建一个索引表,存贮对应的ID以进行存贮,第三种是通过二次归档缓冲来实现(本人不知道用什么语言来描述这种处理方法,姑且如此吧)
 
对于第一种方案,因为要涉及大量的LIKE查询,性能不敢恭维,基于全文索引的方式可能解决这个问题,但是利用第三方的数据可能未必能适合我们的胃口,我们也可能没有足够的时间和精力来独立开发实现。第二种的情况下,数据库的行的数量也是惊人海量级别的,维护索引表的散列处理,并且要跨表跨区查询,还要维护数据的唯一性,数据处理过程相 当的复杂性能也就不言而喻了。
 
文入正题,下面以一个简单的例子解释下第三种方案,对数据多对多关系举出来具体的解决方案,我们这里以标签和文章之间的多对多关系为例来讲解,大家可以举一反三的思考群组和用户之间,相册和被圈用户之间等等复杂的多对多关系,如下方案可能不是最好的方案,但是实践证明还是综合时间和开发成本是最合理的。
 
首先滤清一下流程,在传统的数据库设计中我们是如下走的:当一篇博文发布的时候并插入标签的时候一般是三步走(也可以理解为四步,以为还要判断标签是否存在的问题),第一步插入文章数据库并获取文章的ID,第二步插入标签数据库同时查询标签是否存在,如果存在就取出标签的ID,否则的话插入新标签并取出ID,第三部,将文章的ID和标签的ID插入索引表来建立关联。如果这个时候在索引表上建立了索引的话就是灾难性的,特别是在数据量大的情况下,尽管它可以有效的提高查询速度,但是发布的速度可能就会让人无法忍受了。
 
我们处理的方法也是四部曲,对多对多关系进行进一步的处理。
用标签的时候,我们用的最多的就是查询标签下的文章和显示文章的标签,所以我们实现这例就成了。
第一步,数据冗余
老生常谈的话题,对文章做冗余,加一个TAG列,我们可以讲TAG的标签如下写[TagID,TagName]| [TagID,TagName]| [TagID,TagName] 同样对于TAG表,我们做如下冗余加个Article字段,如下内容[ArticleID,Title]| [ArticleID, Title]| [ArticleID, Title],在需要增加的时候我们只要APPEND一下就可以了,至于ARTICLE的结构和TAG的结构可以参考我上一篇文章的介绍。其实根据需要还可以存贮更多。
有人会问,为什么要存贮TagName和 ArticleTitle呢,其实是为了避免跨表查询和INNERJOIN查询来做的,In查询和跨表查询会造成全表遍历,所以我们在执行的时候In查询是必须要找到一个有效的替代方法的。关于数据冗余的问题,我们可能还会做的更变态一些,这个后面慢慢说。
 
第二步:异步存贮。
在设计模式下我们常思考的是单件模式,我们采用另类的单件模式思维来处理,也就是把文章和标签之间的索引作为专门的进程来做,异步的实现。
为了避免文章在发布的时候以为要检查TAG表而造成的线程拥堵,我们需要采取延迟加载的方案来做。服务器应该维护一个进程专业的对标签和文章地段的查询和索引,我们在发布文章的时候应该把标签同步这一块托管给另外的一个进程或者服务器进行处理,并进行索引。
 
第三步:二次索引:
对于频繁的判断标签去或者热门的标签我们还可以在内存里组织一套有效的索引,比如对于标签“疯狂代码”,我们用树来把它表示出来。对于疯狂代码我们索引一个疯,其实用程序表达就是疯狂代码[0]。而在数组”疯”中存贮以疯开头的标签组,以”傲”的数组中存贮以”傲”开头的标签。如果量更大的话还可以再做N级索引,将这些常用的标签对应设计内存索引,我们可以把它想象的理解为内存中的 Suggest(比如google搜索时的Suggest),使用中我们可以直接拿来使用
第四步:针对跨表查询的处理
很多情况下,我们可能避免不了多表查询,或者 IN,or查询,除去业务层封装的分区视图集群之外,我们还可以处理的更好,在很多情况下,我们的查询会是非常频繁非常统一的(这里的统一指热门查询),比如在SNS中常见的性别,嗜好等多条件搜索,而这些数据可能存贮在多个数据表结构中,而这样会吧不可避免的会产生全表遍历查询。
处理方法也很简单,把原来散列的垂直分割的表再合并起来,合并到另外的只读的订阅服务器上,然后做适当的结构优化和索引,剩下的大家应该明白我的意思了,虽然简单,但是这种处理方法非常适合以后服务器的横向扩充。
 
以上是对多对多关系和多表查询的一个简单的架构说明,肯定有人会问,如果这样做的话工作量不是太大了吗,分词处理什么的,对每个多对多关系进行处理。
OK咱们可以进一步的把它来抽象化我们用TableA 表示Article表用TagbleT表示Tag表,我们可以讲字段抽象化出来,也就是一个ID,一个Tag的String 同理对于标签表也是如此。朋友们应该可以理解我的意思了。
 
对,就是做个代码生成器把对应的多对多关系给生成出来,这个很好写的,几个Append就可以搞定。如果想更方便的处理,那么把这个东西做成单件的模式抽象化出来,然后再违反一下原则,做成基类,其他关系继承这个基类。。。。。剩下的应该很简单了,具体实现大家思考吧。
 
让并发来的更猛烈些吧,高并发环境下的数据处理方案
 
对于高并发性质的网站,在sns特别是webgame方面应该是最容易也是最难处理的地方了,容易处理的是如果是纯粹基于数据库驱动也就是 select和update的问题,而难的地方也是不是select而是update,在高并发的驱动下,update经常会超时,虽然我们可以在 finally把它处理掉,让人郁闷的是,数据库连接池仍然会饱和,数据仍然会丢失….
 
上面的情况是非常常见的web项目失败的原因之一,在数据飞速膨胀和并发呈几何级增长的情况下,制约我们的可能是io,database本身的问题了,让我们头痛的是不管是哪种数据库,Oracle也好,mysql也好,sqlserver也好都会timeout,而且是频繁的timeout频繁的Exception。这个时候就需要我们的应用程序在处理的前期就应该考虑到的,一个好的数据缓存策略常常决定了我们的成败,而缓存策略也是web项目最难以测试和最容易出错的地方。
 
在大型网站架构中,最关键最核心的也是缓存策略了,介于其复杂性,这里只简单的介绍一下基于高并发数据库缓存方案,后面的将详细介绍常用的缓存策略。这个方法与其叫缓存不如叫数据缓冲,其实也是异步更新数据,根据负载情况不同,我们哪怕仅仅将数据缓冲1秒,带来的负载提升就已经非常好了。
 
实现原理很简单,将并发的更新首先缓存到一个应用程序池中,然后定时查询(注意这里的方案应和缓存方案具体结合,这里只介绍概要情况)。
 
传统的update请求处理流程是:请求—》应用程序—》更新数据库,如下图:
 
 
数据缓冲和更新部分可以在数据层里独立实现,也就是update的传递的时候首先传递缓冲池,然后定时更新,这里需要注意的数据缓冲池的还要做的另外一份工作就是全局的数据缓存,缓存数据更新到数据这段的时间间隔,我们可以理解为临时表,再提取上下文请求的即时信息的时候首先从缓冲池里读取(这里有很多技巧,比如巧妙的利用cookie,session做;临界条件判断),流程如下图所示
 
上面简单的介绍了一下基于数据更新缓存的处理,下篇具体详细介绍基于并发更新机制的详细缓存处理机制
分享到:
评论

相关推荐

    疯狂代码,大型网站架构系列

    "疯狂代码,大型网站架构系列之四,多对多关系的以及并发缓存的设计 - 与三雷同.doc"可能继续深入讨论多对多关系的优化,但更侧重于并发环境下的缓存策略。在高并发场景下,缓存能显著提升性能,但同时也带来了数据...

    疯狂代码,大型网站架构系列之一

    ### 大型网站架构设计的关键知识点 #### 一、海量数据处理 在构建大型网站时,数据处理能力是首要考虑的问题。与小型站点相比,大型网站每天可能产生数百万条数据,这要求系统具备高效的数据处理机制。在设计初期...

    大型网站技术架构:核心原理与案例分析 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    在构建大型网站技术架构时,面对亿级流量的挑战,我们需要深入理解并应用一系列核心原理与最佳实践。这两本书——《大型网站技术架构:核心原理与案例分析》和《亿级流量网站架构核心技术 跟开涛学搭建高可用高并发...

    大型网站架构系列之一 不得不考虑的问题

    在构建大型网站架构时,需要面对一系列复杂的问题,这些问题直接影响到网站的性能、稳定性和安全性。以下是关于这些关键问题的详细分析: A. 海量数据的处理:随着用户数量和数据量的增长,传统的数据库查询方式...

    大并发架构设计.pdf

    这需要从系统架构的多个层面入手,包括但不限于前端服务器、负载均衡、应用服务器、数据存储以及分布式缓存等。设计中需要解决如何实现水平扩展、负载均衡以及状态共享等问题,保证用户请求能够被快速响应。 3. 高...

    大型网站架构系列文档

    ### 大型网站架构系列文档 #### 一、海量数据的处理 对于小型网站而言,其数据量通常较小,简单的 `SELECT` 和 `UPDATE` 操作足以满足需求,加之合理地添加索引,就能有效应对大部分场景。然而,对于大型网站而言...

    《大型分布式网站架构设计与实践》 Java 并发编程实战

    《大型分布式网站架构设计与实践》是一本深入探讨如何构建高效、可扩展的分布式系统的技术专著,结合了Java并发编程的实际应用。本书旨在帮助读者理解在高流量、大规模应用场景下,如何通过精心设计的架构和Java并发...

    大型网站架构资源集合

    7. **大型互联网网站架构心得之二并、换和其它.mht**:这部分内容可能深入探讨了数据并行处理、数据库交换策略以及其他与性能优化相关的技术,以应对大数据量和高并发场景。 8. **Linux服务器集群系统的体系结构....

    [高清]大型网站技术架构 核心原理与案例分析+李智慧.pdf

    这本书深入浅出地介绍了大型网站在应对高并发、大数据量、高可用性等挑战时所采用的技术策略和实践经验,是IT行业中尤其是互联网开发者和架构师的重要参考资料。 首先,书中详细讲解了网站架构的基础知识,包括软件...

    大型分布式网站架构设计与实践 PDF(带目录清晰完整版)

    ### 大型分布式网站架构设计与实践 #### 一、引言 在当前互联网时代,随着用户数量的急剧增加以及业务复杂度的不断提高,传统的单体应用架构已经无法满足高并发、高性能的需求。因此,越来越多的企业开始采用...

    大型高并发web应用系统架构分析与设计

    综上所述,大型高并发Web应用系统的架构设计需要综合运用多种技术手段,包括但不限于CDN内容分发、负载均衡、缓存加速、高性能Web/应用服务器以及分布式文件系统和数据库等。通过对这些技术的合理配置和优化,可以...

    亿级流量电商详情页系统的大型高并发与高可用缓存架构实战-未加密

    总结,构建亿级流量电商详情页系统的大型高并发与高可用缓存架构,需要考虑缓存策略、高并发处理、高可用设计等多个层面,并结合Java相关缓存库进行优化。这不仅可以显著提高系统性能,还能增强系统的稳定性和可靠性...

    网站--高并发web架构

    在IT行业中,高并发Web架构是构建大型、高性能互联网应用的核心技术之一。它涉及如何处理大量用户同时访问网站或服务的场景,确保系统的稳定性和响应速度。以下是对高并发Web架构的详细阐述: 1. **负载均衡**:当...

    架构师之路--大型网站技术架构与解决方案

    大型网站技术架构不仅仅关注于代码的编写和功能的实现,它更是一个系统的工程,需要考虑到高并发处理、数据一致性、系统安全性、服务的可伸缩性、用户体验等多个方面。 架构师在设计技术架构时,首先需要根据业务...

    高并发高负载大型网站系统架构

    【高并发高负载大型网站系统架构】是指设计和构建能够处理大规模用户访问、高并发请求的网站系统。这种系统架构必须具备高安全性、高稳定性、高并发处理能力和高负载承受能力,以应对如淘宝等大型电商平台所面临的...

    大型分布式系统中的缓存架构

    在选择和设计缓存架构时,需要考虑系统的特定需求,如并发量、数据规模、数据过期策略以及对高可用性和扩展性的要求。正确地使用缓存能够显著提升系统性能,但也会带来数据一致性、缓存穿透和雪崩等问题,因此在设计...

    大型网站分布式架构高并发高可用可扩展技术

    在构建大型网站的过程中,面临的核心挑战之一是如何处理高并发访问,保证系统高可用,并具备良好的可扩展性。本文将深入探讨分布式架构在此方面所扮演的关键角色,以及相关的技术实践。 一、分布式架构基础 分布式...

    大型分布式网站架构设计与实践

    《大型分布式网站架构设计与实践》是一本深入探讨如何构建高效、可扩展、高可用性的分布式网站架构的专业书籍。在互联网行业中,随着用户量的急剧增长和业务需求的复杂化,传统的单体架构已无法满足需求,分布式系统...

    大型门户网站架构设计

    ### 大型门户网站架构设计 #### 一、三层架构简介及其局限性 ##### 1.1 三层架构原理 三层架构是一种常见的软件架构模式,它将应用程序分为三个逻辑层:应用表现层、业务逻辑层和数据访问层。这种分层方式有助于...

Global site tag (gtag.js) - Google Analytics