Coder Social home page Coder Social logo

Comments (9)

MyXOF avatar MyXOF commented on July 21, 2024

最后还有一个小建议,CounterClient这个例子里面在client调用完之后,加一句cliClientService.disconnect(leader.getEndpoint());关闭与leader节点的连接比较好?

from sofa-jraft.

killme2008 avatar killme2008 commented on July 21, 2024
  1. 可以的,idx 不是用于区分 group ,而是用于区分同一个端口的不同 node,暂时还不需要用到。
  2. CounterClient 只是一个简单实例,所以他是单 raft group 的,对于复杂的多 group 例子可以看 rheakv 代码或者 jraft-test 里的 atomic server。如果是多 group,客户端需要感知到多个 group 这个路由信息,可以交给 RouteTable 维护。

from sofa-jraft.

MyXOF avatar MyXOF commented on July 21, 2024

还是没有太理解。
假如我现在有三个节点,我想在每一个节点启动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.

fengjiachun avatar fengjiachun commented on July 21, 2024

入参 request.groupId 来实现不同分组的 rpc 路由

from sofa-jraft.

MyXOF avatar MyXOF commented on July 21, 2024

是说request里面附带groupID,然后handleRequest逻辑里面根据这个值,选择对应的Node生成Task然后apply?

from sofa-jraft.

fengjiachun avatar fengjiachun commented on July 21, 2024

@MyXOF 对的,可以看下 NodeRequestProcessor 代码

from sofa-jraft.

fengjiachun avatar fengjiachun commented on July 21, 2024

是说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.

MyXOF avatar MyXOF commented on July 21, 2024

我看了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.

killme2008 avatar killme2008 commented on July 21, 2024

如果没有更多问题先关闭了。

from sofa-jraft.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.