1.通讯协议、接口协议、数据传输格式之间的区别?
通讯协议
在TCP/IP四层模型中,四层分别是:应用层、传输层、网络层、网络接口层。
应用层通讯协议的代表:HTTP HTTPS
主要规定传输消息的具体内容、什么格式传输、是请求还是相应,如果是请求时GET还是POST,如果时POST请求体的内容时什么传输格式的等等
传输层通讯协议的代表:TCP UDP
保证的时端对端的可靠性和安全性传输
网络层通讯协议的代表:IP
主要功能逻辑寻址、路由选择,实现端到端的数据传输
网络接口层通讯协议的代表:以太网帧协议
硬件层面上的
这四个层的协议一叠加,形成数据帧,保证网络中数据的端到端的传输
接口协议
接口协议是在俩端中定义的一个接口标准,一端规定要传递什么参数,另一方去接收传递过来的参数。
比如我项目中的WSGI接口协议,它就是uWSGI服务器和webpy框架之间的接口标准,uWSGI需要传递environ环境变量和并提供一个回调函数start_respone,webpy框架去接收这些参数
WSGI由三大组件组成,webServer服务器、可调用对象、中间件
数据传输格式
protobuf、json、xml、HTML、Plain Text
一般是序列化和反序列化,比如protobuf序列化会变成二进制格式,json序列化会变成json格式
2.为什么使用protobuf协议?
Protobuf通信协议详解:代码演示、详细原理介绍等 - 知乎 (zhihu.com)
protobuf是一种数据传输格式,就和json、html、xml、Plain-Text类似
protobuf数据传输格式是由Google开发的数据传输格式,它的序列化和反序列化特别的迅速(因为序列化会变成二进制格式)
优点
速度快
序列化后是二进制格式,所以序列化和反序列化速度更快
可以自定义消息格式
支持多语言使用
protobuf定义的消息格式可以在多种语言中使用,有助于跨语言的通信。
比如web服务器和C++服务器的通信
自动生成代码
包括序列化和反序列化所需的函数,跨语言的头文件等等
使用场景
webCppCluster项目中,在web服务器和c++服务器的通信中使用,因为protobuf支持多种语言,可以实现不同语言服务器间的通信
3.为什么使用json协议?
优点
可以实现数据结构的嵌套(复杂的数据结构),使用更加灵活
比如在python中,定义一个字典,字典的value还可以是字典,还可以是列表、元组等等
易于读写
json使用简单的文本格式,易于人类阅读和编写
轻量级
JSON的数据格式轻量级,传输数据时占用带宽较小,可以提高数据传输速度
速度快
那你咋不用protobuf,protobuf比json还快
归根到底,还是json去实现复杂数据结构的数据传输更加快速
项目中,获取商城配置,里面就是一个很复杂的数据结构,json的形式就很容易去传输
http协议与json数据格式之间的联系
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
使用场景
前后端数据传输
4.supervisor进程管理工具
简介
supervisor是用python语言编写的进程管理工具,它可以监听、启动、停止、重启一个或多个进程。当一个进程被意外杀死的时候,supervisor可以让进程自动恢复,不需要程序员自己去管理。
我们写的py脚本可能会挂到,spervisor可以帮助我们自动拉起py进程
5.集群
什么是集群?
集群简单了来说就是许多的人干相同的事情,这样每个人的压力都没那么大。
专业点,就是例如我们客户端这边突然发送过来大量的请求,一个服务器肯定处理不了这么大的并发量,所以我们可以做一个服务器的集群,每个服务器部署的是相同的应用,用集群去分担高并发的请求。
集群的特点有哪些?
高可用性
当一台服务器挂掉之后,其他的服务器能够机制切换上去,实现对用户的不间断服务
高性能计算
重复利用集群中的每一台服务器资源,实现并行处理。
负载均衡
把负载压力根据某种算法合理的分配到集群的每个服务器上,以减轻主服务器的压力。
集群的分类
LBC(Load Balance Cluster 负载均衡集群)
举个例子:一个早餐店,有四个员工,1号员工专门负责点菜,然后告诉后厨要做什么,2 3 4 号员工都在后厨,等着1号员工给配发任务,并且2 3 4 员工都会做包子、牛奶、豆浆。
nginx服务器就是专门用来接收http请求的服务器,然后再根据不同负载均衡算法去分发请求给uWSGI服务器
HA(High Availability Cluster高可用集群)
双机预热
双击预热指的是俩个或者是多个相同配置的服务器,其中主服务器处于活跃状态,其他的服务器处于随时待命的状态,主从服务器之间通过实时同步数据和状态信息,当主服务器发生故障的时候,备用服务器会立即接管网络服务器的运行
HPC(High Performance Computing Cluster 高性能计算集群)
多个服务器同步并行的方式去解决一个复杂的问题
在我们的项目中使用的是负载均衡集群,Nginx负责分发请求,把负载压力分配到uWSGI服务器上,但是由于Nginx就部署了一个,当Nginx宕机的时候整个服务的挂了,所以可以对Nginx使用高可用集群的双击预热集群
6.分布式
就是每个服务器干的活是不同的
比如Redis的主从机制,主Redis专门接收写操作命令,而从Redis专门接收读操作命令,这句是分布式的架构
单机累如狗–> 居群 --> 分布式
7.Nginx
Nginx是一个高性能的能接收HTTP请求的反向代理web服务器。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
功能
正向代理
代理的是前面的客户端,比如你访问外网,你需要先访问已给代理服务器,然后这个代理服务器再去访问外网,这就是正向代理
反向代理
代理的是后面的服务器,比如你访问www.baidu.com就是访问的反向代理服务器,然后这个反向代理服务器再去分发请求到后面的服务器
负载均衡
三种负载均衡方式
轮询
加权轮询
ipHash
按照ip地址进行分配,可以解决session一致性问题,但是有缺点,信息都存储到一台服务器上,这台服务器挂了信息就没都没了
动静分离
请求分为静态请求(不需要后台业务逻辑代码的处理,比如:.jpg html等)和 动态请求(需要后台业务逻辑代码处理)
Nginx可以实现动静分离,对于静态请求直接再Nginx这台服务器中获取,动态请求再去分发给后面的服务器
常用指令
cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
8.CGI
Python CGI 编程 | 菜鸟教程 (runoob.com)
什么是 CGI
CGI(Common Gateway Interface)表示通用网关接口协议,它是用于webServer于CGI应用程序之间的通信(CGI应用程序可以由多个语言实现,C/C++、Python等等),webServer接收到HTTP请求并解析,把它封装成CGI应用程序能看懂的CGI协议,如果是GET请求,就把数据放到PATH_INFO(环境变量中),如果是POST请求,就把数据存储到标准输入中。CGI程序接收到CGI协议,然后处理,把反馈结构放到STDOUT中,CGI程序发送CGI协议给webServer。
#!/usr/local/bin/python
import cgi
def main():
form = cgi.FieldStorage()
工作模式
1.创建CGI工作进程
2.处理请求
3.kill进程
也就是说每次请求都需要创建一个进程,造成较大的系统开销,并且CGI协议不支持高并发请求
类似于HTTP的短链接,每次发送HTTP请求前都需要简历TCP连接,等下一次请求又要重新简历TCP连接
9.FastCGI
什么是FastCGI?
FastCGI(快速网关接口协议),它是CGI协议基础上发展的,它用于WebServer与FastCGI应用程序间的通讯协议。它不需要像CGI那样,来一个请求就得fork一个进程,而是先创建已给Master进程,然后去解析配置文件,根据配置文件创建子进程,然后等请求来的时候,分配子进程去接收请求。当请求数过多的时候会自动再创建子进程
工作流程
1.创建Master进程(主工作进程)
2.根据配置文件创建子进程(如果进程不够用的话,请求过多,会自动创建子进程)
10.你这个项目,容灾是怎么做的?
负载均衡
Nginx做反向代理服务器,实现负载均衡,将负载压力分配后面的服务器,以防止单点故障问题
双击预热
Nginx服务器只有一个,如果Nginx挂到的话整个服务器就挂了,所以对Nginx有一个配用的服务器,主服务器与备用服务器进行实时同步数据和状态信息,当主Nginx该了之后,备用Nginx顶上去
健康检查
可以设置定期发送请求给后端服务器,如果运行不正常,Nginx立马会从从服务器列表中移出,后面请求就不会再分配给这个服务器了
数据备份与恢复
Redis设置主从结构
MySQL设置主从复制,将数据实时同步到服务器中
11.Web服务器与C++服务器通信
12.Web集群中怎么保证并发情况下的数据一致性的?
用Redis中的分布式锁实现接口的幂等性
对数据进行Redis中的原子操作
incrby这个操作就是原子操作,它的get 和 set 是原子操作