2024-03-19
面试
00
请注意,本文编写于 309 天前,最后修改于 308 天前,其中某些信息可能已经过时。

目录

面试问题
Golang
Slice
函数传slice时会改变吗
append会影响slice吗
slice结构
slice扩容机制
GMP
GC
Channel
channel的原理
channel相比锁的优缺点
map
sync.Map
分布式
CAP
C - 一致性
A - 可用性
p - 分区容错性
BASE
B
A
S - 软状态
E - 最终一致性
raft
三个角色
2PC/3PC
TCC
一致性哈希为什么稳定
项目
etcd选举

面试问题

Golang

Slice

函数传slice时会改变吗

如果非扩容,则对slice的修改会影响到外面,反之则不会

append会影响slice吗

append返回了一个新的切片,其实是扩容操作

slice结构

slice扩容机制

GMP

GC

Channel

channel的原理

channel相比锁的优缺点

map

sync.Map

分布式

CAP

C - 一致性

这里的一致性和我们平常最常用的最终一致性不一样

这里的一致性是当写入某一个值并得到返回结果后,无论在任意一个节点上访问都能获得写入后的值

A - 可用性

系统的可用性不仅仅是系统能得到返回结果,而且是希望能在一定时间内响应

在系统内的体现就是,无论你访问了哪个节点,都能得到响应数据,但是无法保证数据的准确性,强调的是服务的可用

p - 分区容错性

是否支持网络分区,其实就是节点之间无法通信,我们就认为出现了网络分区,而在分布式系统中,网络分区是无法避免的

BASE

B

A

S - 软状态

E - 最终一致性

raft

从本质上说,Raft 算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致

三个角色

  • Leader
  • Follwoer
  • Candidate

2PC/3PC

TCC

try-confirm-cancel
和2PC相比,TCC是在应用层面上做分布式事务的

  • try: 主要是预留资源,检查是否有足够的资源完成事务
  • confirm: 当协调者收到所有参与者的yes后,即认为可以完成当前事务,所以发送提交信号,参与者将事务提交
  • cancel: 当协调者收到其中某个参与者的no后,即认为无法完成,所以发送取消信号,参与者将取消这次事务

一致性哈希为什么稳定

因为一致性哈希如果节点下线了,需要迁移的也只是部分节点,而如果是hash取余的话,需要所有节点都重新进行迁移

项目

etcd选举

利用了etcd的watchrevision机制
多节点之前,有一个公共的锁前缀,例如/lock/mylock
然后启动时,各节点往etcd里写入一个kv对,为/lock/mylock/$WORKER_ID
这时会返回一个revision值,这个revision是全局唯一的,每次写入或删除一个kv都会加一
每次写入后,会检查当前的revision值是否是该公共前缀中的所有kv对中最小的,如果是,则其作为主节点
如果不是,则监听比他小的前一个情况,避免惊群效应

本文作者:Malyue

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!