网站的可扩展架构

news/2024/5/20 15:12:20/文章来源:https://blog.csdn.net/weixin_30785593/article/details/96157020

一、可伸缩与可扩展—傻傻分不清楚

  上篇笔记我们学习了可伸缩架构,但在实际场合中,包括许多架构师也常常混淆可伸缩和可扩展,用可扩展表示伸缩性。那么在此,跟随作者我们来理清这两个概念,避免我们以后对其傻傻分不清楚。

  (1)扩展性Extensibiltiy

  指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。我们不禁想到了面向对象中一大原则:开闭原则,对扩展开放,对修改封闭。也就说,当系统新增一个功能时,不需要对现有系统的结构和代码进行修改。

  (2)伸缩性(Scalability

  指系统能够通过增加(或减少)自身资源规模的方式增强(或减少)自己计算事务的能力。在网站架构中,通常是指利用集群的方式增加服务器数量,从而提高系统的整体事务吞吐能力。

  设计网站可扩展架构的核心思想是:模块化,并在此基础之上降低模块间的耦合,提高模块的复用性。在大型网站中,这些模块通过分布式部署的方式,独立的模块部署在独立的服务器(集群)上,从物理上分离模块之间的耦合关系,进一步降低耦合性从而提高复用性。

二、利用分布式消息队列降低系统耦合性

  上面我们提到说要分离模块之间的耦合,如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块的影响最小,这样系统的可扩展性无疑会更好一些。那么,有没有一种架构是基于如此考虑而设计的呢?于是,我们将眼光转向一个名叫“事件驱动”的架构。

2.1 事件驱动架构

  根据事件驱动架构(Event Driven Architecture)的定义:通过在低耦合的模块之间传输消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作。典型的EDA架构就是操作系统中常见的生产者消费者模式。在大型网站架构中,具体实现手段有很多,但是最常见的是分布式消息队列

  如上图所示,消息队列利用发布—订阅模式工作,消息发送者发布消息,一个或多个消息接受者订阅消息。消息发送者是消息源,在对消息进行处理后发送至分布式消息队列,消息接收者从分布式消息队列获取该消息后继续进行处理。可以明显看出,发送者与接受者之间没有直接耦合,消息发送者只需将消息发送给分布式消息队列即操作结束,而消息接受者也只需要从分布式消息队列获取消息后进行处理,不需要知道该消息从何而来。因此,对于新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展设计

2.2 分布式消息队列

  队列是一种先进先出的数据结构,分布式消息队列则看以看作是将这种数据结构部署到独立服务器上,应用程序看以通过远程访问接口使用分布式消息队列,进行消息存取操作,进而实现分布式的异步调用。

  如上图所示,我们可以明确三个步凑:

  ①消息生产者应用程序通过远程访问接口将消息推送给消息队列服务器,消息队列服务器将消息写入本地内存队列后马上返回成功响应给消息生产者。

  ②消息队列服务器根据消息订阅列表查找订阅该消息的消费者应用程序,将消息队列中的消息按照先进先出的原则将消息通过远程通信接口发送给消费者应用程序;

  ③消费者应用程序接收到推送过来的消息之后进行相关的一系列处理,过程终止;

PS:那么,有没有这样一种情况:消息队列服务器宕机后导致消息丢失。事实上,这种情况的确存在于实际的运维过程中。那么,我们如何来避免呢?这时,作者给出了一个方案:如果消息队列服务器宕机造成消息丢失,会将消息成功发送到消息队列的消息存储在消息生产者服务器,等消息真正被消息消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中其他的服务器发布消息。

另外,有关于分布式消息队列的实践可以采用NoSQL产品来构建,例如Redis就提供了队列数据类型,可以方便地构建分布式消息队列,如果你有兴趣,也可以参阅我的另一篇博文:《使用Redis作为消息队列服务应用场景案例》

三、利用分布式服务打造可复用的业务平台  

  如果说分布式消息队列通过消息对象分解系统耦合性,不同子系统处理同一个消息;那么分布式服务则通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务调用。

3.1 巨无霸的应用系统带来的问题

  网站由小到大的演化过程中,表现为整个网站是由单一系统逐步膨胀发展变化而来的,随着网站功能的日益复杂,网站应用系统会逐渐成为一个巨无霸,如下图所示。可以看出,一个应用中聚合了大量的应用和服务组件,这个巨无霸给整个网站的开发(编译麻烦、代码分支管理困难)、维护(新增业务困难)和部署(部署困难)都带来了巨大的麻烦。

3.2 拆分,拆分还是拆分

  解决方案还是我们多次提到的拆分,将模块独立部署,降低系统耦合性。拆分又分为:横向拆分和纵向拆分。这里我们再次回顾一下这两种方式:

  (1)纵向拆分:将一个大应用拆分为多个小应用,如果新增的业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统;

  (2)横向拆分:将可以复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务即可,不需要依赖于具体的模块代码。如果模块内业务逻辑发生变化时,只要接口保持一致就不会影响业务程序和其他模块。

四、可扩展的数据结构

  传统的关系数据库为了保证关系运算(通过SQL语句)的正确性,在设计表结构的时候就需要制定表的Schema—字段名称、数据类型等,还要遵循制定的设计范式(例如:1NF、2NF、3NF等等)。这些规范带来的一个问题就是僵硬的数据结构难以面对需求变更带来的挑战,有些系统设计者通过预先设计一些冗余字段来应付(在我所实习的一年里,我见过很多次这种设计,虽然可以解决问题,但从设计学来说,真的好Shit),但这显然是一种糟糕的数据库设计。

  那么,有木有办法能够做到可扩展的数据结构设计呢?是否可以不需要修改表结构就可以新增字段呢?答案是肯定的,目前许多NoSQL数据库使用的ColumnFamily列族)设计就是一个解决方案。ColumnFamily最早在Google的BigTable中使用,这是一种面向列族的稀疏矩阵存储格式。或许这么说大家还是不明白,但可以通过下图来理解:

  这是一个学生基本信息表,不同学生的联系方式不同,选修的课程也不同,而且在将来会有更多的联系方式和课程加入这张表,如果按照传统的数据库设计,无论提前预设多少冗余字段都不够用,捉襟见肘,疲于应付。而是用ColumnFamily结构的NoSQL数据库,创建表的时候,只需要指定ColumnFamily的名字,无需指定字段(Column),可以在数据写入时再指定,通过这种方式,数据表可以包含数百万的字段,使应用程序的数据结构可以随意扩展

