Multithreading 工作垂直板不能并行处理请求

Multithreading 工作垂直板不能并行处理请求,multithreading,concurrency,vert.x,Multithreading,Concurrency,Vert.x,我正在尝试扩展一个应用程序,该应用程序对外部应用程序执行阻塞调用以获取一些数据(请求和响应顺序无关紧要) 因为它是一个阻塞调用,如vertx文档中所述,我正在使用worker verticle,worker pool设置为5,我已经部署了5个worker verticle实例 当我提交多个查询时(当我测试时,我只触发了3个查询),即使我的verticle被定义为具有多个实例的worker,并且有足够的worker线程来并行处理我的请求,它们也不会并发处理,看起来它们是按顺序处理的(请参阅下面的日

我正在尝试扩展一个应用程序,该应用程序对外部应用程序执行阻塞调用以获取一些数据(请求和响应顺序无关紧要)

因为它是一个阻塞调用,如vertx文档中所述,我正在使用worker verticle,worker pool设置为5,我已经部署了5个worker verticle实例

当我提交多个查询时(当我测试时,我只触发了3个查询),即使我的verticle被定义为具有多个实例的worker,并且有足够的worker线程来并行处理我的请求,它们也不会并发处理,看起来它们是按顺序处理的(请参阅下面的日志)

我还尝试创建一个主垂直通道和4个工作垂直通道(处理阻塞调用),在主垂直通道上接收到来自客户端的初始请求,主垂直通道通过事件总线将请求发送给工作通道,它会做出响应,但即使这样,我也看到了与上述相同的行为

如果我误解了什么,如果我试图以错误的方式实现并发,请给出建议。如果是这样的话,请建议实现此用例并发性的最佳方法

VertxMain.java

public class VertxMain  {
public static final Logger LOG =Logger.getLogger(VertxMain.class.getName());
public static void main(String[] args) {      
MyFirstVerticle mfv = new MyFirstVerticle();
DeploymentOptions deploymentOptions = new DeploymentOptions().setWorker(true).setInstances(5);
  Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(5));
  vertx.deployVerticle(MyFirstVerticle.class.getName(), deploymentOptions, res ->{
      if(res.succeeded()) {
          LOG.info("first verticle deployed");
      } else{
          LOG.info("first verticle failed to deployed" + res.cause());
      }
  });

MyFirstVerticle.java

public class MyFirstVerticle extends AbstractVerticle {
public static final Logger LOG = Logger.getLogger(MyFirstVerticle.class.getName()); 
Integer requestCount = 0;

@Override
public void start(Future<Void> fut) {
    InputStream is = this.getClass().getClassLoader().getResourceAsStream("qa.properties");
    Scanner sc = new Scanner(is);
    String line = sc.nextLine();

    Router router = Router.router(vertx);

    router.route("/qa").handler(routingContext -> {
         requestCount++;
        Date d = new Date();

         System.out.println("Received request #" + requestCount.toString() + " on " +d.toString());
         try {
                LOG.info("Processing request");
                Thread.sleep(20000);
                d.setTime(System.currentTimeMillis());
                System.out.println("Responding to request #" + requestCount.toString() + " on " +d.toString());
            } catch (Exception e) {
            }

        routingContext.response().end("<h1>Hello from my first " + 
                " Vert.x 3 application using " + Thread.currentThread().getName() + line + "</h1>");
    });

    vertx
    .createHttpServer()
    .requestHandler(router::accept)
    .listen(8081, result -> {
        if (result.succeeded()) {
            LOG.info("Webserver started to serve requests!!");
            fut.complete();
        } else {
            fut.fail(result.cause());
        }
    });
}

在vertx中,正常垂直与事件循环相关联。因此,对垂直体的任何请求都必须等待事件循环变为空闲;即使没有同一垂直体的其他实例正在运行。worker verticle通过允许verticle在任何工作线程中运行来放松这一点,但是worker verticle的实例不能同时处理两个请求。更进一步,您可以使用多线程的工作程序垂直目录,它可以同时执行多个请求

因此,要回答您的问题,您可以创建多个worker verticle实例,也可以创建多线程worker verticle


你可以在

上找到更多信息问题部分在于我的测试方法-我从不同的浏览器选项卡发出了多个请求&正如上面的日志所说,它是按顺序处理的(我还没有找到原因的答案)因此,我编写了一个简单的异步客户机,并同时发出多个请求,这些请求是从不同的worker Verticle并行处理的


我被我的测试结果所左右,我想我说得有点太早了,因此发布了我的发现

不确定你的测试中出了什么问题。刚刚用
parallel-j10sh-c'curl试过你的例子http://localhost:8081/qa 2> /dev/null;echo'-12345678910
请求按预期5比5执行。@tsegismont是的,你是对的-我刚刚发布了我的答案。我的测试方法对我进行了旁侧跟踪,但若有多个worker verticles实例和足够的worker线程,那个么它应该并行处理多个请求。不需要多线程工作线程Verticle此处不需要多线程工作线程。如果部署了verticle的多个实例,则可以并行处理web请求。
INFO: first verticle deployed
Received request #1 on Sun Sep 25 11:06:10 EDT 2016
Sep 25, 2016 11:06:10 AM com.myvertx.MyFirstVerticle lambda$0
INFO: Processing request
Responding to request #1 on Sun Sep 25 11:06:30 EDT 2016
Received request #2 on Sun Sep 25 11:06:30 EDT 2016
Sep 25, 2016 11:06:30 AM com.myvertx.MyFirstVerticle lambda$0
INFO: Processing request
Received request #1 on Sun Sep 25 11:06:36 EDT 2016 ->( *Looks like request is routed to a different instance of the verticle* )
Sep 25, 2016 11:06:36 AM com.myvertx.MyFirstVerticle lambda$0
INFO: Processing request
Responding to request #2 on Sun Sep 25 11:06:50 EDT 2016
Responding to request #1 on Sun Sep 25 11:06:56 EDT 2016