跳到主要内容
版本:3.0

Rpc执行调度器

一、说明

Rpc执行调度器(RpcDispatcher)是TouchSocket.Rpc框架中的核心组件之一,用于实现远程过程调用(Rpc)的服务执行方式。

目前,内置了ConcurrencyDispatcherQueueRpcDispatcherImmediateRpcDispatcher三种调度器,分别用于实现不同场景下的服务执行方式。

二、调度器说明

RpcDispatcher是直接应用于Rpc Caller的。所以它在被调用方可能是以多个实例的形式存在。

例如DmtpRpc,对于服务端而言,如果有多个Rpc客户端连接,那么每个连接都会拥有一个RpcDispatcher实例。

2.1 并发调度器(ConcurrencyDispatcher)

并发调度器(ConcurrencyDispatcher)是在收到Rpc请求后,直接使用线程池(Task.Run)直接执行Rpc。所以它是完全并发的。

2.2 队列调度器(QueueRpcDispatcher)

队列调度器(QueueRpcDispatcher)是在收到Rpc请求后,先将请求放入队列中,再通过线程(Task.Run)执行Rpc。所以它在当前实例中(可以简单理解为一个连接)是有顺序的。

2.3 立即调度器(ImmediateRpcDispatcher)

立即调度器(ImmediateRpcDispatcher)是在收到Rpc请求后,使用Rpc接收线程,直接执行Rpc。所以它的同步性是依赖接收线程的。

三、使用

Rpc调度器并非强制要求,具体还得看Rpc框架本身支不支持多样的调度方式。

例如,DmtpRpc框架就支持所有调度方式,但是对于WebApi框架,它只支持ImmediateRpcDispatcher

所以实际使用还得看具体框架的支持情况。

四、可重入性

可重入性也表示的是在一个CallerRpc调用中的并发性。不过可以使用[Reenterable]特性来控制方法、服务级别的并发。

可重入性会受调度器的完全影响。如果调度器本身不支持可重入性,那么它将不能支持可重入性。

例如,对于并发调度器(ConcurrencyDispatcher),它默认支持可重入性。

但是对于有的Rpc方法,我们希望仅这个方法不支持可重入性,那么我们可以使用[Reenterable]特性来控制。

interface IMyRpcServer : IRpcServer
{
[Reenterable(false)]
[DmtpRpc(MethodInvoke = true)]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
Task Output(int value);
}