当前位置: 首页 > 知识库问答 >
问题:

Vertx内置ClusterHealthCheck过程阻止Vertx线程

长孙瑞
2023-03-14

我在健康检查中使用ClusterHealthCheck过程,并且在日志中看到Vertx Thread被阻止的异常。我需要将健康检查作为阻塞代码执行吗?

下面是我用来创建健康检查的代码,

Handler<Promise<Status>> procedure = ClusterHealthCheck.createProcedure(vertx);
HealthChecks checks = HealthChecks.create(vertx).register("cluster-health", procedure);

低于例外

23:00:18.396 [vertx-blocked-thread-checker] WARN  io.vertx.core.impl.BlockedThreadChecker - tx.id= Thread Thread[vert.x-eventloop-thread-1,5,main] has been blocked for 5194 ms, time limit is 2000 ms
io.vertx.core.VertxException: Thread blocked
    at sun.misc.Unsafe.park(Native Method) ~[?:1.8.0_292]
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) ~[?:1.8.0_292]
    at com.hazelcast.spi.impl.AbstractInvocationFuture.joinInternal(AbstractInvocationFuture.java:575) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.internal.partition.impl.PartitionReplicaStateChecker.hasOnGoingMigrationMaster(PartitionReplicaStateChecker.java:309) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.internal.partition.impl.PartitionReplicaStateChecker.getPartitionServiceState(PartitionReplicaStateChecker.java:93) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.internal.partition.impl.InternalPartitionServiceImpl.isMemberStateSafe(InternalPartitionServiceImpl.java:929) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.internal.partition.operation.SafeStateCheckOperation.run(SafeStateCheckOperation.java:38) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.Operation.call(Operation.java:184) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:227) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:216) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.run(OperationExecutorImpl.java:406) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.runOrExecute(OperationExecutorImpl.java:433) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvokeLocal(Invocation.java:596) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvoke(Invocation.java:581) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke0(Invocation.java:540) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke(Invocation.java:237) ~[app.jar:1.0.0-SNAPSHOT]
    at com.hazelcast.spi.impl.operationservice.impl.OperationServiceImpl.invokeOnTarget(OperationServiceImpl.java:343) ~[app.jar:1.0.0-SNAPSHOT]

我查看了ClusterHealthCheck类,它看起来很简单,从集群管理器获取分区服务并获取集群状态,但不确定为什么需要5秒钟以上才能完成。

我使用的是vertx 4.0.3、hazelcast 4.0.2,应用程序在K8s中运行。

共有1个答案

胡高朗
2023-03-14

该问题已在Vert. x 4.1.1中修复。

如果节点状况不佳(例如内存不足),则可能会阻止该操作。

 类似资料:
  • 我有一个小的vertx应用程序。一个超文本传输协议垂直获取一个请求,并通过带有请求-响应模式的eventbus发送它。所以类似于: 在DB Vertical中,我使用消费者获取一条消息,发送到DB,进行一些更改并发送回HTTP verticle。我的问题是,我有一个必须进行大量检查的删除操作,所以这个过程可能需要10秒钟。此时HTTP verticle仍然可以获得一些新请求,但DB consume

  • 我是vert的新手。x、 我在尝试垂直。x“NetServer”功能。http://vertx.io/core_manual_java.html#writing-tcp服务器和客户端,它的工作方式很有魅力。 然而,我也读到“verticle实例严格来说是单线程的。 如果您创建一个简单的TCP服务器并部署它的单个实例,那么该服务器的所有处理程序始终在同一个事件循环(线程)上执行。” 目前,对于我的实

  • 我有两个问题与Vertx线程模型有关。文件提到: 一个顶点。默认情况下,x实例维护N个事件循环线程(其中N默认为core*2) 对于许多现代应用程序所需的并发级别,阻塞方法无法扩展 Vertx还提供了线程池相关的功能,以处理使用服务器资源的任务,这些资源需要长时间的事件处理(工作线程)。 好的,所以我们知道线程在所需内存(例如堆栈)和上下文切换方面有开销。 Vertx线程没有被阻塞(如果正确使用)

  • 我试图通过事件总线发送数据,当从客户端接到呼叫并响应回客户端。 一切正常,直到我在事件总线上添加拦截器... 以下是代码:- 还有一个疑问是,当我从IDE停止应用程序时,不会调用stop方法,但是如果我从另一个正常工作的垂直程序中取消部署这个垂直程序。

  • 在Vertx官方文件中,我阅读了以下段落 在关于Reactor的文章中: 据我所知,如果我写错了,请纠正我,Vertx的工作方式如下: 当我们为阻塞代码提供一个处理程序时,vertx将线程池中的一个线程(不是事件循环)放入该代码中,该线程等于内核数,例如我有4个内核,事件循环检查每次迭代后该线程的状态,如果它准备好执行与该阻塞代码相关的处理程序,当所有4个内核都忙时,vertx将任务放入队列,稍后

  • 我有以下vertx代码: 我想知道如何停止或杀死集合实例中的一个实例。 谢了。