incubator-seata
incubator-seata copied to clipboard
The RPC Request should not be coupled with the RPC Request Handler
在AbstractRMHandler和DefaultCoordinato的onRequest方法中有下面这样的代码,以DefaultCoordinator - onRequest为例
public AbstractResultMessage onRequest(AbstractMessage request, RpcContext context) {
// ......
AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;
transactionRequest.setTCInboundHandler(this);
return transactionRequest.handle(context);
}
每次接收到请求时都要调用setTCInboundHandler将TCInboundHandler放入请求中,然后调用xxxRequest.handle,这很奇怪,请求不应该主动调用handle方法处理自己,而应该被handler处理。这相当于耦合了request和对应的handler,造成的后果是在每次收到请求时都需要主动设置Handler,并且每一个request类里面都有一段类似下面的handle方法的逻辑,以GlobalStatusRequest为例
public class GlobalStatusRequest extends AbstractGlobalEndRequest {
// ......
@Override
public AbstractTransactionResponse handle(RpcContext rpcContext) {
return handler.handle(this, rpcContext);
}
}
为什么不直接由TCInboundHandler / RMInboundHandler负责所有请求处理相关的逻辑,包括处理方法的选择,比如对DefaultCoordinator - onRequest进行修改:
public AbstractResultMessage onRequest(AbstractMessage request, RpcContext context) {
if (!(request instanceof AbstractTransactionRequestToTC)) {
throw new IllegalArgumentException();
}
AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;
switch (transactionRequest.getTypeCode()){
case MessageType.TYPE_GLOBAL_COMMIT :
return handle((GlobalCommitRequest)transactionRequest, context);
case MessageType.TYPE_GLOBAL_BEGIN:
return handle((GlobalBeginRequest)transactionRequest, context);
......
}
}
这样一来Request类中就不用加入handler相关的逻辑了,所有请求处理相关的逻辑也都内聚到了TCInboundHandler / RMInboundHandler中,架构设计更加松耦合,同时也更符合直觉