Comments (9)
最后还有一个小建议,CounterClient这个例子里面在client调用完之后,加一句cliClientService.disconnect(leader.getEndpoint());
关闭与leader节点的连接比较好?
from sofa-jraft.
- 可以的,idx 不是用于区分 group ,而是用于区分同一个端口的不同 node,暂时还不需要用到。
- CounterClient 只是一个简单实例,所以他是单 raft group 的,对于复杂的多 group 例子可以看 rheakv 代码或者 jraft-test 里的 atomic server。如果是多 group,客户端需要感知到多个 group 这个路由信息,可以交给 RouteTable 维护。
from sofa-jraft.
还是没有太理解。
假如我现在有三个节点,我想在每一个节点启动3个raft group但是只监听同一个端口,是不是用下面的代码就可以实现了
void create1(){
Configuration conf = JRaftUtils.getConfiguration("192.168.130.1:8000,192.168.130.2:8000,192.168.130.3:8000");
final NodeOptions nodeOptions = new NodeOptions();
nodeOptions.setInitialConf(initConf);
// 192.168.130.1节点启动
start("group1", JRaftUtils.getPeerId("192.168.130.1:8000"), nodeOptions, rpcServer);
start("group2", JRaftUtils.getPeerId("192.168.130.1:8000"), nodeOptions, rpcServer);
start("group2", JRaftUtils.getPeerId("192.168.130.1:8000"), nodeOptions, rpcServer);
}
void start(String groupID, PeerId peerId, NodeOptions nodeOptions, RpcServer rpcServer){
RaftGroupService raftGroupService = new RaftGroupService(groupID, peerId, nodeOptions, rpcServer);
// 这里不考虑raftGroupService.start()阻塞的问题
raftGroupService.start();
}
// 还是我需要用到idx
void create2(){
for(int i = 1; i <= 3; i++){
Configuration conf = JRaftUtils.getConfiguration(String.format("192.168.130.1:8000:%d,192.168.130.2:8000:%d,192.168.130.3:8000:%d", i, i, i));
final NodeOptions nodeOptions = new NodeOptions();
nodeOptions.setInitialConf(initConf);
start("group"+i, JRaftUtils.getPeerId("192.168.130.1:8000:"+i), nodeOptions, rpcServer);
}
}
看了atomic server还是没有能够理解,final Object response = this.rpcClient.invokeSync(peer.getEndpoint().toString(), request,cliOptions.getRpcDefaultTimeout());
。这句话在调用的时候只用到了Endpoint信息,也就是ip和端口,如果有多个raft group监听一个端口,客户端怎么知道具体发给了哪个raft group?
from sofa-jraft.
入参 request.groupId 来实现不同分组的 rpc 路由
from sofa-jraft.
是说request里面附带groupID,然后handleRequest逻辑里面根据这个值,选择对应的Node生成Task然后apply?
from sofa-jraft.
@MyXOF 对的,可以看下 NodeRequestProcessor 代码
from sofa-jraft.
是说request里面附带groupID,然后handleRequest逻辑里面根据这个值,选择对应的Node生成Task然后apply?
抱歉刚才没仔细看你的后半句,我上面说的是 jraft-core 是如何对多 group 做隔离的,CliSevice 也是相同方式(BaseCliRequestProcessor)
但 Node#apply() 属于 jraft-core 上层了,如果你是想问基于 jraft 怎么开发 multi-raft-group 的应用的话,建议你参考 rheaKV, 文档在这里 https://github.com/alipay/sofa-jraft/wiki/JRaft-RheaKV-%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97
from sofa-jraft.
我看了rheaKV项目,它实现多raft-group的方法就是StoreEngine里面有一个ConcurrentMap<Long, RegionEngine> regionEngineTable,这个RegionEngine就相当于一个raftgroup,每次客户端请求的时候带一个regionID,然后去Map里面查到对应raft group,然后在对应的raft group里面生成Task然后给node.apply(Task)
不知道我的理解对不对。
感觉如果想要实现 一个节点上有multi-raft-group 的话,看jraft-test项目里面的AtomicServer和AtomicRangeGroup更容易理解一些。
from sofa-jraft.
如果没有更多问题先关闭了。
from sofa-jraft.
Related Issues (20)
- 希望尽快适配高版本jdk,目前尝试改动源代码升级到jdk21.启动集群正常,但是CliService工具异常,提示Connection is null when do check! HOT 5
- 能否对新加入的参与者提供自认证机制。或者预留自认证机制接口,让用户自己实现 HOT 15
- 对于rheakv分为:kv数据存储目录以及raft log存储目录。但是参与者之间数据同步处理的是日志目录。那kv数据目录怎么同步了 HOT 1
- 请教个问题:任务应用到多数派状态机决定条件是怎样的???对于kv系统是否因为这个导致数据丢失。 HOT 5
- 请教个问题:有没有配置或者一种机制(比如多长时间后),对于离线的节点,leader心跳检测临时抛弃 HOT 5
- 节点重启有机率出现No locks available,不知道这正常吗?? HOT 3
- 能否通过spi开放集群成员合法性校验,同时允许成员携带额外信息(用户自行实现成员合法性校验时使用) HOT 13
- AssertionError in AppendEntriesRequestProcessor HOT 1
- Commit index may be smaller than snapshot index HOT 1
- 请教问题:jraft的log目录会不会随着系统运行时间而无限增加,有没有清空策略 HOT 4
- 请教个问题:应用到多数派方式是不是可能导致数据丢失。 HOT 1
- fowlloe
- 集群重启时,follower启动失败
- what's the best way to re-add an existing node to the cluster in EKS
- How to verify the legitimacy of a member? HOT 2
- ReadIndex frequently times out. HOT 4
- Unrecycled RPC threads cause OOM HOT 2
- Deadlock on configuration application in NodeImpl when disruptors are full HOT 9
- 压测性能耗时较高,200多ms HOT 2
- 在这种情况下是不是会出现死锁? HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sofa-jraft.