syntax = "proto3"; import "google/protobuf/empty.proto"; option go_package = "./postal"; enum DeliverResult { Success = 0; ReceiverOffline = 1; } service Postal { rpc Deliver(ReqDeliver) returns (ResDeliver); rpc DeliverBatch(ReqDeliverBatch) returns(ResDeliver); // broadcast request to postal cluster rpc DeliverGroup(ReqDeliverGroup) returns(ResDeliver); // rpc GroupCreate(ReqGroupCreate) returns(ResGroupCreate); rpc GroupJoin(ReqGroupJoin) returns(google.protobuf.Empty); rpc GroupLeave(ReqGroupLeave) returns(google.protobuf.Empty); rpc GroupDissolve(ReqGroupDissolve) returns(google.protobuf.Empty); // 返回当前节点外部连接断点, 如 websocket addr rpc Endpoint(google.protobuf.Empty) returns(ResEndpoint); } message Message { int64 time = 3; int32 svcNo = 4; int32 msgNo = 5; string svc = 13; string msg = 14; bytes body = 15; // protobuf bytes } message ReqDeliver { string receiver = 1; Message msg = 2; // bool sync = 7; // 是否同步阻塞等待投递结果, 默认false立即返回放到队列消费投递 } message ResDeliver { bool ok = 1; int32 code = 2; string msg = 3; } message ReqDeliverBatch { repeated string receivers = 1; Message msg = 2; } message ReqDeliverGroup { string gid = 1; Message msg = 2; } message ReqGroupCreate { string gid = 1; // 群id map tags = 3; // 群标签... bool persistent = 7; // 群关系是否持久化, 默认否 } message ResGroupCreate { string gid = 1; // 群id } message ReqGroupJoin { string uid = 1; repeated string gids = 2; } message ReqGroupLeave { string uid = 1; repeated string gids = 2; } message ReqGroupDissolve { string gid = 1; } // 集群之间接口调用,重定向消息... service PostalCluster { // socket不在当前节点,重新投递消息 rpc Redirect(ReqRedirect) returns(ResDeliver); } message ReqRedirect { int32 ttl = 1; // 投递一次减一, 到0丢弃 int32 redirectMethod = 2; // 10 deliver, 11 deliverBatch, 12 deliverGroup // bool sync = 7; // 是否同步阻塞等待投递结果,否则放到channel顺序投递 ReqDeliver deliver = 10; ReqDeliverBatch deliverBatch = 11; ReqDeliverGroup deliverGroup = 12; } message ResEndpoint { string endpoint = 1; map extra = 2; }