并发是怎么出现的
众所周知,中国人口很多,人口资源相当丰富,十几亿人口。现如今的互联网/移动互联网发展的也很庞大,就因为人多,在大家都在使用一个app的时候,就会造成拥堵的现象,就跟超市一样,人多必然会拥挤,东西少,你需要抢购,你慢了一拍,就买不到,你遇到过早上大爷大妈抢着买鸡蛋的场景吧?而且结账速度也会比平时更慢,甚至还会出现限购的现象。这其实和互联网环境中的高并发道理是一样的。
相反,有些国家的人口基数本来就少,几千万吧,和我们没法比,他们那边的拥堵现象会好一些,但是毕竟人少。人多资源多,相应的,我们这的大数据发展很快,人多了,用户画像分析啊,用户行为分析啊,就更好做。人家国家就只有几千万,活跃用户可能百来万,大数据玩不溜。
人多人少有啥区别?消费啊,一个国家人口那么多,那么资源开发就更多,如果有一定的手段,你可以撬动他们来消费,我一个电商平台,做好运营/营销/推广,吸引用户多了,市场份额上来了,消费就上来了。如果你一个电商在一个人口少的国家去推广,市场就那么点大,消费水平上不来呀,人多人少没法比啊对吧~ 老铁。所以,大家会很容易会联想到什么?
- 明星结婚,微博瘫痪了
- 春运,12306 挂了,或者抢不到票
- 等等这些都是人多所出现的必然现象。
此外,我们还有一个叫做粉丝经济,现如今,人人都是自媒体,只要你的流量大,粉丝多,你就能赚钱,就比如李佳琪啊罗胖呀,对吧。直播买东西就是推广产品的一中手段,如此一来,就能撬动大家的购买欲望,向电商平台输送流量。
这个时候,直播间里的用户会有一部分进入到电商平台购物。那么流量比例大概多少?一般来说都是28或者37原则,20%的用户会进来,甚至会少一些,假设有1000万用户,那么这个时候涌入的流量就是200万,那你平台能吃得消不?并发支撑够不够?有没有负载均衡,高并发处理行不行,有没有做高可用,这些都要考虑,并且也都和网络相关。所以要支持用户量,要想公司赚大钱,技术要和业务贴合,整体系统的并发与高可用以及稳定性,都要保证。如果因为某一个短板效应出现问题,那么用户的流失会很惨重,对平台与企业造成的影响是巨大的,除非是12306,用户必须用,否则,用户流量会分发的其他不同的渠道与电商平台。
所以,由技术来拉动市场,来稳定用户的。并发场景无处不在,那么这整个过程其实也是贴分布式系统的架构发展的。比如如下:
单体-->分布式-->集群高可用-->高并发-->微服务-->容器化。
分布式架构演变
负载均衡
轮训,加权轮训,ip_hash(一致性哈希),url_hash,最小连接数
负载均衡分为7层负载和4层负载
OSI网络模型原理
以上这些其实本质上都是基于网络,有了网络才能交互,网络通信和我们的生活息息相关。那么说到网络通信,咱们就得来聊一聊七层模型了,这个其实也是网络基础,很多小伙伴们在接触nginx以及集群啊啥的有点混乱,这其实本身就是比较偏网络的,这边我们就来一起聊一下。
人和人之间面对面对话沟通通过讲话,打电话通过电话走电话线,那么如果这两个人在计算机(或者手机)屏幕的两边沟通,那么就是用户A和计算机交互,然后计算机和用户B交互,达到沟通的目的。其实不论是人机交互还是计算机之间(机机)交互,那么都会有一个通信的过程。
通信就会涉及到计算机网络,和网络相关。我记得在我大学那会这个就是必考知识点。这里就会涉及到OSI七层网络模型。
图片
什么是OSI,可以把它当做是一种规范,计算机之间的通信,数据交互,要符合OSI标准才能够把数据从一端发到另外一端,从而让另外一个用户看到,如此以来达到交互。而且分层了,那么每一层的目的就更加明确了,做什么事由自己那一层决定,就跟MVC一样,各司其职,解耦。并且对于每一层的开发人员来讲,更加专注了,不同的开发人员维护不同层面的东西,不会耦合在一起。所以,分层解耦无处不在,在开发的过程中也要多考虑。咱们先来简单看一下:
图片
- 应用层(7层):如上图,两个用户通过qq或者微信沟通,他们依赖于计算机或者智能手机。那么应用软件就是第一层,也就是应用层这一层里的,这一层会规定http协议,数据格式等,供调用,只要是一些软件应用程序,他们都是基于应用层的,也就是和人最直接沟通的一个媒介,也就是软件,qq/微信/浏览器/idea/eclipse这些都是。
- 表示层(6层):协议啊,字符串的表示,加密
- 会话层(5层):session建立与保持,建立和管理应用程序之间的通信
- 传输控制层(4层):如何建立连接,如何数据传输,数据处理传输OK还是失败
- 网络层(3层):数据路由,如何找到哪个节点去处理的,数据如何通信,怎么发的
- 数据链路层(2层):通信之间的协议是啥,怎么发出去
- 物理层(1层):物理传输设备,比如wifi,2g/3g/4g,网线等看得见摸得着的。
七层模型(协议)归类合并
七层模型其实就是一些协议的定义和划分,每一层所执行的功能不同,对应的协议也不同,而且我们可以把他们再进行合并,如下图,分成4层或5层或7层其实都行。
图片
每一层的只能都是不同的,如下:
- 物理层:物理传输设备,比如wifi,2g/3g/4g,网线等看得见摸得着的。当你和朋友微信聊天的时候,你用计算机插网线,你朋友用手机连接wifi,这些都是属于物理层的。打电话也一样,需要有电话线。
- 那么计算机之间的传输通过物理层,传输的时候以什么形式传输呢?都是一些二进制数据,1010001001这样的。
- 数据链路层:当计算机接收到1010001这些二进制的时候,这玩意本身很长,需要去进行解析的,所以他们其实是可以通过8位一组来进行划分,每组都是8位的话那么就可以进行数据运算和处理。那么每组8位(或者16位/64位),这活谁干呢?它是由链路层来划分的,物理层干不了,职能不够。
- 链路层处理的规范协议为以太网协议,他是一个标准,也是规范,因为早期的时候很多公司都是对二进制数据进行不同的分组,能用,但是太乱了,为了更加规范,采用了以太网协议Ethernet。
- 计算机通信会发出数据包,数据包包含head和data两个部分。
- head包含发送者,接受者以及数据类型(源mac地址,目标mac地址)
- data包含数据包的具体内容数据
- 和rest请求很像吧?: - )
- 数据发送的时候是head和data一起发的,有一定的长度限制,具体我忘了。如果太长了,会进行分片发送,也就是切割,啥是分片,自己百度,之前讲过很多了。
- 那么这个数据包其实和你平时打电话是一样的道理,呼叫者是数据发送者,被叫者是数据接受者,谈话内容就是data数据包,对吧。
- 附带一提,计算机里的地址,和每个人的手机号是一样的,叫做mac地址,和你的网卡相关。
- 关于mac地址:之前提到了以太网协议Ethernet,这玩意也规定了要在互联网上通信,必须得有一个mac地址,而mac地址存在于网卡,所以有了网卡才能上网,每一个网卡对应一个mac地址(知识点啊,这个我们在架构师课程里的Keepalived以及LVS里说过,虚拟IP通过虚拟机里的网卡才能虚拟化出新的VIP),和你的手机卡也一样,你要打电话,得买一个手机卡,每一个手机卡里有唯一的一个手机号码,通过手机号码才能进行呼叫和被叫,ok吧。
- 所以,这一层的链路层,他就是主要来定义数据的格式化传输的,一端传出去,另一端接受进来分组解析。
- 网络层:这一层其实定义了IP协议,他有一个网关的概念,说到网卡大家会想到什么?nginx?zuul?gateway?那么他们是不是都会处于某个计算机节点上?他们都会有一个ip,那么其实当计算机数据发出去的时候,会经过网关,接受的时候,也会经过网关,相当于他是一个中介,通俗点讲,你打电话的时候,要通过运营商吧,从电话呼出去,到接收通过,中间的过程由运营商来帮你处理,这个时候的运营商你可以认为是一个网关(也是起到了数据路由的作用),他是存在于某一个地址的,也就是IP地址,那么每个区域都有不同的运营商,不同的运营商管着不同的归属地,那么你可以把区域(归属地)理解为局域网,而手机就是每一个mac地址,同一个区域的局域网的ip都是一样的,而手机号对应的mac地址则不一样,对吧。看一下下面的图来理解一下(加餐)
图片
图片
4. 传输层:建立端口与端口之间的通信。什么意思呢,就是说呢,我们可以通过ip与mac地址找到对应的目标计算机节点,那么假设我们现在通过微信或者qq聊天,这个时候数据传输到对方的计算机了,那么对方的qq或者微信如何来接受你的数据呢?或者说如何把数据交给微信qq来展示给用户?这个时候就有端口的概念了,每个应用程序都会有一个端口,一个应用程序要多开,那么端口号肯定不一样,原理同tomcat。每个端口都会和网卡产生关联,我们在进行计算机交互的时候都会携带端口,比如8080,如此一来,那么对应的对方的应用程序才会接受到数据并且展示。ok吧。
- 比如还是以打电话为例,很多时候光打电话没用,对方没人接听,你需要再最后加上分机号,那么8080就比方说是分机号,可以打给人事,8088可以打给老板小蜜,那么端口就是这个意思。
- 传输层的协议为TCP何UDP,LVS属于传输层,他是4层负载均衡。
5. 应用层:应用层+表示层+会话层可以共同定义为应用层。用户所使用的所有的应用程序都是基于应用层,就比如qq,微信,浏览器,idea,eclipse都是,这是电脑与人最直观的交互。每个应用程序都可以有自己的不同的数据格式,数据组成形式,那么应用层就是规定了应用程序的数据格式。比如qq/微信/邮箱/浏览器,这些应用程序的数据传输的时候,协议都是不同的,数据格式也都是不同的,协议的不同在表示层 进行规范。会话层是建立在传输层之上的,和我们所说的session道理一致,用于维护两点之间的通信的,也就是建立和管理应用程序之间的通信,如果我电脑重启了,再次打开软件需要重新建立连接,也就是重新建立会话,OK吧。