贝壳后端golang面经


了解什么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。
相关推荐
952361 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S3 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人3 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang3 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje4 小时前
Java语法进阶
java·开发语言·jvm
uzong4 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
老前端的功夫4 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287924 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本4 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka