热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

技术架构演进中的思考点

关注作者的微信公众号:“Java架构师学习”一个只分享Java架构干货的公众号网站技术架构为什么会演进我个人总结出来我们的技术架构演进的两种驱动力,驱动着我们为什么演

关注作者的微信公众号:“Java架构师学习”

一个只分享Java架构干货的公众号



网站技术架构为什么会演进

我个人总结出来我们的技术架构演进的两种驱动力,驱动着我们为什么演进网站的技术架构:

1. 内在驱动力:我们期望把当前的业务做得更好,开发更多新业务

2. 外在驱动力:用户量的上升、用户种类的多样化

这两种驱动力不是独立的,更多时候是并行的。我想淘宝就是两种驱动力并行驱动的结果。

演进的原因很简单。但是在什么时机我们就应该演进网站的技术架构了,以及如何演进?面对这些问题,说实话,我没有任何经验,再说现实中每家企业当时都面临的问题都不一样,所以,我很难从经验中总结出什么是演进的时机。

但是我可以从另一个角度切入这个问题:研究网站内外结构,找到这些结构可能出现的问题点,知道或者预见到问题点了,你当然就知道应该怎么演进了。类似于你了解了 PC 机的结构,你也就知道什么时候要加内存了,什么时候要加硬盘了。

那么我们先看看网站的外部结构:

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

外部结构中,我们可以看由以下几个部分构成:

U:代表用户群。当用户群变了,我们的网站如何演进?用户群的分析,我目前能知道的维度有:数量,种类,地理位置(区域)。

N:代表网络环境。网络环境在每个地区都不同。你可以想像我们为什么需要 CDN。当我们期望每个区域的用户都能得到好的体验,我们的网站如何演进?

S:代表安全。就是我们要安全到什么程度?这与网站当前所处阶段及你网站的性质有关。

C:代表我们的网站。属于内部结构

网站的内部结构:

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

内部结构的组成:

A:应用服务。

D:数据服务

总结下来就是我们在考虑网站是否应该演进了或者如何演进时,这些组成部分为我们提供了考虑问题的基准。

那么我们为什么不一开始就把网站设计成“大型”的。李智慧在后记里写到:“不要企图去设计一个大型网站”,“原因是互联网发展运行有其自己的规律,短暂的互联网历史已经一再证明这种企图行不通”。还说了:“大型网站不是设计出来的,而是逐步演化出来的”。对于最后这句话,我需要提醒下:“不是设计出来的”并不代表“随意设计”。

对于“大型网站的设计”,我个人的看法是现在我们的有“云”了,计算是可以买的,只要我们的设计能适应“云”,我是不是就可以一开始就设计大型网站了?

演进的过程会遇到什么问题

- 最初

从一个小网站说起。一台服务器也就足够了。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 数据服务与应用服务分离

越来越多的用户代表着越来越多的数据,一台服务器已经满足不了。我们将数据服务和应用服务分离,给应用服务器配置更好的 CPU,内存。而给数据服务器配置更好更大的硬盘。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 使用缓存

因为 80% 的业务访问都集中在 20% 的数据上,如果我们能将这部分数据缓存下来,性能一下子就上来了。而缓存又分为两种:本地缓存和远程分布式缓存。具体使用哪种?还是两种都用,我目前不知道。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

这里有一个问题:应该缓存哪些数据?应该有一些原则的吧。

- 使用服务器集群

当这台服务器的处理能力达到上限时,它就会成为瓶颈。虽然你是可以通过购买更强大的硬件,但总会有上限。这时,我们就需要服务器的集群。这时,就必须加个新东西:负载均衡调度服务器。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

但是,使用服务器集群时,需要考虑一个问题:Session 的管理问题。Session 的管理有以下几种方式:

Session Sticky:打个比方就是如果我们每次吃饭都要保证我们用的是自己的碗筷,而只要我们在一家饭店里存着我们的碗筷,只要我们每次去这家饭店吃饭就好了。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

这种方式的问题:

1. 一台服务器重启,上面的 session 都没了

2. 负载均衡器成了有状态的机器,要实现容灾会有麻烦

Session 复制:就像我们在所有的饭店里都存一份自己的碗筷。不适合做大规模集群,适合机器不多的情况

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

这种方案的问题:

1. 应用服务器间带宽问题

2. 大量用户在线时,占用内存过多

基于 COOKIE:类似于每次吃饭都把自己的碗筷带上

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

这种方案的问题:

1. COOKIE 的长度限制

2. 安全性

3. 数据中心外部带宽的消耗

4. 性能影响,服务器处理每次的请求的内容又多了

