-
Notifications
You must be signed in to change notification settings - Fork 1
Implement
Welcome to the SnStore wiki!
书写.proto文件定义消息和服务
option cc_generic_services = true;
option java_generic_services = true;
option py_generic_services = true;
message GetRequest {
required int32 key = 1;
}
message GetResponse {
required string value = 1;
}
service DbService
{
rpc get(GetRequest) returns (GetResponse);
}
用protoc生成.pb.h. GetRequest 转化为class GetRequest,GetResponse转化为class GetResponse Get 转化为rpc调用
void get(RpcController * controller, const GetRequest * request, GetResponse * response, Closure * done );
void
Coordinator::get(RpcController * controller, const GetRequest * request, GetResponse * response, Closure * done)
{
int key = request->key();
if(db.count(key) == 0)
response->set_value(NULL);
else
response->set_value(db[key]);
done->Run();
}其中,key和value分别对应GetRequest和GetResponse中的key和value。
以Map为例
RepeatedPtrField<TxResponse_map> rst = response.retvalue();
RepeatedPtrField<TxResponse_map>::iterator it = rst.begin();
for(; it != rst.end(); it++)
Debug(it->key()<<","<<it->value()<<std::endl);class SnStore {
public:
SnStore();
string get(int key);
void put(int key, string value);
vector<string> getRange(int minKey, int maxKey);
void beginTx();
void commit();
private:
bool tx;
string tx_args;
}; 提供给用户的get操作,参数为key
提供给用户的put操作,参数为key,value
提供给用户的getRange,参数为下界与上界
开始一个事务,一个client同时只能有一个事务
提交一个事务。调用rpc来进行事务。
对应于.proto中设计的message结构,进行request处理并且设置response、最后远程调用返回。
以get为例,有用的参数有
const GetRequest * request, GetResponse * response, Closure * done
Request为客户端发送的请求,response为要返回给用户的值。 首先,从request中提取信息,get请求发送的信息为key,通过request->key()获得,然后response要返回一个value,则通过response->set_value(value)来设置,设置成功后调用done->Run()使客户端远程调用结束。如果不调用,客户端会抛超时异常。 对应于每个不同的rpc请求,查看RCFProto目录下的.proto文件查看其message的格式并进行rpc处理。
RCFProto client-side configuration is done using the RcfProtoChannel class.
For example, to set connect timeouts and remote call timeouts:
RCF::RcfProtoChannel channel( RCF::TcpEndpoint("127.0.0.1", 50001) );
// 5s connect timeout.
channel.setConnectTimeoutMs(5*1000);
// 10s remote call timeout.
channel.setRemoteCallTimeoutMs(10*1000);You can configure transport protocols:
// Enable transport level compression.
channel.setEnableCompression(true);
// Configure NTLM transport protocol.
channel.setTransportProtocol(RCF::Tp_Ntlm);