如何在 Thrift 中使用不同的线程池处理请求?

Posted

技术标签:

【中文标题】如何在 Thrift 中使用不同的线程池处理请求?【英文标题】:How to handle requests using different thread pools in Thrift? 【发布时间】:2013-09-20 08:20:00 【问题描述】:

我有一个有两种方法的旧服务 1. 响应 processSync(Request req) :该方法同步处理请求并返回响应。在服务器完全处理请求之前,客户端线程会被阻塞。 2. void processAsync(Request req) :该方法用于异步处理。在这里,只要服务器完全接收到请求,调用就会返回,没有输出。客户端线程不会等到请求被服务器处理。

在使用 ThreadedSelectorServer 时,它具有用于读取/写入和处理线程的单独线程。要求是在方法级别使用单独的线程池。这是因为可能会发生所有处理线程都忙于同步请求的情况。使用异步 api 的客户端可能会超时。我希望给两个 api 同等的权重,这样如果服务器被同步请求淹没;异步请求不会受到影响。

想到有两种不同的服务,一种只有同步方法,另一种有异步。但在这种情况下,必须启动两个节俭服务器,这需要两个不同的端口。我希望避免这样做。

有什么建议可以实现吗?

【问题讨论】:

【参考方案1】:

是的,使用 多路复用协议 introduced with Thrift 0.9.1。它允许多个服务共享相同的传输。注意服务端和客户端都必须使用多路复用协议层才能成功。

顺便说一下,考虑将异步方法设为oneway

Service whatever 
  oneway void processAsync(1: Request req) 

【讨论】:

感谢 Jen,因此使用 TMultiplexedProcessor 可以在单个服务器上托管多个服务。但是如何划分每个服务的处理线程数。我的意思是说我已经为 thrift 服务器配置了 10 个线程,现在我需要 6 个线程应该只处理 service1 调用,其余 4 个线程处理 service2 调用。这可能吗? 您认为为什么有必要这样做?操作系统应该更擅长调度线程之间的时间片。在不知道您的确切情况的情况下,经验告诉您可能只认为您知道什么是最适合您的服务的。如果您确实需要在每个服务的基础上进行节流,我建议将请求放入两个队列中,并为每个队列提供预定义数量的线程来服务队列条目。但同样,我认为你不应该那样做。您可以通过更详细地解释要求/场景来说服我。 前面提到服务调用有两种方式Sync和Async,可能有客户端调用sync方法可能会导致所有处理线程长时间忙碌.这将影响使用异步调用的客户端。他们可能会收到错误/异常,说明服务器正忙。这可能会在请求突发时发生。我浏览了 thrift 0.91 版本的 java 文档,但目前似乎没有办法做到这一点。

以上是关于如何在 Thrift 中使用不同的线程池处理请求?的主要内容,如果未能解决你的问题,请参考以下文章

RPC远程协议之Thrift非阻塞多线程处理

PHP 中如何处理并发请求(使用线程、线程池或子进程)

Servlet容器如何同时来处理多个请求

java高并发?

如何使用异步线程调整/分析线程池配置?

一文读懂Java线程池