贝壳后端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。
相关推荐
菥菥爱嘻嘻2 小时前
JS手写代码篇---Pomise.race
开发语言·前端·javascript
南瓜胖胖2 小时前
【R语言编程绘图-调色】
开发语言·r语言
lanbing3 小时前
非常适合初学者的Golang教程
开发语言·后端·golang
stormsha4 小时前
GO语言进阶:掌握进程OS操作与高效编码数据转换
开发语言·数据库·后端·golang·go语言·源代码管理
B1nna4 小时前
SpringBoot项目快速打包与部署,War包⽅式打包部署与Jar包⽅式打包部署两种方式
spring boot·后端·jar
老神在在0015 小时前
javaEE1
java·开发语言·学习·java-ee
魔道不误砍柴功5 小时前
《接口和抽象类到底怎么选?设计原则与经典误区解析》
java·开发语言
我是李武涯6 小时前
C++ 条件变量虚假唤醒问题的解决
开发语言·c++·算法
编码小笨猪6 小时前
[ Qt ] | 常用控件(三):
开发语言·qt
Bioinfo Guy6 小时前
R包安装报错解决案例系列|R包使用及ARM架构解决data.table安装错误问题
开发语言·arm开发·r语言