grpc-rpc如何实现异步链式请求

业务中需要实现grpc请求的链式调用,服务流程如下所示:

client->serverA->serverB

在grpc服务端的创建CallData,代码如下所示:

class CallData {
    public:
        CallData(Save::AsyncService *service, ServerCompletionQueue *completionQueue) :
                status_(CREATE),
                service_(service),
                completionQueue_(completionQueue),
                responder_(&context_) {
            //Invoke the sereving logic right away
            Proceed();
        }

        void Proceed() {
            if (CREATE == status_) {
                status_ = PROCESS;
                service_->Request(&context_, &request_, &responder_, completionQueue_, completionQueue_, this);
            } else if (PROCESS == status_) {
                new CallData(service_, completionQueue_, sender_);
                
                //在此处新建异步请求吗?改写没有思路
                
                status_ = FINISH;
                responder_.Finish(reply_, Status::OK, this);
            } else {
                GPR_ASSERT(FINISH == status_);
                delete this;
            }
        }

    private:
        enum CallStatus {
            CREATE, PROCESS, FINISH
        };
        CallStatus status_;
        
        //省略相关变量
    };

在CallData的Proceed没有想到如何进行下一步的异步请求,以及如何处理返回的结果,求指教!

阅读 5.1k
1 个回答
新手上路,请多包涵

class CallData {

public:
    CallData(Save::AsyncService *service, ServerCompletionQueue *completionQueue) :
            status_(CREATE),
            service_(service),
            completionQueue_(completionQueue),
            responder_(&context_) {
        //Invoke the sereving logic right away
        Proceed();
    }

    void Proceed() {
        if (CREATE == status_) {
            status_ = PROCESS;
            service_->Request(&context_, &request_, &responder_, completionQueue_, completionQueue_, this);
            
            **doSomeThing();**
            
            
        } else if (PROCESS == status_) {
            new CallData(service_, completionQueue_, sender_);
            
            //在此处新建异步请求吗?改写没有思路
            
            status_ = FINISH;
            responder_.Finish(reply_, Status::OK, this);
        } else {
            GPR_ASSERT(FINISH == status_);
            delete this;
        }
    }

private:
    enum CallStatus {
        CREATE, PROCESS, FINISH
    };
    CallStatus status_;
    
    //省略相关变量
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进