飞书后端一面
大家好~今天给大家带来一位学弟飞书面试一面的面试复盘。(仅部分重要题目)
转载链接:https://www.bilibili.com/read/cv15459752?spm_id_from=333.999.0.0
对于这个这个问题,首先我们需要了解http协议的头部字段,我们可以直接对照http的头部字段按照json格式一个个进行k-v健值对的解析出来。然后根据自己需要的字段信息来获取想要的信息。
了解哪些 nginx 负载均衡算法,分别有什么优缺点。
轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决***页存在的session共享问题。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有
down,表示当前的server暂时不参与负载均衡
weight 默认为1,weight越大,负载的权重就越大。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低
max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
fail_timeout,请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。
首先我们可以知道我们三次握手有一个半链接队列被用于syn攻击,这样的话我们这里肯定是有超时操作的。
socket接收数据有一种阻塞式的接收有超时操作,如果长时间没有读取数据会自动断开。
1. 给出一个 nums 集合,请你求出有多少对 (i, j) 满足 nums[i] + rev(nums[j]) = nums[j] + rev(nums[i]) ,其中 rev(x) 表示 x 反转后的值,例如 rev(120) = 21,rev(123) = 321,求出的答案对 1e9 + 7 取模。
2. C++ 实现一个有序链表类,支持添加和删除元素的功能,添加元素时,将元素添加到合适位置,例如 1->3->7,添加 5 后变为 1->3->5->7;删除元素时,删除所有值为 value 的节点,例如 1->5->5->7,删除 5 后变为 1->7;
#后端##面经##字节跳动##后端开发#
转载链接:https://www.bilibili.com/read/cv15459752?spm_id_from=333.999.0.0
网络相关
对于一个HTTP流过来之后我们应该如何处理。对于这个这个问题,首先我们需要了解http协议的头部字段,我们可以直接对照http的头部字段按照json格式一个个进行k-v健值对的解析出来。然后根据自己需要的字段信息来获取想要的信息。
了解哪些 nginx 负载均衡算法,分别有什么优缺点。
轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
upstream bakend { server 192.168.0.1; server 192.168.0.2; }
轮询权值
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
upstream bakend { server 192.168.0.1 weight=10; server 192.168.0.2 weight=10; }
ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决***页存在的session共享问题。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream bakend { ip_hash; server 192.168.0.1:88; server 192.168.0.2:80; }
负载均衡调度状态
在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有
down,表示当前的server暂时不参与负载均衡
weight 默认为1,weight越大,负载的权重就越大。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低
max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
fail_timeout,请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。
upstream bakend{ ip_hash; server 192.168.0.1:90 down; server 192.168.0.1:80 weight=2; server 192.168.0.2:90; server 192.168.0.2:80 backup; }
socket编程
1. socket 编程中,哪些时候可能会造成超时现象。首先我们可以知道我们三次握手有一个半链接队列被用于syn攻击,这样的话我们这里肯定是有超时操作的。
socket接收数据有一种阻塞式的接收有超时操作,如果长时间没有读取数据会自动断开。
编程题:
1. 给出一个 nums 集合,请你求出有多少对 (i, j) 满足 nums[i] + rev(nums[j]) = nums[j] + rev(nums[i]) ,其中 rev(x) 表示 x 反转后的值,例如 rev(120) = 21,rev(123) = 321,求出的答案对 1e9 + 7 取模。
思路:将表达式移项得到:nums[i] - rev(nums[i]) = nums[j] - rev(nums[j]),那么对于每一个 i 计算出相应的 nums[i] - rev(nums[i]) 然后用 map 存起来,之后枚举时只需要得到 1~i - 1中有多少个和 i 相同即可。
代码:
#include <bits/stdc++.h> using namespace std; const int mod = 1e9 + 7; int rev(int x) { int ret = 0; while (x) { ret = ret * 10 + x % 10; x /= 10; } return ret; } int solve(vector<int>& nums) { unordered_map<int, int> m; int ans = 0; for (int i = 0 ; i < nums.size() ; i ++) { int cur = nums[i] - rev(nums[i]); ans = (1LL * ans + m[cur]) % mod; m[cur] ++; } return ans; } int main() { vector<int> nums = {120, 130, 140, 150, 160}; cout << solve(nums) << endl; return 0; }
#后端##面经##字节跳动##后端开发#