Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

项目代码理解问题 #70

Closed
Lxxx11 opened this issue Jul 4, 2024 · 7 comments
Closed

项目代码理解问题 #70

Lxxx11 opened this issue Jul 4, 2024 · 7 comments

Comments

@Lxxx11
Copy link

Lxxx11 commented Jul 4, 2024

初始化为什么要上锁 保护的是什么变

竞选的时候follower发现自己的term比candidate小,然后更新自己的term就不投票了吗?还是一会再投?

选举的时候为什么也要加锁 保护的是什么变量 

持久化里面为什么要将快照持久化 将快照持久化有什么用

持久化为什么要先转化成字符串类型再进行序列化,为什么不直接序列化

日志同步的时候为什么要考虑到快照,为什么不直接讨论prevlogindex() 和 getLastLogIndex()的三种情况

为什么不讨论args->prevlogindex() < getLastLogIndex()这种情况

Copy link

github-actions bot commented Jul 4, 2024

Message that will be displayed on users' first issue

@578223592
Copy link
Collaborator

1初始化为什么要上锁 保护的是什么变
指明一下是哪个具体函数
2竞选的时候follower发现自己的term比candidate小,然后更新自己的term就不投票了吗?还是一会再投?
可以查看一下投票相关的函数,应该是更新自己的term并投出自己的票。
3.选举的时候为什么也要加锁 保护的是什么变量
多个函数都可能涉及log、term、身份的修改,而且是并发的,自然需要并发保护(加锁)。
3.持久化里面为什么要将快照持久化 将快照持久化有什么用
快照本质上是压缩了的log,log要持久化,快照自然也要持久化。
4.持久化为什么要先转化成字符串类型再进行序列化,为什么不直接序列化
你可以尝试给出一版改进。
5.日志同步的时候为什么要考虑到快照,为什么不直接讨论prevlogindex() 和 getLastLogIndex()的三种情况
可以参考问题3的回答。
6.为什么不讨论args->prevlogindex() < getLastLogIndex()这种情况
在什么地方没有讨论? 我盲猜一下,args->prevlogindex() < getLastLogIndex()的时候一般是外部日志更旧,那么就没必要更新自身的日志了。
@Lxxx11

@Lxxx11
Copy link
Author

Lxxx11 commented Jul 7, 2024

1、是Raft::init这块 就是感觉raft刚刚初始化,还没有创建成功 会涉及到并发情况的影响吗
6、日志同步的时候,领导者给跟随者发送自己的日志,发现跟随者的日志比自己的新,就是这种情况,跟随者是直接忽略吗
7、muduo网络库和线程池在本项目中具体是怎么使用的
8、项目是怎么测试运行的,怎么实现raft集群,是创建多个raft类吗,这块没太看懂
感谢作者能够回复

@Lxxx11
Copy link
Author

Lxxx11 commented Jul 7, 2024

9、日志一定是被应用完之后才能被快照吗 ,跟随者接收领导者快照那里,是不是发现自己当前的日志比领导者的快照大,就把自己多的部分清除,和领导者的快照保持一致吗,是什么情况导致跟随者的日志比领导者的快照都大。
10、快照是由状态机生成的吗,跟随者接收领导者快照那里,最后的applymsg是要干什么,应用到状态机吗
ApplyMsg msg;
msg.SnapshotValid = true;
msg.Snapshot = args->data();
msg.SnapshotTerm = args->lastsnapshotincludeterm();
msg.SnapshotIndex = args->lastsnapshotincludeindex();

applyChan->Push(msg);

@578223592
Copy link
Collaborator

1、是Raft::init这块 就是感觉raft刚刚初始化,还没有创建成功 会涉及到并发情况的影响吗 6、日志同步的时候,领导者给跟随者发送自己的日志,发现跟随者的日志比自己的新,就是这种情况,跟随者是直接忽略吗 7、muduo网络库和线程池在本项目中具体是怎么使用的 8、项目是怎么测试运行的,怎么实现raft集群,是创建多个raft类吗,这块没太看懂 感谢作者能够回复

1.我是习惯了可能并发就加锁了,当时写的时候主要侧重逻辑实现。此外,如果么有并发,由于有快速用户锁的原因,不太会影响性能。
6.这样的情况下,跟随者会修改rpc的返回值,rpc返回后,leader就知道自己落后了,就会退回成follower。
7.muduo负责rpc,线程池可以看:https://www.cnblogs.com/swx123/p/18037780 这篇文章
8.启动命令见README文件,大概就是启动多个raft类。这块写的同样粗糙,只保证了可以运行。测试问题见:#54
9.应该是的,是的,网络分区的时候有可能
10.是的。applymsg可以见service层拿到applyChan干了什么,包括但不限于应用到状态机。

@578223592 578223592 changed the title 关于一些疑问,如果能回答非常感激 项目代码理解问题 Jul 7, 2024
@Lxxx11
Copy link
Author

Lxxx11 commented Jul 8, 2024

基于protobuf和自定义协议实现RPC通信框架MprRpc通信框架完成各节点之间的远程调用和数据传递功能,设计rpc这块感觉好难看懂,面试的话如果问起如何实现的自定义实现rpc框架该怎么回答,可以大致说一下吗?还有就是多个raft节点之间如何进行通信那块也有点没看懂,也可以大致说一下吗,万分感谢

@578223592
Copy link
Collaborator

基于protobuf和自定义协议实现RPC通信框架MprRpc通信框架完成各节点之间的远程调用和数据传递功能,设计rpc这块感觉好难看懂,面试的话如果问起如何实现的自定义实现rpc框架该怎么回答,可以大致说一下吗?还有就是多个raft节点之间如何进行通信那块也有点没看懂,也可以大致说一下吗,万分感谢

这块的话就建议看一下c++ rpc的内容了哈,大家设计的都差不多,一两句说不清楚,而且我这个是同步的还不是异步的,异步的更加复杂。
关于面试的话多搜搜面试题才是王道。
@Lxxx11

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants