2017-06-20 4 views
0

Redisで重い負荷のシナリオをシミュレートしようとしました(デフォルト設定のみ)。 シンプルに保つには、マルチがすぐに発券されたら接続を閉じます。Redisに接続している多数のVertxで例外がスローされました

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) 

このエラーはどうですか?

+0

なぜ8000個の頂点を作成するのですか? – tsegismont

+0

を使用して、同時リクエスト/トランザクションをシミュレートします(2000年になる可能性があります)。その数にかかわらず、エラーは起こらないはずですよね? – user5733033

+0

500の頂点でも、100msの頻度でもエラーは発生します。 – user5733033

答えて

0

間違ったことをテストするため、エラーが発生し続けます。

まず、頂点は脂肪コルーチンではありません。彼らは薄い俳優です。それらのうちの500個を作成することは物事をスピードアップすることはできませんが、おそらくイベントループがそれらの間を切り替える必要があるため、すべてを遅くすることになります。

2K同時リクエストを準備する場合は、Vertxアプリケーションを1台のマシンに配置し、wrkまたは同様のツールをネットワーク経由で実行します。

第3に、Redisも同じマシンにあります。 RedisはCPU上でVertxと競争するため、あなたの制作には当てはまらないことを願っています。

すべてが正しく設定されたら、10Kリクエストを非常に簡単に処理できると思います。 VertxがPostgreSQLを搭載した控えめなマシンで8Kリクエストを処理するのを見たことがあります。

関連する問題