incubator-seata icon indicating copy to clipboard operation
incubator-seata copied to clipboard

The RPC Request should not be coupled with the RPC Request Handler

Open PleaseGiveMeTheCoke opened this issue 1 year ago • 0 comments

在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中,架构设计更加松耦合,同时也更符合直觉

PleaseGiveMeTheCoke avatar Dec 08 '23 08:12 PleaseGiveMeTheCoke