首页 > 百度社招面经后台开发(一面)
头像
食人鬼
编辑于 2021-08-11 13:21
+ 关注

百度社招面经后台开发(一面)

百度面经

一面

难度:★★★★☆

考的比较活,需要面试者真的理解其原理,而不是背书,这面虽然进行了一个半小时,但感觉很愉快。采用的是视频面试。

你负责你们组的搜索项目,那贵司ES集群是如何搭建的?如何优化的?

1.这块内容涉密了,不在帖子里谈。

2.什么是ES脑裂?如何防止脑裂?

当ES集群里出现两个master主结点时,整个集群被分为了两个集群,即为脑裂。防止脑裂就是将zen.discovery.minimum_master_nodes这项设置成 “有资格当选master node的节点数量//2 + 1"

3.如果你有一个50个node的ES集群,你该怎么优化?

分为冷集群和热集群,热集群即为较新的数据,也是最经常被访问的,采用较高配置,比如SSD硬盘,大容量内存等;冷集群为老数据,不经常被访问,采用低配置,例如机械硬盘。查询时,在业务逻辑层面上,进行分开查询。(其实这道题目我是经过面试官提醒以后才答出来的)

4.ES的写入效率怎么提升?

自动生成docID

合理设计mappings,在不需要进行分词的字段,采用keyword类型

降低refresh频率,频繁地refresh会导致频繁段合并,段合并会占用大量系统资源,影响写入速度降低flush频率,flush是将内存写入磁盘的过程,ES默认是每次都flush,实际上,如果能够容忍丢失的话,这个是可以更改的,可以更改为固定频率,或者调高阈值。

使用bulk api进行批量插入

5.如果bulk写入超时了应该怎么办?

这个我不会..因为没碰到过,面试官说,可以适当提高线程池最大线程数量

6.在kibana看到的search rate跟你在外面调用测出来的search rate一样吗?为什么不一样?

不一样,kibana上的search rate明显高于实际的search rate,因为kibana观察的是内部单个node的search rate,只占实际search rate一部分

7.ES shards在什么时候处于unassigned状态?如何解决?

当有节点脱离集群时,需要进行reallocate,此时有一个延迟拷贝机制,这时候就会出现结点unassigned状态,集群状态变黄。

还有一种情况是,使用shrink API时,如果执行完shrink, 不恢复索引至多node状态, 就会出现replica unassigned状态。

解决方案要不然就是直接删除unassigned shard,要不然就是把unassgined shard给分配了

8.redis-cluster原理?

忘记是怎么聊到redis-cluster了, 我也完全没怎么用过redis-cluster,所以就用elasticsearch cluster的原理答了一下还就答对了,一个redis集群包含若干个哈希槽,也就相当于若干个shards,集群中的每个redis节点,分配到一部分槽。而集群使用公式CRC16(key) % 16384来计算每次请求的键key属于哪个槽

9.Golang defer的原理

defer用于函数执行后传入的函数,它是在声明时就计算好的,并且按照先进后出的顺序来进行执行,一般用于关闭文件句柄、关闭数据库连接等。 具体而言,分为连个阶段: 编译期,将defer关键字被转换runtime.deferproc; 在调用defer关键字的函数返回之前插入runtime.deferreturn; 运行时,runtime.deferproc会将一个新的runtime._defer结构体追加到当前Goroutine的链表头;runtime.deferreturn会从Goroutine的链表中取出runtime._defer结构并依次执行;

10.defer跟Python的什么有点像?

跟Python的上下文管理器with有点像,可以在类里面定义exit方法来实现defer一样的功能

11.Python的装饰器怎么用?

如果你想在一个函数执行前或者执行后,固定执行一些逻辑的话,就可以用装饰器,例如,对函数进行计时

def log_duration(func):

@wraps(func)

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(end_time - sgart_time)

return result

return wrapper

在任意需要用到的函数上装饰即可:

@log_duration

def add(a,b):

return a + b

12.装饰器对应了Python语言的什么思想?

万物皆对象..

13.Goroutine为什么轻?

bilibili一面原题,往上翻就行

14.goroutine和系统线程是一对一的关系吗?

不是,是M对N的关系,系统线程M和P才是一对一的关系

15.一个goroutine它会一直在一个线程上面跑吗?它会不会切换?

一旦一个goroutine陷入阻塞或者系统调用的时候,P和M就会脱离这个goroutine,阻塞结束时,接管这个goroutine的可能就是另一个M了

16.你有10000个url要请求,但是只想同一时刻有10个goroutine同时在跑,如何限制goroutine的数量?

写过goroutine的应该都遇到过这个问题,利用channel控制并发的数量即可,写个demo:

func BatchDownload(URLList []string)  {

URLChannel := make(chan string, ThreadNum)


for i := 0; i < ThreadNum; i++ {

go downloadWorker(URLChannel)

}


for _, url := range URLList {

URLChannel <- url

}

close(URLChannel)


}


func downloadWorker(URLChannel chan string) {

for {

url, ok := <- URLChannel

if !ok {

return

}

download(url)

}

}


func download(url string){

fmt.Println("download...", url)

}

17.如何等待子goroutine全部执行结束再进行后续逻辑?

两种方法,第一种是信号量的方法,WaitGroup, 另一种是管道的方法,用一个channel来接收结果.

求一个字符串内最长不重复的子串。

剑指offer原题,利用双指针,右指针不断向前进,并把遍历到的字符放入set中,并更新最大值,一旦发现一个存在的字符,就查看左指针对应的字符是否在集合中,如果存在就删除,左指针向右前进。

class Solution:

def lengthOfLongestSubstring(self, s: str) -> int:

left, right, ans, chars = 0, 0, 0, set()

while left<len(s) and right < len(s):

if s[right] not in chars:

chars.add(s[right])

ans = max(ans, len(chars))

right += 1

else:

if s[left] in chars:

chars.remove(s[left])

left += 1

return ans


更多模拟面试

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