webCppCluster

发布于:2024-09-19 ⋅ 阅读:(7) ⋅ 点赞:(0)

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进程

image-20240904144910750

5.集群

什么是集群?

集群简单了来说就是许多的人干相同的事情,这样每个人的压力都没那么大。

专业点,就是例如我们客户端这边突然发送过来大量的请求,一个服务器肯定处理不了这么大的并发量,所以我们可以做一个服务器的集群,每个服务器部署的是相同的应用,用集群去分担高并发的请求。

集群的特点有哪些?

高可用性

当一台服务器挂掉之后,其他的服务器能够机制切换上去,实现对用户的不间断服务

高性能计算

重复利用集群中的每一台服务器资源,实现并行处理。

负载均衡

把负载压力根据某种算法合理的分配到集群的每个服务器上,以减轻主服务器的压力。

集群的分类

LBC(Load Balance Cluster 负载均衡集群)

举个例子:一个早餐店,有四个员工,1号员工专门负责点菜,然后告诉后厨要做什么,2 3 4 号员工都在后厨,等着1号员工给配发任务,并且2 3 4 员工都会做包子、牛奶、豆浆。

nginx服务器就是专门用来接收http请求的服务器,然后再根据不同负载均衡算法去分发请求给uWSGI服务器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

HA(High Availability Cluster高可用集群)

双机预热

双击预热指的是俩个或者是多个相同配置的服务器,其中主服务器处于活跃状态,其他的服务器处于随时待命的状态,主从服务器之间通过实时同步数据和状态信息,当主服务器发生故障的时候,备用服务器会立即接管网络服务器的运行

image-20240904153225064

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 个并发连接数的响应。

功能

正向代理

代理的是前面的客户端,比如你访问外网,你需要先访问已给代理服务器,然后这个代理服务器再去访问外网,这就是正向代理

image-20240904172251710

反向代理

代理的是后面的服务器,比如你访问www.baidu.com就是访问的反向代理服务器,然后这个反向代理服务器再去分发请求到后面的服务器

image-20240904172417658

负载均衡

三种负载均衡方式

轮询
image-20240904172514121
加权轮询
image-20240904172540944
ipHash

按照ip地址进行分配,可以解决session一致性问题,但是有缺点,信息都存储到一台服务器上,这台服务器挂了信息就没都没了

image-20240904172555612

动静分离

请求分为静态请求(不需要后台业务逻辑代码的处理,比如:.jpg html等)和 动态请求(需要后台业务逻辑代码处理)

Nginx可以实现动静分离,对于静态请求直接再Nginx这台服务器中获取,动态请求再去分发给后面的服务器

image-20240904172947292

常用指令

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()

工作模式

image-20240830194953557

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 是原子操作