在服务设计的时候一般会引入队列,通过队列可以更有效地控制资源的使用; BeetleX
在实现 WebApi
服务时也不例外,但 BeetleX
不仅有全局性的请求队列,还有更细化的队列引入到设计中,主要是能够更好地针对相应的控制器或方法在资源上的分配。为什么 BeetleX
考虑到这样做呢?接下来分析一下一些场景的资源分配情况。
对于一个应用者来说很少会关心服务线程分配问题,反正硬件资源损耗尽就添加;但在有限资源的情况下又怎样分配资源呢?这个一般应用者是无法解决这一问题。业务有粗细,重要性也有不同等级,在有限资源的情况如何最大化保障重要业务模块这是 BeetleX
引用更精细的调用队列设计的主要原因。
可以配置单个控制器的所有方法或单个方法进行唯一线程队列,这样就可以限制相关行为只使用一个线程有序地处理;当需要方法所有请求都必须串行的情况下可以进行配置。
[ThreadQueue(ThreadQueueType.Single)] public object json() { return new JsonMessage { message = "Hello, World!" }; }
也可以标记在控制器之上
[Controller] [ThreadQueue(ThreadQueueType.Single)] public class Controller
如果指定在控制器之上,就意味着该控制器所有请求都是一个线程有序处理。
有时候需要根据资源情况对某些资源分配相应的线程资源处理,这个时候就可以使用这种配置;这种配置可以根据业务和资源的情况对控制器或方法分配N个线程来处理;如对一些响应延时不太要求但处理数据比较多的业务则可以通过它来限制。
[ThreadQueue(ThreadQueueType.Multiple,2)] public object json() { return new JsonMessage { message = "Hello, World!" }; }
以上是配置两个线程来处理这个方法的请求,也可以标记在控制器之上。
[Controller] [ThreadQueue(ThreadQueueType.Multiple,2)] public class Controller
当标记在控制器之上,则是由两个线程来处理控制器上的所有请求。
有时候需要判断不同的信息做一致性队列指向,这样可以根据提交的信息进行队列分配,确保同一信息的请求都有一个线程队列来处理。
[ThreadQueue("name")] public object List(string name, IHttpContext context) { }
以上方法根据提交的名称作一致性线程队列执行,这样可以确保同一信息源的请求都在一个队列中串行处理。还有一些通过 Url
匹配整个控制器的如: /api/henry/get
或 /api/ken/get
.中间参数是用户名,通过以下配置控制器配置就可以确不同用户的路径下的方法一致性到线程队列中.
[Controller] [ThreadQueue("$path")] public class Controller
ThreadQueue
可以同时配置到 Controller
或 Action
上,当然 Action
不存在的情况下则使用 Controller
的配置,如果有则使用 Action
的配置。