五、利用开放平台建设网站生态圈

  网站的价值在于为他的用户创造价值,大型网站为了更好地服务自己的用户,会开发更多的增值服务,会把网站内部的服务封装一些调用接口开放出去,供外部的第三方开发者使用,这个提供开放接口的平台被称作开放平台。第三方开发者利用这些开放的接口开发应用程序(APP)或者网站,为更多的用户提供价值。这样一来,网站、用户、第三方开发者相互依赖,形成一个网站的生态圈,即为用户提供更多的价值,也提高了网站和第三方开发者的竞争能力和盈利能力。

  目前BAT等国内互联网巨头都建设有自己的开放平台,力图利用自己庞大的用户群吸引第三方开发者,打造一个更加庞大的航母战斗群,在市场竞争中呼风唤雨,立于不败之地。

转载于:https://www.cnblogs.com/sky-sql/p/6695363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_814778.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql负载导致网站访问高_MySQL负载高导致网站访问慢解决实例

今日发现网站访问慢,一次进行了排查,开始思路混乱,下面来梳理下一、故障分析首先,判断访问慢现象,是个人还是集体???个人现象排查:检查个人网络,pc&#xff0…

服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护

c盘无法格式化的原因是什么_网站服务器运行维护c盘无法格式化的原因:因为C盘是Windows系统所在的磁盘,在Windows系统下要直接格式化C盘肯定是不行的,想格式化C盘可以用Windows的系统安装光盘/U盘来启动电脑,然后按照提示格式化C盘…

php 网站克隆,如何快速克隆一个网站

今天来说一个实用的工具:网站克隆。这样的功能对于技术人员来说,不算什么大的功能,大家可以用N种办法来实现,各有各的奇技淫巧。今天主要介绍的是A哥的克隆工具curlMulti。借用这个功能,非技术人员也可以快速的克隆整个…

一些很有趣的网站

1,360度高清晰无死角可任意放大缩小的网站,让你站在难以企及的视角观察壮美绝伦的风光! (温馨提示:看久了会感觉头晕哦,点击图片上的直升飞机可以体验上帝视角) http://www.airpano.com/ 2&…

jsoup php网站,使用Jsoup实现爬虫技术的方法介绍

本篇文章给大家带来的内容是关于使用Jsoup实现爬虫技术的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1.Jsoup简述Java中支持的爬虫框架有很多,比如WebMagic、Spider、Jsoup等。今天我们使用Jsoup来实…

delphi tabsheet多标签自适应宽度_#自适应SEO#方案

最近负责的两个网站都遇到了移动适配问题:一个是发现pc端有排名的很多是移动端的url,一个是因为技术省事301配置导致首页被降权。如何解决pc端有排名的很多是移动端的url这个问题?如何让蜘蛛知道移动端是移动端呢?网站需要做哪些配置&#xf…

