Skip to content
Zeyi Zhao edited this page Jun 19, 2014 · 4 revisions

Welcome to the SnStore wiki!

使用RCFProto

书写.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 );

Get函数实现

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。

Repeated 值的使用

以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);

Client设计

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

提供给用户的get操作,参数为key

put

提供给用户的put操作,参数为key,value

getRange

提供给用户的getRange,参数为下界与上界

beginTx

开始一个事务,一个client同时只能有一个事务

commit

提交一个事务。调用rpc来进行事务。

Server中的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处理。

Client Configuration

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);

Clone this wiki locally