Session 服务器:同样可以是集群的。这种方式适用于 session 数量及 web 服务器数量大的情况

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

这种方案需要考虑的是:

1. 保证 session 服务器的可用性

2. 我们在写应用时需要做调整,我目前不知道应用服务器能否将这部分逻辑透明化

- 数据库读写分离

数据库的一部分读(未缓存、缓存过期)及所有的写操作都还需要经过数据库。当用户量达到一定量,数据库将会成为瓶颈。这边我们使用数据库提供的热备功能,将所有的读操作引入 slave 服务器。注意:读写分离解决的是读压力大的问题。

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

因为数据库的读写分离了,所以,我们的应用程序也得做相应的变化。我们实现一个数据访问模块使上层写代码的人不知道读写分离的存在。这里,我很想知道如果我使用 ORM 模型时,如何实现读写的分离?

数据库读写分离会遇到如下问题:

  1. 数据复制问题: 考虑时延、数据库的支持、复制条件支持。不要忘了,分机房后,这个更是问题。

  2. 应用对于数据源的路由问题

- 使用反向代理和 CDN 加速网站响应

使用 CDN 可以很好的解决不同的地区的访问速度问题,反向代理则在服务器机房中缓存用户资源:

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 使用分布式文件系统

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 数据库专库专用:数据垂直拆分。

这样可以解决部分数据写的问题

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

垂直拆分数据库时,会遇到的问题:

  1. 跨业务的事务

  2. 应用的配置项多了

关于事务的问题,有两种办法:

  1. 使用分布式事务

  2. 去掉事务或不追求强事务

- 某个业务的数据表的数据量或者更新量达到了单个数据库的瓶颈:数据水平拆分

将同一个表的数据拆分到两个数据库中

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

数据水平拆分会遇到的问题:

  1. SQL 的路由问题,需要知道某个 User 在哪个数据库上。

  2. 主键的策略会有不同。

  3. 查询时的性能问题,如分页问题

  • 使用搜索引擎:解决数据查询问题

  • 部分场景可使用 NoSQL 提高性能

  • 开发数据统一访问模块:解决上层应用开发的数据源问题

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 业务拆分及应用拆分

网站的业务日益复杂,建立一个独立的大型应用来完成这所有的业务变得不实际。从管理角度来,也不方便管理。然而,业务的拆分很难找到一种通用的模式,这是一个企业管理问题和技术问题的混合问题。同时和每个企业的具体情况有关。

如何实现 SOA,是另一个很大的话题,不是本篇文章的范畴。

我从程立 08 年的演讲中截个图来说明 SOA 后的架构大概是怎样的:

作为一名JAVA程序员,你知道技术架构是如何演进的吗?

- 非功能性问题

– 安全性问题、监控问题

– 发布问题:新的架构意味着新的发布方式

– 分机房

– 组织架构的变化

我们的技术架构的变化,势必会引起我们的组织架构的变化,反之亦然。

这部分看似不应该由我们来管,但是,我觉得,我们技术人员也要参与一部分的组织架构的设计。举个例子,组织架构的设计会涉及绩效,而绩效有时很像一个国家的法律。如果一个国家的法律不健全,会发生什么?你懂的。

同时,我们还必须考虑人员对新架构的学习成本。

这部分我目前在看相关的书籍,还没有一个系统的认识。

总结

- 关于演进的顺序

在现实中,技术架构的演进不一定就是按文章从头到尾这样列下来的,所以,要视具体情况来下决定。

- 关于传统演进与现代有“云”环境下的演进

很可惜,只有李智慧谈到云,而且只点了一下——“现在越来越多人的网站从建立之初就是搭建在大型网站提供的云计算服务基础之上,所需的一切资源:计算、存储、网络都可以按需购买线性伸缩,不需要自己一点一点地拼凑各种资源,综合使用各种技术方案逐步去完善自己的网站架构”。

因为我用“云”的时间也不长,还不能总结出有云架构与传统的无云架构在演进的时候有什么不同。

说回传统的架构演进,我自己总结和思考的结果是:

在对网站进行架构调整时,可以从两大的维度考虑:数据服务和应用服务。而这个调整的过程中,需要分清当前哪个点是瓶颈,需要知道哪个点优化的优先级最高。同时,最重要的一点:我们虽然作为技术人员,也应该去学习业务知识,这样我们在考虑问题时分清哪些是业务问题,哪些是技术问题,分清后才能对症下药。你要知道有些问题用技术手段并不比用业务手段更有效。12306 的分时卖票就是一个典型例子。

以上总结及思考有不对,欢迎斧正。非常感谢。




推荐阅读
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
author-avatar
高傲的辫子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有