大量Vertx连接到Redis

时间:2017-06-20 06:42:39

标签: redis vert.x

尝试使用Redis模拟重负载的场景(仅限默认配置)。 为了简单起见,当立即执行multi时,请关闭连接。

  import io.vertx.core.*;
  import io.vertx.core.json.Json;
  import io.vertx.redis.RedisClient;
  import io.vertx.redis.RedisOptions;
  import io.vertx.redis.RedisTransaction;


  class MyVerticle extends AbstractVerticle {
      private int index;

      public MyVerticle(int index) {
          this.index = index;
      }

      private void run2() {
          RedisClient client = RedisClient.create(vertx, new RedisOptions().setHost("127.0.0.1"));
          RedisTransaction tr = client.transaction();

          tr.multi(ev2 -> {
              if (ev2.succeeded()) {
                tr.exec(ev3 -> {
                    if (ev3.succeeded()) {
                        tr.close(i -> {
                            if (i.failed()) {
                                System.out.println("FAIL TR CLOSE");
                                client.close(j -> {
                                    if (j.failed()) {
                                        System.out.println("FAIL CLOSE");
                                    }
                                });
                            }
                        });
                    }
                    else {
                        System.out.println("FAIL EXEC");
                        tr.close(i -> {
                            if (i.failed()) {
                                System.out.println("FAIL TR CLOSE");
                                client.close(j -> {
                                    if (j.failed()) {
                                        System.out.println("FAIL CLOSE");
                                    }
                                });
                            }
                        });
                    }
                });
              }
              else {
                  System.out.println("FAIL MULTI");
                  tr.close(i -> {
                      if (i.failed()) {
                          client.close(j -> {
                              if (j.failed()) {
                                  System.out.println("FAIL CLOSE");
                              }
                          });
                      }
                  });
              }
          });
      }

      @Override
      public void start(Future<Void> startFuture) {
          long timerID = vertx.setPeriodic(1, new Handler<Long>() {
              public void handle(Long aLong) {
                  run2();
              }
          });
      }

      @Override
      public void stop(Future stopFuture) throws Exception {
          System.out.println("MyVerticle stopped!");
      }

  }

  public class Periodic {
      public static void main(String[] args) {
          Vertx vertx = Vertx.vertx();

          for (int i = 0; i < 8000; i++) {
              vertx.deployVerticle(new MyVerticle(i));
          }
      }
  }

虽然连接已正确关闭但仍会出现警告错误。 甚至在我将多个逻辑放入多个逻辑之前,所有这些都被抛出。

2017-06-20 16:29:49 WARNING io.netty.util.concurrent.DefaultPromise notifyListener0 An exception was thrown by io.vertx.core.net.impl.ChannelProvider$$Lambda$61/1899599620.operationComplete()
    java.lang.IllegalStateException: Uh oh! Event loop context executing with wrong thread! Expected null got Thread[globalEventExecutor-1-2,5,main]    
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:316)
    at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:193)
    at io.vertx.core.net.impl.NetClientImpl.failed(NetClientImpl.java:258)
    at io.vertx.core.net.impl.NetClientImpl.lambda$connect$5(NetClientImpl.java:233)
    at io.vertx.core.net.impl.ChannelProvider.lambda$connect$0(ChannelProvider.java:42)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:481)
  at io.netty.util.concurrent.DefaultPromise.access$000(DefaultPromise.java:34)
    at io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:431)
    at io.netty.util.concurrent.GlobalEventExecutor$TaskRunner.run(GlobalEventExecutor.java:233)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
    at java.lang.Thread.run(Thread.java:745)

这个错误有原因吗?

1 个答案:

答案 0 :(得分:0)

你会继续犯错误,因为你测试了错误的东西。

首先,顶点不是脂肪协程。他们是瘦弱的演员。创建其中500个的意义不会加快速度,但可能会减慢一切,因为事件循环仍然需要在它们之间切换。

其次,如果您要准备2K并发请求,请将Vertx应用程序放在一台计算机上,然后通过网络运行wrk或类似工具。

第三,你的Redis也在同一台机器上。我希望在你的制作中不会出现这种情况,因为Redis将与Vertx竞争CPU。

一旦设置正确,我相信您将能够轻松处理10K请求。我已经看到Vertx使用PostgreSQL在适度的机器上处理8K请求。