Rpc执行调度器
一、说明
Rpc执行调度器(RpcDispatcher)是TouchSocket.Rpc框架中的核心组件之一,用于实现远程过程调用(Rpc)的服务执行方式。
目前,内置了ConcurrencyDispatcher、QueueRpcDispatcher、ImmediateRpcDispatcher三种调度器,分别用于实现不同场景下的服务执行方式。
二、调度器说明
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。
所以实际使用还得看具体框架的支持情况。
四、可重入性
可重入性也表示的是在一个Caller的Rpc调用中的并发性。不过可以使用[Reenterable]特性来控制方法、服务级别的并发。
可重入性会受调度器的完全影响。如果调度器本身不支持可重入性,那么它将不能支持可重入性。
例如,对于并发调度器(ConcurrencyDispatcher),它默认支持可重入性。
但是对于有的Rpc方法,我们希望仅这个方法不支持可重入性,那么我们可以使用[Reenterable]特性来控制。
interface IMyRpcServer : ISingletonRpcServer
{
[Reenterable(false)]
[DmtpRpc(MethodInvoke = true)]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
Task Output(int value);
}