2023年3月4日
题目:zk中zab的工作原理 参考答案: ZAB 是 ZooKeeper Atomic Broadcast (ZooKeeper 原子广播协议)的缩写,它是特别为 ZooKeeper 设计的崩溃可恢复的原子消息广播算法。ZooKeeper 使用 Leader来接收并处理所有事务请求,并采用 ZAB 协议,将服务器数据的状态变更以事务 Proposal 的形式广播到所有的 Follower 服务器上去。这种主……
阅读全文
2023年3月4日
题目:zookeeper是如何保证事务的顺序一致性的? 参考答案: zookeeper采用了递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch(时期; 纪元; 世; 新时代)用来标识leader是否发生……
阅读全文
2023年3月4日
题目:zk集群下server工作状态 参考答案: 每个Server在工作过程中有四种状态: LOOKING:当前Server不知道leader是谁,正在搜寻 LEADING:当前server角色为leader FOLLOWING:当前server角色为follower OBSERVING:当……
阅读全文
2023年3月4日
题目:zookeeper是如何选举Leader的? 参考答案: 当leader崩溃或者leader失去大多数的follower,这时zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic pa……
阅读全文
2023年3月4日
题目:zookeeper同步流程 参考答案: 选完Leader以后,zk就进入状态同步过程。 Leader等待Follower和Observer连接; Follower连接leader,将最大的zxid发送给leader; Leader根据follower的zxid确定同步点; 完成同步后通……
阅读全文
2023年3月4日
题目:分布式通知和协调 参考答案: 对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,然后zk将这些变化发送给注册了这个节点的watcher的所有客户端。 对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工作的进度数据,这样汇总的进程可以监控目录……
阅读全文
2023年3月4日
题目:zk的session机制 参考答案: zookeeper会为每个客户端分配一个session,类似于web服务器一样,用来标识客户端的身份。 session的作用: 客户端标识 超时检查 请求的顺序执行 维护临时节点的生命周期 watcher通知 session的状态: CONNECTING CONNECTED RECONNECTING RECONNECTED CLOSED sessio……
阅读全文
2023年3月4日
@LiuYongQiang6 目标岗位 本硕均为机电专业相关,比赛和项目也是软硬件结合,个人软开背景中学已经学过pascal和数据结构与算法,大学本科除了C语言和微机原理基本没学过CS相关课程,研究生才把操作系统、组原以及计算机网络补上,顺便补了个c++,抽空玩linux,秋招前3个月开始刷题(牛客300,力……
阅读全文
2023年3月4日
题目:找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 出题人:阿里巴巴新零售技术质量部 参考答案: 遍历数组的同时用Object来储存每个元素出现的个数,每次遍历都跟max比较 参考代码: const arr =[1,2,3,4,5,6,7,8,89,9,9,9,9,99]; const maxNumObj =(arr)=>{ return arr.reduce((obj,cur)=>{ if(!obj['max']){ obj['max']=arr[0]; } obj[cur] = ++obj[cur]||1;……
阅读全文
2023年3月4日
题目: 找出被修改过的数字 出题人:阿里巴巴新零售技术质量部 参考答案: emmm假设背景是寻找数组中被修改的数字或者元素,我使用代理的方式来监听数组中元素的变化,并将变化的最后数值和次数储存在额外空间中 参考代码: const arr =[1,2,3,4,5,6,7,8,89,9,9,9,9,99]; const saveModifyNum={ } const watchNumChangeProxy=new Proxy(arr,{ set:function(target,key,value){ let {count} = Reflect.get(saveModifyNum,target[key])||{count:0,value}; ++count; return Reflect.set(saveModifyNum,target[key],{ count, value }); } }) watchNumChangeProxy[0]=2; watchNumChangeProxy[0]=3; watchNumChangeProxy[0]=4; //{ '1': { count: 3, value: 4 } }……
阅读全文