`
ahuango
  • 浏览: 56796 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】疯狂代码,大型网站架构系列之四,多对多关系的以及并发缓存的设计 - 与三雷同

阅读更多
http://www.crazycoder.cn/Yuanchuang/Article52777.html

多对多关系以及多表查询优化处理

上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在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"可能继续深入讨论多对多关系的优化,但更侧重于并发环境下的缓存策略。在高并发场景下,缓存能显著提升性能,但同时也带来了数据...

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

    ### 大型网站架构设计的关键知识点...综上所述,大型网站架构设计是一个复杂的系统工程,涉及数据处理、并发控制、存储优化、安全防护等多个维度。只有综合考虑这些关键因素,才能构建稳定、高效、安全的大型网站系统。

    05-一线大厂Redis高并发缓存架构实战与性能优化-ev.rar

    05-一线大厂Redis高并发缓存架构实战与性能优化_ev.rar05-一线大厂Redis高并发缓存架构实战与性能优化_ev.rar05-一线大厂Redis高并发缓存架构实战与性能优化_ev.rar05-一线大厂Redis高并发缓存架构实战与性能优化_ev...

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

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

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

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

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

    架构师在大型网站的建设和发展中扮演着至关重要的角色,他们的工作涉及到了网站技术架构的设计、优化与问题解决方案的制定。大型网站技术架构不仅仅关注于代码的编写和功能的实现,它更是一个系统的工程,需要考虑到...

    大并发架构设计.pdf

    在面对互联网应用高并发场景时,系统架构的设计至关重要。大并发架构设计旨在确保系统在面对大量用户同时访问时仍能保持高性能、高可用性和高可靠性。以下详细解析了大并发架构设计中涉及的关键知识点。 1. 高质量...

    网站--高并发web架构

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

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

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

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

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

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

    ### 大型高并发Web应用系统架构分析与设计 #### 引言 随着互联网技术的飞速发展,大型高并发Web应用系统已经成为许多企业和组织的关键基础设施之一。这类系统的稳定性、可扩展性和性能对于保障用户体验至关重要。...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    深入地讲述了大型分布式网站架构设计的核心原理,并通过一些架构设计的典型案例,帮助读者了解大型分布式网站设计的一些常见场景及遇到的问题。 作者结合自己在阿里巴巴及淘宝网的实际工作经历展开论述。《大型...

    大型分布式网站架构设计与实践-高清完整版

    在IT行业中,尤其是在互联网领域,大型分布式网站架构设计与实践是一项至关重要的技术。随着互联网业务的飞速发展,单体架构已经无法满足高并发、高可用性以及可扩展性的需求,因此分布式系统的概念应运而生。本资料...

    大型网站技术架构核心.mobi.epub重构:改善既有代码的设计.mobiJava并发编程实战(中文版)打包共享!

    在IT行业中,尤其是在软件开发领域,大型网站技术架构、代码重构和并发编程是至关重要的主题。下面将分别探讨这三个方面的核心知识点。 首先,大型网站技术架构是构建高可用、高性能和高可扩展性的互联网应用的基础...

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

    《大型网站技术架构:核心原理与案例分析》是李智慧所著的一本关于构建和优化大规模网站架构的重要著作。这本书深入浅出地介绍了大型网站在应对高并发、大数据量、高可用性等挑战时所采用的技术策略和实践经验,是IT...

    实战Java高并发程序设计-随书代码

    《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,随书代码提供了大量示例,帮助读者深入理解并掌握在实际开发中如何处理高并发场景下的问题。本书的核心知识点涵盖了Java并发编程的基础理论、核心...

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

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

    大型网站架构系列文档

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

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

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

Global site tag (gtag.js) - Google Analytics