blob: 8b93e5bf694fe46d2fb46790e7affb61c23dc30c [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef BRPC_SELECTIVE_CHANNEL_H
#define BRPC_SELECTIVE_CHANNEL_H
// To brpc developers: This is a header included by user, don't depend
// on internal structures, use opaque pointers instead.
#include "brpc/socket_id.h"
#include "brpc/channel.h"
namespace brpc {
// A combo channel to split traffic to sub channels, aka "schan". The main
// purpose of schan is to load balance between groups of servers.
// SelectiveChannel is a fully functional Channel:
// * synchronous and asynchronous RPC.
// * deletable immediately after an asynchronous call.
// * cancelable call_id (cancels all sub calls).
// * timeout.
// Due to its designing goal, schan has a separate layer of retrying and
// backup request. Namely when schan fails to access a sub channel, it may
// retry another channel. sub channels inside a schan share the information
// of accessed servers and avoid retrying accessed servers by best efforts.
// When a schan would send a backup request, it calls a sub channel with
// the request. Since a sub channel can be a combo channel as well, the
// "backup request" may be "backup requests".
// ^
// CAUTION:
// =======
// Currently SelectiveChannel requires `request' to CallMethod be
// valid before the RPC ends. Other channels do not. If you're doing async
// calls with SelectiveChannel, make sure that `request' is owned and deleted
// in `done'.
class SelectiveChannel : public ChannelBase/*non-copyable*/ {
public:
typedef SocketId ChannelHandle;
SelectiveChannel();
~SelectiveChannel();
// You MUST initialize a schan before using it. `load_balancer_name' is the
// name of load balancing algorithm which is listed in brpc/channel.h
// if `options' is NULL, use default options.
int Init(const char* load_balancer_name, const ChannelOptions* options);
// Add a sub channel, which will be deleted along with schan or explicitly
// by RemoveAndDestroyChannel.
// On success, handle is set with the key for removal.
// NOTE: Different from pchan, schan can add channels at any time.
// Returns 0 on success, -1 otherwise.
int AddChannel(ChannelBase* sub_channel, ChannelHandle* handle);
// Remove and destroy the sub_channel associated with `handle'.
void RemoveAndDestroyChannel(ChannelHandle handle);
// Send request by a sub channel. schan may retry another sub channel
// according to retrying/backup-request settings.
void CallMethod(const google::protobuf::MethodDescriptor* method,
google::protobuf::RpcController* controller,
const google::protobuf::Message* request,
google::protobuf::Message* response,
google::protobuf::Closure* done);
// True iff Init() was successful.
bool initialized() const;
void Describe(std::ostream& os, const DescribeOptions& options) const;
private:
int CheckHealth();
Channel _chan;
};
} // namespace brpc
#endif // BRPC_SELECTIVE_CHANNEL_H