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

Streaming-AppendEntries #672

Open
5 tasks
fengjiachun opened this issue Aug 26, 2021 · 17 comments
Open
5 tasks

Streaming-AppendEntries #672

fengjiachun opened this issue Aug 26, 2021 · 17 comments
Labels
help wanted Extra attention is needed high priority

Comments

@fengjiachun
Copy link
Contributor

fengjiachun commented Aug 26, 2021

背景:

目前 jraft 日志复制基于普通 RPC 的一请求一响应模型,在 RPC 层之上实现了日志的 pipeline 复制,这给上层带来了复杂的控制逻辑,比如要绑定线程以保证发送和接收顺序,要维护一个 inflights FIFO 队列来保证顺序,我们还为此专门实现了一个 MpscSingleThreadExecutor (多生产者单消费者线程池)来提高性能,等等,以上种种,核心原因还是因为受到
一请求一响应的模型的约束从而带来的实现复杂度。

目标:

当前,jraft 有一层 rpc 层的抽象层,并且在去年我们也支持了 grpc,所以我们是否可以利用 grpc 的 streaming 来实现一个新的 AppendEntries,如果抛开一请求一相应的模型,可能有如下好处:

  1. 可以解除对 jraft 上层实现的高复杂度 pipeline 实现的依赖,极大的简化日志复制逻辑,让日志复制流程简单清晰
  2. 可能会减少 bug,虽然这一块目前为止基本上没什么 bug,但也遇到过因为心跳进入了 inflights 队列而导致被排序从而心跳超时
  3. 我们可以尝试合并 AppendEntries Response 来尽可能的减少网络开销和 leader 的处理逻辑开销,这个合并是指 follower 直接取消前边的 response, 只响应最新的 AppendEntries Request 即可,因为实际上 leader 只要收到最后一个 response 就足够了(leader 只是需要对应 follower 最新的 lastLogIndex 而已),当然,这个想法还需要要很多的正确性测试和效果验证,这个不是我创造的想法,更多来自这里 Maybe merge AppendResponse and free Inflights aggressively #500

我们需要做什么?

这个任务需要拆开为多个子任务,可能由多个人来实现,目前我们可以先尝试完成第一个任务,后面的任务需要更多细节设计,还需要再考虑。

  • 1. 首先,我们要在 rpc api 中新增 streaming 接口(RpcClient, RpcServer),然后基于 grpc 实现之,对于 bolt 我们可以选择暂时不支持该能力,我觉得这可以作为一个新手任务,欢迎大家认领
  • 2. 抽象出 Replicator,将现有的 Replicator 作为默认的一种实现
  • 3. 基于 streaming API 实现一个崭新的 Replicator,我们可以将这个特性基于 SPI 扩展,使用哪种 Replicator 由用户选择
  • 4. 要通过所有 jraft 单测以及 jepsen 验证
  • 5. 最后,要有一个 benchmark 证明我们前面的工作没白费
@horizonzy
Copy link
Member

先占个坑,对这个感兴趣。

@fangliji
Copy link

对这个感兴趣

@fengjiachun
Copy link
Contributor Author

对这个感兴趣

第一个子任务是你的了,感谢

@fengjiachun
Copy link
Contributor Author

先占个坑,对这个感兴趣。

你从第二个子任务开始?哈哈

@hzh0425
Copy link
Member

hzh0425 commented Aug 26, 2021

来晚了一步.. 请问第三个子任务的坑还能占不hh

@horizonzy
Copy link
Member

来晚了一步.. 请问第三个子任务的坑还能占不hh

哈哈,当然可以,一起搞吧

@hzh0425
Copy link
Member

hzh0425 commented Aug 26, 2021

来晚了一步.. 请问第三个子任务的坑还能占不hh

哈哈,当然可以,一起搞吧

感谢大佬!!!!

@fangliji
Copy link

抱歉,目前由于工作原因,最近没有时间搞这个

@horizonzy
Copy link
Member

抱歉,目前由于工作原因,最近没有时间搞这个

好的,没问题。剩下的我们来完成吧

@hzh0425
Copy link
Member

hzh0425 commented Sep 13, 2021

抱歉,目前由于工作原因,最近没有时间搞这个

好的,没问题。剩下的我们来完成吧

@horizonzy 大佬, 方便加个好友或者给个联系方式吗?

@fengjiachun
Copy link
Contributor Author

@horizonzy @hzh0425 给你们俩拉个群

@killme2008
Copy link
Contributor

这个事情我觉的可以启动下,我们可以在开发这群里讨论下

@sollhui
Copy link

sollhui commented Jul 11, 2022

请问这个任务还可以领取吗

@horizonzy
Copy link
Member

欢迎。

@sollhui
Copy link

sollhui commented Jul 11, 2022

@horizonzy 请问我需要怎么做呢,我需要把自己的想法写在这里然后进行评估吗,或者有没有对应的群呢,也许会碰到一些问题

@horizonzy
Copy link
Member

可以在 slack 上交流。

@fengjiachun
Copy link
Contributor Author

Slack

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed high priority
Projects
None yet
Development

No branches or pull requests

6 participants