分布式系统概念

一 分布式系统
分布式系统的由来:
国内来讲,移动互联网的爆发伴随着分布式系统的突现,移动互联网最大的特点是 2(to)c 的 o2o 产品越来越多,这跟传统 2B 的系统最大区别就是用户量的不同,2C 系统的用户量远远要高于 2b 系统,这就对系统提出了各种各样的高标准,响应时间,性能,灾备,吞吐量等等,各种分布式技术也是为了这些标准而服务。
分布式架构的应用:
分布式文件系统
分布式缓存系统
分布式数据库
分布式 WebService
分布式计算
举例说明:
分布式文件系统: 出名的有 Hadoop 的 HDFS , 还有 google 的 GFS , 淘宝的 TFS 等

分布式缓存系统:memcache , hbase , mongdb 等

分布式数据库 : MySQL , Mariadb, PostgreSQL 等

以分布式 MySQL 数据库中间件 MyCat 为例子,MySQL 在现在电商以及互联网公司的应用非常多,一个是因为他的免费开源,另外一个原因是因为分布式系统的水平可扩展性,随着移动互联网用户的暴增,互联网公司,像淘宝,天猫,唯品会等电商都采用分布式系统应对用户的高并发量以及大数据量的存储。
而在 Mycat 的商业案例中,有对中国移动的账单结算项目中,应用实时处理高峰期每天 2 亿的数据量,在对物联网的项目中,实现处理高达 26 亿的数据量,并提供实时查询的接口。

 

 


二 大型分布式网站系统的性能要求
1. 响应时间(Response time)

2-5-8 原则:(据统计当网站慢一秒就会流失十分之一的客户)

当用户再 2-5 秒之间得到响应时,会感觉系统的响应速度还可以;

当用户再 5-8 秒内得到响应时,感觉蛮,但是还可以接受;

当用户大于 8 秒内得到响应时,感觉无法接受;


2. 吞吐量(Throughput)

指的是在单位时间内客户端和服务器成功传送数据的数量;
3. 资源使用率(Resource utilization)

常见的有:cpu 占用率、内存使用率、磁盘 I/O、网络 I/O;
4. 每秒点击数(Hits per Second)

客户端每秒向服务器提交的请求数量,如果客户端发出的请求数量越多,与之相对的平均吞吐量也应该越大;
5. 并发用户数(Concurrent users)

客户端的同一批用户同时执行一个操作的数量。
三 Java 后台技术


四 技术名词解释
分布式和集群

分布式和集群在通常情况下不做严格区分,正如同并发和并行一样,应用情况下很少会去考究它的区别,许多大公司面试也直接问分布式集群怎样怎样,一般都拿等同来讲了。在这里只在概念上做一下区别,使大家更合理的去理解,没有对错之分。

分布式:一个电商系统,用户模块部署在 server1, 订单模块部署在 server2, 促销模块部署在 server3, 商品模块部署在 server4,他们之间通过远程 rpc 实现服务调用,这就叫分布式。强调的是不同功能模块,单独部署在不同的 server 上,所有 server 加起来是一个完整的系统。

集群:更多强调的是灾备,一个电商系统,完整的部署在 server1 上一个,完成的部署在 server2 上一个,server1 宕机后,server2 仍然可以正常提供请求服务,这叫集群。同样对于某一功能模块,比如用户模块部署在 server1 上,同样部署在 server2 上,也叫做集群。分布式系统的每个功能模块节点,都可以用多机做成集群。

抽象问题具体化:拿做菜示例,假如一个厨师做菜要经历切菜,炒菜两个功能,饭店为了提高速度招了两个厨师,每个厨师的工作一样,都是切菜,炒菜,这是集群。还有另一种方法提高效率,饭店招了一个切菜师傅,配合厨师,厨师不管切菜,只管炒菜了,和切菜师傅共同配合把菜做好,这叫分布式。

Nginx

作用是反向代理和负载均衡。

反向代理是指请求真实是到 server1 的,但是系统中为了统一或者做比如单点登录,会在 server2 服务器上安装一个 nginx,里面配置到 server1 的反向代理,那么之后请求 url 就可以写 server2 的地址,发出后到 server2, server2 会转发到 server1 上,类似一种代理的模式。

负载均衡是指如果一个系统的请求很多,我们可以把请求转发到不同的服务器上,用来分流。就类似于接了一个水管放水,水流量很大时候,水压大很可能会让一个水管爆炸,这时候接三个水管,就没问题了(这三个水管就是一个集群)。类似的在 nginx 服务器中配了 3 个 tomcat 服务器,每个 tomcat 服务器上都部署了整个系统,那么当请求数大的时候,可以分发到不同的 tomcat。(其实这里每个 tomcat 上部署同一个功能模块也叫集群)

Java 在分布式下的通信

 

 

RPC(远程过程调用)
对于分布式系统来讲,tomcat1 上部署了用户模块,tomcat2 上部署了订单模块,当用户下单时,请求到 tomcat2, 这时候可能要判断这个用户是否是 vip,或者是否有优惠券,这些方法是在 tomcat1 用户模块上的,那么 tomcat2 调用 tomcat1 的服务获取这些信息,就叫 rpc 调用。

常见的 rpc 框架:轻量级的 hessian, 阿里 dubbo(当当 dubbox), 新浪 Motan, apache 的 Thrift,google 的 grpc, 百度的 brpc, 腾讯的 tars。

rpc 调用底层涉及到对象的序列化,反序列化,http/tcp 传输,网络异步传输 netty。

消息中间件(MQ)

mq 消息中间件在分布式系统中的作用有很多,但是经常用到的还是异步解耦。

比如天猫下单流程,当用户支付后,后台接口执行的操作可能包括:1 验签,2 支付密码校验,3 扣库存,4 用户积分增加等等操作,其实我们希望的是 2 操作执行成功后立即给用户结果提示,而不是等到后续各个操作完成后才去提示,因为后续的操作往往大部分是 rpc 调用,方法执行时间相对较长。另外对于下单支付这个操作,3 和 4 是后续业务的需要,在设计上不能和下单支付本身出现强耦合度。所以这里我们可以引入 mq 解决,也就是说 1 和 2 执行完成后,生产者只需要通知下 3 和 4,把后续的操作扔给消息队列,立即返回。这里的 mq 起到的作用一个是异步调用,一个是解耦。

NoSQL( 非关系型数据库)

NoSQL 是所有非关系型数据库的统称,在分布式系统中用到很多,主要用来提高 QPS(query per second)。

Redis: 我们讲缓存,或者内存数据库,小巧强大,什么数据适合放在 redis 也就是缓存中,一个是经常查询的,需要频繁磁盘 io 的,例如有个快件系统,有个需求是当快件状态为异常时候,需要发送邮件提醒给系统管理员。接口入参是快件 id,通常做法我们需要拿到 id,去数据库查状态,然后发送,但是快件基数很大时候每天的问题件也可能会很多,接口调用频繁时候就需要改进做法,这时我们可以把快件状态信息放在 redis 里面,key 是快件 id, value 是快进状态,每次进入接口时候直接 redis 里面取 status 就可以,速度很快。另一个是查询数据缓慢的,可以放在缓存中。

MongoDB: 可称为分布式文件数据库,可用来存储海量数据,它是 NoSQL 里面最像关系型数据库的,它的数据的存储形式可以就理解为 json 格式。之前曾经两次用到过 mongoDB,一次是系统里面有个实时监控设备电流电压的功能,硬件设备实时会把数据同步到数据库里面,我们系统 2-3s 需要去拉次列表。另一个系统是一个轻型的行业 IM 工具,每天会有很大的聊天数据存储,我们直接用了 mongoDB 存储,后来系统相当稳定,从来没有出现过性能瓶颈。
————————————————
版权声明:本文为 CSDN 博主「Alenlyx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43230063/java/article/details/84106460