非阻塞获取 Hazelcast ReplicatedMap?
Non-blocking gets on Hazelcast ReplicatedMap?
我们在 Hazelcast 客户端中使用 ReplicatedMap。客户端和服务器都是4.2.1版本。
地图很小(<10 个条目,每个值小于 100 字节)。客户端只从地图中读取,地图在服务器上不经常更新。
我们期望 ReplicatedMap.get 是非阻塞的,但在长时间的 运行 性能测试中,我们开始从 vertx(监控阻塞线程)收到如下警告。第一个错误是在 6 小时后出现的,所以不容易重现。
有什么方法可以实现非阻塞获取吗?或者我们是否需要添加一个维护 ConcurrentHashmap 的 EntryListener?
澄清:这里真正的问题不是阻塞vertx(这可以通过将调用移动到Vertx worker verticle来解决),而是避免延迟查找。业务需求是我们在 50 毫秒或更短的时间内处理消息,因此即使我们将呼叫转移到工作人员,我们也无法完成。
[vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 12777 ms, time limit is 2000 ms
io.vertx.core.VertxException: Thread blocked
at jdk.internal.misc.Unsafe.park(Native Method) ~[?:?]
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:323) ~[?:?]
at com.hazelcast.spi.impl.AbstractInvocationFuture.manageParking(AbstractInvocationFuture.java:693) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:615) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.spi.ClientProxy.invokeOnPartition(ClientProxy.java:188) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.spi.ClientProxy.invoke(ClientProxy.java:182) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.proxy.ClientReplicatedMapProxy.get(ClientReplicatedMapProxy.java:214) ~[hazelcast-4.2.1.jar!/:4.2.1]
at my.package.StateGetter.getState(StateGetter.java:44) ~[classes!/:1.5.189]
vertx 的黄金法则是不阻塞应用程序中的事件循环,并且阻塞容忍度非常低(2 秒)。然而,由于我们经常需要执行阻塞操作,vertx 提供了两种解决方案。我更喜欢使用的是 Worker verticles(Worker verticles 部分下的 https://vertx.io/docs/vertx-core/java/#_verticles)。您使用以下代码启动它们:
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.verticles.HazelcastVerticle", options);
这种类型的 Verticle 专为阻止操作而设计,并且在警告开始之前具有更高的容忍度(默认为 60 秒)。如果您希望操作时间比这更长,您可能需要一个单独的线程或不同的方法,但根据您的问题,我认为情况并非如此,所以我不会朝那个方向前进。
另一种方法是使用 vertx.executeBlocking
。您可以在此处找到相关详细信息:https://dzone.com/articles/how-to-run-blocking-code-in-vertx.
ReplicatedMap
条目在集群的所有成员上复制。客户端仍然需要对成员执行远程调用以获取条目。根据您的要求,我认为实现可预测延迟的最佳方法是在您的客户端上设置 near cache。这样,条目将缓存在客户端本地,并仅在必要时更新。
我们在 Hazelcast 客户端中使用 ReplicatedMap。客户端和服务器都是4.2.1版本。
地图很小(<10 个条目,每个值小于 100 字节)。客户端只从地图中读取,地图在服务器上不经常更新。
我们期望 ReplicatedMap.get 是非阻塞的,但在长时间的 运行 性能测试中,我们开始从 vertx(监控阻塞线程)收到如下警告。第一个错误是在 6 小时后出现的,所以不容易重现。
有什么方法可以实现非阻塞获取吗?或者我们是否需要添加一个维护 ConcurrentHashmap 的 EntryListener?
澄清:这里真正的问题不是阻塞vertx(这可以通过将调用移动到Vertx worker verticle来解决),而是避免延迟查找。业务需求是我们在 50 毫秒或更短的时间内处理消息,因此即使我们将呼叫转移到工作人员,我们也无法完成。
[vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 12777 ms, time limit is 2000 ms
io.vertx.core.VertxException: Thread blocked
at jdk.internal.misc.Unsafe.park(Native Method) ~[?:?]
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:323) ~[?:?]
at com.hazelcast.spi.impl.AbstractInvocationFuture.manageParking(AbstractInvocationFuture.java:693) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:615) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.spi.ClientProxy.invokeOnPartition(ClientProxy.java:188) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.spi.ClientProxy.invoke(ClientProxy.java:182) ~[hazelcast-4.2.1.jar!/:4.2.1]
at com.hazelcast.client.impl.proxy.ClientReplicatedMapProxy.get(ClientReplicatedMapProxy.java:214) ~[hazelcast-4.2.1.jar!/:4.2.1]
at my.package.StateGetter.getState(StateGetter.java:44) ~[classes!/:1.5.189]
vertx 的黄金法则是不阻塞应用程序中的事件循环,并且阻塞容忍度非常低(2 秒)。然而,由于我们经常需要执行阻塞操作,vertx 提供了两种解决方案。我更喜欢使用的是 Worker verticles(Worker verticles 部分下的 https://vertx.io/docs/vertx-core/java/#_verticles)。您使用以下代码启动它们:
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.verticles.HazelcastVerticle", options);
这种类型的 Verticle 专为阻止操作而设计,并且在警告开始之前具有更高的容忍度(默认为 60 秒)。如果您希望操作时间比这更长,您可能需要一个单独的线程或不同的方法,但根据您的问题,我认为情况并非如此,所以我不会朝那个方向前进。
另一种方法是使用 vertx.executeBlocking
。您可以在此处找到相关详细信息:https://dzone.com/articles/how-to-run-blocking-code-in-vertx.
ReplicatedMap
条目在集群的所有成员上复制。客户端仍然需要对成员执行远程调用以获取条目。根据您的要求,我认为实现可预测延迟的最佳方法是在您的客户端上设置 near cache。这样,条目将缓存在客户端本地,并仅在必要时更新。