redis\345\223\250\345\205\265\346\250\241\345\274\217\345\234\272\346\231\257\346\265\213\350\257\225.md
... ...
@@ -396,14 +396,153 @@ todo
396 396
397 397
### 场景4:模拟大量卸载安装
398 398
399
-todo
400
-
401 399
**步骤**:
402 400
用脚本进行一晚的安装卸载APP,测试是否有问题
403 401
**验证方式**:
404 402
使用Topic检查文档(我之前提供的文档),检查对应的客户端能否正常及时消费
405 403
检查slowlog是否有超过200ms的执行命令
406 404
405
+**实际测试结果**
406
+
407
+停止掉主节点后,由于redis哨兵集群配置是60s超时,所以在此期间一直报错:
408
+```
409
+ 2025-08-13 17:46:39.925 [http-nio-8060-exec-2] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] -Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
410
+
411
+ com.sie.snest.engine.exception.ModelException: Unable to write command into connection! Check CPU usage of the JVM. Try to increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1440995011 [redisClient=[addr=redis://192.168.184.122:6379], channel=[id: 0x0c4c951d, L:0.0.0.0/0.0.0.0:60620], currentCommand=null, usage=1], command: (GET), params: [iidp:open_api:route:/checkhealth] after 3 retry attempts
412
+
413
+ at com.sie.snest.engine.model.MethodMeta.invoke(MethodMeta.java:217)
414
+
415
+ at com.sie.snest.engine.api.distributed.RpcInvocationV2.invoke(RpcInvocationV2.java:168)
416
+
417
+ at com.sie.snest.engine.data.RecordSet.call(RecordSet.java:361)
418
+
419
+ at com.sie.snest.sdk.cache.RedisHelper.get(RedisHelper.java:26)
420
+
421
+ at com.sie.snest.api.transformer.filter.ApiRequestFilter.doFilter(ApiRequestFilter.java:115)
422
+
423
+ at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
424
+
425
+ at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
426
+
427
+ at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
428
+
429
+ at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
430
+
431
+ at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
432
+
433
+ at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
434
+
435
+ at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
436
+
437
+ at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
438
+
439
+ at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
440
+
441
+ at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
442
+
443
+ at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
444
+
445
+ at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
446
+
447
+ at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
448
+
449
+ at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
450
+
451
+ at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
452
+
453
+ at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
454
+
455
+ at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
456
+
457
+ at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
458
+
459
+ at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
460
+
461
+ at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
462
+
463
+ at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
464
+
465
+ at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
466
+
467
+ at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
468
+
469
+ at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769)
470
+
471
+ at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
472
+
473
+ at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
474
+
475
+ at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
476
+
477
+ at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
478
+
479
+ at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)
480
+
481
+ at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
482
+
483
+ at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
484
+
485
+ at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
486
+
487
+ at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
488
+
489
+ at java.lang.Thread.run(Thread.java:748)
490
+
491
+ Caused by: org.redisson.client.WriteRedisConnectionException: Unable to write command into connection! Check CPU usage of the JVM. Try to increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1440995011 [redisClient=[addr=redis://192.168.184.122:6379], channel=[id: 0x0c4c951d, L:0.0.0.0/0.0.0.0:60620], currentCommand=null, usage=1], command: (GET), params: [iidp:open_api:route:/checkhealth] after 3 retry attempts
492
+
493
+ at org.redisson.command.RedisExecutor.checkWriteFuture(RedisExecutor.java:367)
494
+
495
+ at org.redisson.command.RedisExecutor.lambda$execute$4(RedisExecutor.java:197)
496
+
497
+ at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
498
+
499
+ at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
500
+
501
+ at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
502
+
503
+ at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
504
+
505
+ at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:629)
506
+
507
+ at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:118)
508
+
509
+ at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetFailure(AbstractChannel.java:999)
510
+
511
+ at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:860)
512
+
513
+ at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1367)
514
+
515
+ at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:889)
516
+
517
+ at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:956)
518
+
519
+ at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1263)
520
+
521
+ at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
522
+
523
+ at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
524
+
525
+ at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
526
+
527
+ at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
528
+
529
+ at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
530
+
531
+ at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
532
+
533
+ at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
534
+
535
+ ... 1 common frames omitted
536
+
537
+ Caused by: io.netty.channel.StacklessClosedChannelException: null
538
+
539
+ at io.netty.channel.AbstractChannel$AbstractUnsafe.write(Object, ChannelPromise)(Unknown Source)
540
+```
541
+
542
+待选主成功后,异常终止,redis恢复正常。
543
+
544
+
545
+
407 546
### 场景5:模拟长时间运行
408 547
409 548
持续进行中