folly官方例子

folly官方例子

async request

Future<vector<LeafResponse>> fanout(const map<Leaf, LeafReq> &leafToReqMap,
                                    chrono::milliseconds timeout) {
  vector<Future<LeafResponse>> leafFutures;
  for (const auto &kv : leafToReqMap) {
    const auto &leaf = kv.first;
    const auto &leafReq = kv.second;
    leafFutures.push_back(
        // Get the client for this leaf and do the async RPC
        getClient(leaf)
            ->futureLeafRPC(leafReq)
            // If the request times out, use an empty response and move on.
            .onTimeout(timeout, [=] { return LeafResponse(); })
            // If there's an error (e.g. RPC exception),
            // use an empty response and move on.
            .onError([=](const exception &e) { return LeafResponse(); }));
  }
  // Collect all the individual leaf requests into one Future
  return collect(leafFutures);
}
// Some sharding function; possibly dependent on previous responses.
map<Leaf, LeafReq> buildLeafToReqMap(const Request &request,
                                     const vector<LeafResponse> &responses);
// This function assembles our final response.
Response assembleResponse(const Request &request,
                          const vector<LeafResponse> &firstFanoutResponses,
                          const vector<LeafResponse> &secondFanoutResponses);
Future<Response> twoStageFanout(shared_ptr<Request> request) {
  // Stage 1: first fanout
  return fanout(buildLeafToReqMap(*request, {}), FIRST_FANOUT_TIMEOUT_MS)
      // Stage 2: With the first fanout completed, initiate the second fanout.
      .then([=](vector<LeafResponse> &responses) {
        auto firstFanoutResponses =
            std::make_shared<vector<LeafResponse>>(std::move(responses));

        // This time, sharding is dependent on the first fanout.
        return fanout(buildLeafToReqMap(*request, *firstFanoutResponses),
                      SECOND_FANOUT_TIMEOUT_MS)

            // Stage 3: Assemble and return the final response.
            .then([=](const vector<LeafResponse> &secondFanoutResponses) {
              return assembleResponse(*request, *firstFanoutResponses,
                                      secondFanoutResponses);
            });
      });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值