分布式互联网架构——概述

  客户端与服务端交互数据,底层基于tcp/ip协议。java上层实现——socket编程实现,太麻烦,基本不用;httpclient实现,本质是http(post/get)协议实现;servlet实现,本质还是http协议实现。

  分布式环境下,服务被部署在不同机器,可能来自不同的项目或平台,要传输的数据可能非常复杂。仍使用http协议实现,但增加三种技术——xml+xsd、wsdl、soap,总称webservice,其中xml封装要交互的数据;xsd规定要交互的数据类型;wsdl为服务提供方给出的一个描述其提供服务的xml文档。
  封装了交互数据的xml格式数据——就是个很长的符合xml格式的字符串——被添加到http报文中进行传送,同时http报头中要添加一些必要的数据来说明http报文的内容。改装后的http协议被称为soap协议,客户端和服务端也是通过soap协议来解析改装后的http报文的。

  http方式简单,高效,但不能处理复杂数据。
  webservice方式基于http,外包了一层,繁琐,重量级效率低,但可以处理复杂数据。

===========================================

  分布式环境下有很多服务,且同一个服务会被重复部署在一个集群的多台机器上,若服务端以webservice暴露服务,针对每一个服务都要向客户端提供一个url。

  soa面向服务的架构,规定服务端只需向客户端提供要暴露服务的接口名,不关心客户端调用的服务来自哪台机器。
  dubbo开源框架是对soa思想的实现,客户端要知道访问服务的接口名、所在组和注册中心地址,服务端要在注册中心注册服务的接口名和组。

分布式互联网架构——概述_第1张图片

===========================================

  业务做大了要拆分,不同业务访问不同数据库,数据库也要随着业务的拆分而拆库。分库后单库变多库,开发和维护效率被提高,库的承受压力和吞吐力被提高。
  
  单库根据业务拆分为多库后,不同业务的访问量分散到多库,但是单个业务访问量的增加仍会成为性能的瓶颈,为此配置多个冗余数据库,并使用读写分离——指将读操作(select)和写操作(insert、delete、update)分开。
  设置一个主库和一个从库集群——主库完成写操作,同时开启主从复制功能,记录每次写操作的日志;从库集群完成读操作,并定时根据主库的写操作日志来同步复制数据,从而保证主从数据的一致性,一般上游进行了修改操作后,必须向下游广播mq消息,来同步数据。
  通常读操作的压力远远大于写操作,但是只用一个主库存在单点故障风险。设置两个主库,互设为对方的主库,同一时刻仅一个起作用,另一个仅同步复制数据,通过zookeeper的感知功能来完成主库选举。

  对于大型的互联网应用,数据库的单表的行数会达到千万级,复杂业务的单表的字段数也会非常多,此时需要拆表——本质是根据业务,先将表垂直拆分成若干内部关联非常大,而相互之间关联非常小的子表,然后再对每个子表水平拆分,最后将拆分的子表放到不同数据库,不同数据库被部署到不同服务器,当单库的写入能力达到瓶颈后,分表再分库是解决问题的最好办法。
  水平拆分——按行分割多个子表,每个子表列数相同,如性别为男的行放一个表,性别为女的行放一个表。
  垂直拆分——按列分割多个子表,每个子表行数相同,如将主键和常用列放一个表,将主键和不常用列放一个表。

===========================================

分布式环境下,服务会被部署在服务集群的多台机器上,保证服务端session在各个机器之间同步非常重要——可持久化到DB防止丢失,但会明显降低效率;可将session统一部署在缓存集群,使用memcached或redis内存数据库保存,但重启会丢失。

你可能感兴趣的:(无分类)