qtplaintextedit如何删除内容_教你如何通过外贸网站内容审核优化谷歌SEO效果

Welcome to Worldsou!根据Google Trends的数据显示,在过去五年中内容营销的热度正在急剧增长。但虽然热度激增,但相对应技术水平进步的速度却相对缓慢。新兴趋势带来的问题是,营销人员需要一段时间才能更好的去使用它们。研究表示&#xff0c…

php websocket 客户端_php只能做网站?基于swoole+websocket开发双向通信应用

前言众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息。因此,一些实时性要求比较高的应用,如实时聊天、…

halcon 将数据保存到excel_使用selenium登录网站并爬取数据保存到excel

使用selenium模拟登录到网站后,利用requests爬取数据,用bs4解析数据,用xlwt保存到excel。自定义了2个函数:getData()用于获取数据,使用for循环获取多个页面的数据,解析后的数据保存到列表中;sav…

华为服务器管理卡网页打不开,华为路由器登录网站打不开怎么办?

问:华为路由器的登录网站打不开怎么办?答:华为路由器的默认登录地址是:192.168.3.1。正常情况下,电脑/手机连接到华为路由器的网络后,在浏览器中输入192.168.3.1,就可以打开登录页面。如果你在浏…

使用LXD搭建Web网站

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由独木桥先生 发表于云社区专栏 介绍 Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离。它是一个类似于虚拟机的构造,但它的更轻量级。您可以在同一台服务器上轻…

使用了 vue 的网站

目前我所知道的,使用了 vue 的网站如下: 手机搜狐 http://m.sohu.com/limit 哔哩哔哩 https://www.bilibili.com/ 又拍云 https://www.upyun.com/ 掘金 https://juejin.im/ 简书: https://www.jianshu.com/ 智联招聘 https://www.zhaopin.com/ 高德地图 API https://lbs.a…

Flask项目之手机端租房网站的实战开发(三)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/85623829 目录 一丶关于在项目中循环导入的问题 二丶日…

前端学习笔记 day20 使用fullpage插件完成购物网站(也可以做成广告)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物网站</title> <!--采用fullpage.js分屏插件--><!--引入初始化css文件 fullpage.css文件 自己写的css文件--><link rel"…

【Github】cloudflare+gitPages+解析域名定制自己的网站

Github Pages是通过我们网站托管和发布的公开网页 本文就以简单图文描述介绍部署自己的Github Pages 步骤一&#xff1a;Github网站注册自己的账号 网站&#xff1a;https://github.com 步骤二&#xff1a;新建repository 步骤三&#xff1a;clone这个项目到本地 这里不详细…

十年后,我又开始研究SEO了

2009年的时候&#xff0c;我就小打小闹式地要创业了&#xff0c;其实就是和同学在北京阜成门开了一家特产店。但我们的想法不止在这个店&#xff0c;有更大的目标&#xff0c;目前也不便在这里展开了。反正当时我就注意到了SEO&#xff0c;即搜索引擎优化。通俗地说&#xff0c…

网站无法解选中以及复制——解决方案

禁止选中的,一般是用到了CSS的属性: user-select:none; 那么只需要打开网页, 按F12或者ctrlshifti打开开发者工具 点击箭头 再点击要复制的段落 从左边的style中找到如下语句&#xff1a; 取消所有的勾 再找到下面的语句&#xff0c;这是设置鼠标指针类型&#xff0c;直接取…

java用户接口的模块,【笔记3-用户模块】从0开始 独立完成企业级Java电商网站开发(服务端)...

数据表结构设计关系设计为什么不用外键&#xff1f;分库分表有外键会非常麻烦&#xff0c;清洗数据也很麻烦。数据库内置触发器也不适合采用。查业务问题的后悔药——时间戳create_time 数据创建时间update_time 数据更新时间可以用于查询业务&#xff0c;主要要存储datetime类…

WebMatrix教程(一) (关注Microsoft 的最新武器:建立你的第一个WebMatrix网站)

“除非你睡着了或刚刚从一个长假回来&#xff0c;你应该已经注意到了&#xff0c;…&#xff0c;微软重新进入到了高效率开发者’的圈子中。” – Scott Willhite – Director of Community Programs from DotNetNuke 微软是这样定义WebMatrix -- 一个全新的网络开发工具&#…

微软网站提供的8本英文原版书电子版

微软网站提供了8本英文原版书电子版。您可以到以下地址找到这8本书&#xff0c;进行免费的下载。 http://blogs.msdn.com/b/microsoft_press/archive/2011/03/03/ebooks-list-of-our-free-books.aspx?utm_contentem-orm-newsletters-msp-april-2011&utm_campaignNewslette…