了解什么rpc协议
gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
微服务化,跨平台的服务之间远程调用;
protobuf – 跨平台多语言
使用协议缓冲区(Protocol Buffers)
- 序列化格式:gRPC 使用 Protocol Buffers 作为接口定义语言和序列化格式。这种格式允许在不同语言之间高效地编码和解码数据。
- 语言生成代码:通过 Protocol Buffers 的编译器(protoc),可以为多种编程语言生成相应的代码,确保不同语言的服务能够互操作。
NGINX用过吗
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
- Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
- Nginx支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
- 正向代理: 我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器)
- 反向代理: 那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)
负载均衡
- 轮询
- 加权轮询
- ip_hash
- url_hash
- 最少连接数
动静分离
http和https、状态码
- 200 ok 204 no content 响应头没有body数据
- 301 永久重定向 302临时重定向
- 400 报文错误(笼统) 403服务器禁止访问资源 404找不到资源
- 500 501功能还不支持 502服务自身正常访问后端服务器错误 503服务忙
epoll和select
IO多路复用(Input/Output Multiplexing)是一种在单个线程中管理多个输入/输出通道的技术。它允许一个线程同时监听多个输入流(例如网络套接字、文件描述符等),并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程。
- IO事件就绪通知:多路复用机制通过操作系统提供的系统调用(如select、poll、epoll等)来监听多个IO事件的就绪状态。当有任何一个IO事件就绪时,操作系统会通知应用程序,告知哪些IO事件已经准备好可以进行读取或写入操作。
- 非阻塞IO:多路复用机制通常与非阻塞IO配合使用。在非阻塞IO模型中,当一个IO操作无法立即完成时,不会阻塞线程,而是立即返回一个错误码或特定的状态,应用程序可以继续处理其他IO操作或其他任务,提高了系统的并发性能。
- 事件循环:多路复用机制通过事件循环来处理就绪的IO事件。事件循环会不断地监听IO事件的就绪状态,当有IO事件就绪时,会调用相应的回调函数来处理该事件。通过事件循环的方式,可以高效地处理多个IO操作。
select
poll
epoll
epoll什么情况下不适用
- 连接数较少
- 高频率的添加和删除
- 非linux
惊群现象了解吗
所谓惊群效应,就是多个进程或者线程在等待同一个事件,当事件发生时,所有进程或者线程都会被内核唤醒。然后,通常只有一个进程获得了该事件,并进行处理;其他进程在发现获取事件失败后,又继续进入了等待状态。这在一定程度上降低了系统性能。
具体来说,惊群通常发生在服务器的监听等待调用上。服务器创建监听socket,然后fork多个进程,在每个进程中调用accept或者epoll_wait等待终端的连接。
Mysql日志
mutex和rwmutex区别
mutex
(互斥锁)和 rwmutex
(读写互斥锁)是用于控制并发访问共享资源的同步机制。它们之间的主要区别如下:
1. 功能
Mutex:
- 只允许一个线程访问共享资源。其他试图获取该锁的线程将被阻塞,直到锁被释放。
RwMutex:
- 允许多个线程同时读取共享资源,但在写入时只允许一个线程访问。当一个线程在写入时,其他线程的读取和写入都会被阻塞。
2. 性能
Mutex:
- 适用于需要独占访问的场景,性能较简单,开销较小。
RwMutex:
- 在有多个读操作的情况下,
rwmutex
提供更好的性能,因为它允许多个线程同时读取。写操作则会导致所有读操作被阻塞,因此在写操作频繁的场景中可能会导致性能下降。
- 在有多个读操作的情况下,
3. 使用场景
Mutex:
- 适用于写操作频繁或读写比例接近的场景。
RwMutex:
- 更适合读操作远多于写操作的场景,如缓存、配置读取等。
如何针对gc进行优化
GC 的调优是在特定场景下产生的,并非所有程序都需要针对 GC 进行调优。只有那些对执行延迟非常敏感、当 GC 的开销成为程序性能瓶颈的程序,才需要针对 GC 进行性能调优,几乎不存在于实际开发中 99% 的情况。除此之外,Go 的 GC 也仍然有一定的可改进的空间,也有部分 GC 造成的问题,目前仍属于 Open Problem。
总的来说,我们可以在现在的开发中处理的有以下几种情况:
对停顿敏感:GC 过程中产生的长时间停顿、或由于需要执行 GC 而没有执行用户代码,导致需要立即执行的用户代码执行滞后。
对资源消耗敏感:对于频繁分配内存的应用而言,频繁分配内存增加 GC 的工作量,原本可以充分利用 CPU 的应用不得不频繁地执行垃圾回收,影响用户代码对 CPU 的利用率,进而影响用户代码的执行效率。
从这两点来看,所谓 GC 调优的核心思想也就是充分的围绕上面的两点来展开:优化内存的申请速度,尽可能的少申请内存,复用已申请的内存。或者简单来说,不外乎这三个关键字:控制、减少、复用。
- 降低并复用已经申请的内存
- 调整 GOGC减少其触发频率
- 逃逸分析优化
- 控制对象生命周期,及时释放引用,将不再使用的变量设为 nil。