zchuango commented on issue #3167:
URL: https://github.com/apache/brpc/issues/3167#issuecomment-3659237487
>
最上面的Transport层接口是DoConnect/DoRead/DoWrite,为什么到这里变成了WaitAndReset/StartWrite/KeepWrite/DoWrite/OnInputEvent呢?感觉前者更合理些。后者耦合了太多逻辑,比如bthread操作、多路复用、健康检查等。
是的,当前方案只是将存在rdma宏定义的方法简单抽取出来,然后拆分到不同transport子类上,按照这个思路符合的方法只有WaitAndReset/StartWrite/KeepWrite/DoWrite/OnInputEvent这些,DoConnect/DoRead因为不需要对tcp和rdma调用做差异化处理,就没有下推。考虑到后续Transport支持更多通信协议的方式演进,目前也有些观点可以一起讨论下:
1.
Transport层作为多协议打通抽象,需要抽象出更加合理接口层,同时需要考虑兼顾多个协议的方向演进,这块希望后续社区贡献者以及设备厂商共同努力推进。
2. Socket作为架构改造的切入点,后期可以作为上层应用的对接下层Transport的context角色来演进。
上面初步设计的Socket.h抽象接口还不完善,还需要跟社区一起详细讨论给出更优的Socket.h和transport层接口,一起推进共建多协议兼容的特性。
个人想法后续演进可以小步多次迭代方式来做,第一步,按照既定的socket方法下推方式,打通完善Socket-Transport调用流程,第二步,统一抽象Transport层更合理的公共接口,反补到上层调用。当然当前下推方式和方法,
@wwbmmm @chenBright 大佬帮忙一起看看还有哪些方法更合适?
> 还有这里TransportWrapper的作用是什么呢?
TransportWrapper是Transport子类实例的包装类,这里会把不同协议Transport统一包装管理,包装类会协助公共方法与Transport子类方法绑定以及处理协议差异点逻辑的包装,上游socket只关注功能方法调用。以下是相关示例代码:
transport_wrapper.h
```
namespace brpc {
class Socket;
class TransportWrapper {
friend class Socket;
public:
#if BRPC_WITH_RDMA
std::shared_ptr<RdmaTransport> rdmaTransport = nullptr;
#endif
explicit TransportWrapper(Socket* socket, const SocketOptions& options);
static auto GetEdgeTriggeredHandler(Mode socket_mode) -> void
(*)(Socket*) {
if (socket_mode == TCP) {
return InputMessenger::OnNewMessages;
}
#if BRPC_WITH_RDMA
else if (socket_mode == RDMA) {
return brpc::rdma::RdmaEndpoint::OnNewDataFromTcp;
}
#endif
else{
LOG(FATAL) << "Unknown socket mode";
return nullptr;
}
}
static std::shared_ptr<AppConnect> GetAppConnect(Mode socket_mode){
if (socket_mode == TCP) {
return nullptr;
}
#if BRPC_WITH_RDMA
else if (socket_mode == RDMA) {
return std::make_shared<rdma::RdmaConnect>();
}
#endif
else{
LOG(FATAL) << "Unknown socket mode";
return nullptr;
}
}
......
private:
std::function<void(Socket *)> BeforeRecycled;
std::function<int(Socket *, int32_t)> WaitAndReset;
std::function<int(Socket *, Socket::WriteRequest *, const
Socket::WriteOptions &)> StartWrite;
std::function<void*(void *)> KeepWrite;
std::function<ssize_t(Socket *, Socket::WriteRequest *)> DoWrite;
std::function<int(void *, uint32_t, const bthread_attr_t &)>
OnInputEvent;
std::function<void(std::ostream &, SocketId)> DebugSocket;
};
}
```
transport_wrapper.cpp
```
namespace brpc {
TransportWrapper::TransportWrapper(Socket* socket, const SocketOptions&
options) {
if (options.socket_mode == TCP) {
// 使用共享指针创建对象
auto transport = std::make_shared<TcpTransport>();
DoWrite = [transport](Socket* socket, Socket::WriteRequest* req)
{
return transport->DoWrite(socket, req);
};
......
}
#if BRPC_WITH_RDMA
else if (options.socket_mode == RDMA) {
auto transport = std::make_shared<RdmaTransport>(socket,
options);
DoWrite = [transport](Socket* socket, Socket::WriteRequest* req)
{
return transport->DoWrite(socket, req);
};
......
rdmaTransport = transport;
}
#endif
else {
LOG(ERROR) << "socket_mode set error";
}
}
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]