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

非阻塞获取Hazelcast复制地图?

罗伟志
2023-03-14

我们在Hazelcast客户端中使用ReplicatedMap。客户端和服务器都是版本4.2.1。

地图很小(

我们期望ReplicatedMap.get是非阻塞的,但是在长时间运行的性能测试中,我们开始从vertx(监控阻塞线程)收到如下警告。第一个错误是在6小时后出现的,因此不容易复制。

有没有办法进行非阻塞get?或者我们需要添加EntryListener来维护ConcurrentHashmap吗?

澄清:这里真正的问题不是阻止vertx(可以通过将调用移动到Vertx工作人员垂直来解决),而是避免延迟查找。业务要求是我们在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]

共有2个答案

柯乐池
2023-03-14

vertx的黄金法则是不阻塞应用程序中的事件循环,并且阻塞容差非常低(2秒)。然而,由于我们经常需要执行阻塞操作,vertx提供了两种解决方案。我更喜欢使用的是工人竖梃(https://vertx.io/docs/vertx-core/java/#_verticles在Worker verticles部分下)。您可以使用以下代码启动它们:

DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.verticles.HazelcastVerticle", options);

这种类型的垂直线是为阻塞操作而设计的,在警告开始之前具有更高的容差(默认为60秒)。如果您希望操作比这更长,那么可能需要一个单独的线程或一种不同的方法,但从您的问题来看,我假设情况并非如此,所以我不会朝这个方向去。

另一种方法是使用vertx。执行锁定。您可以在此处找到有关的详细信息:https://dzone.com/articles/how-to-run-blocking-code-in-vertx.

吴城
2023-03-14

复制映射(ReplicatedMap)条目将复制到集群的所有成员上。客户端仍然需要对成员执行远程调用以获取条目。根据您的需求,我认为实现可预测延迟的最佳方法是在客户端上设置近缓存。这样,条目将在客户端本地缓存,并且仅在必要时更新。

 类似资料:
  • 问题内容: 我正在为比赛设计一个机器人,该机器人通过接收机器人的输入并使用Python的输出。我有以下内容: 问题在于输入是通过流输入的,并且使用上述输入,使我无法打印任何内容,直到关闭流。我该怎么做才能使这项工作? 问题答案: 通过关闭屏蔽功能,您一次只能读取一个字符。因此,无法在非阻塞上下文中工作。我假设您只是想阅读按键来控制机器人。 我在Linux上没有运气,并创建了一种调整设置的方法。因此

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 问题内容: Java中是否有非阻塞文件读取API?如果不是,在C ++中构建一个并通过JNI从Java应用程序中调用它是否明智? 问题答案: 不,不扩展。 可能是因为并非所有的操作系​​统都支持它。 Windows确实如此,从理论上讲,您可以编写Windows特定的C ++库,并通过JNI进行调用,但是将其与集成是很多工作。 我宁愿有一个工作线程将文件内容复制到管道中,并在管道的另一端进行非阻塞读

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 我发现这是超过2岁的线。我想问一个新问题这样我就能得到更多的关注 非阻塞子流程。呼叫 我的问题: 我和@DavidJB有着相同的情况,正如他在之前的帖子中所描述的 谢谢,这似乎可以工作,但是当我在slave.py中包括一个虽然循环时,它似乎卡住了,没有在循环中执行任何东西(即使有一个timer.sleep()函数...?-DavidJB Apr 17'13 at 23:59 有人对此有什么最新消息