首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Hazelcast时阻塞线程

使用Hazelcast时阻塞线程
EN

Stack Overflow用户
提问于 2022-08-19 15:59:47
回答 1查看 93关注 0票数 1

我有一个使用Vert.x (4.3.3)、Rxjava、Hazelcast (5.1.3)的应用程序,而且我在使用异步submitToKey方法时遇到了麻烦。当应用程序在本地运行(docker )时,一切都正常工作,但一旦我将应用程序部署到Kubernetes,应用程序就会正确地发现所有成员,但是线程阻塞了无限时间的警告。你可以看到下面的日志。

根据我的研究,阻塞线程来自于submitToKey方法调用:

代码语言:javascript
运行
复制
private Completable handleUpdates(String id, Analysis analysis) {
    return Completable.fromFuture(cache.submitToKey(id, new AnalysisEntryProcessor(analysis)).toCompletableFuture());
}

线程阻塞日志:

{“立即”:{“epochSecond”:1660923533,"nanoOfSecond":335170000},“线程”:“vertx-阻止-线程-检查器”,“级别”:“警告”,“消息”:“线程线程”x-事件循环-线程-0,5,main已被阻塞10694 ms,时间限制为2000 ms,“引发”:{“commonElementCount”:0,“localizedMessage”:“线程阻塞”,“消息”:“线程阻塞”,“名字”:“io.vertx.core.VertxException”"extendedStackTrace":"io.vertx.core.VertxException:线程阻塞\n\tat jdk.internal.misc.Unsafe.park(原生方法)~:?\n\tat java.util.concurrent.locks.LockSupport.park(Unknown Source) ~:?\n\tat com.hazelcast.spi.impl.AbstractInvocationFuture.manageParking(AbstractInvocationFuture.java:693) ~app.jar:?\n\tat com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:615) ~app.jar:?\n\tat com。hazelcast.spi.impl.DelegatingCompletableFuture.get(DelegatingCompletableFuture.java:109) ~app.jar:?\n\tat io.reactivex.internal.functions.Functions$FutureAction.run(Functions.java:161) ~app.jar:?\n\tat ~app.jar:?\n\tat io.reactivex.Completable.subscribe(Completable.java:2309) ~app.jar:?\n\tat io.reactivex.internal.operators.single.SingleFlatMapCompletable$FlatMapCompletableObserver.onSuccess(SingleFlatMapCompletable.java:91) io.reactivex.internal.operators.single.SingleJust.subscribeActual(SingleJust.java:30) ~app.jar:?\n\tat io.reactivex.Single.subscribe(Single.java:3666) ~app.jar:?\n\tat io.reactivex.internal.operators.single.SingleFlatMapCompletable.subscribeActual(SingleFlatMapCompletable.java:44) ~app.jar:?\n\tat io.reactivex.Completable.subscribe(Completable.java:2309) ~app.jar:?\n\tat io.reactivex.internal.operators.completable.CompletableObserveOn.subscribeActual(CompletableObserveOn.java:34) ~app.jar:?\n\tat io.reactivex.Completable.subscribe(Completable.java:2309) ~app.jar:?\n\tat ~app.jar:?\n\tat io.reactivex.internal.operators.mixed.MaybeFlatMapPublisher$FlatMapPublisherSubscriber.onNext(MaybeFlatMapPublisher.java:75) ~app.jar:?\n\tat io.reactivex.internal.operators.flowable.FlowableFromIterable$IteratorSubscription.fastPath(FlowableFromIterable.java:178) ~app.jar:?\n\tat ~app.jar:?\n\tat ~app.jar:?\n\tat io.reactivex.internal.operators.mixed.MaybeFlatMapPublisher$FlatMapPublisherSubscriber.onSubscribe(MaybeFlatMapPublisher.java:124) ~app.jar:?\n\tat io.reactivex.internal.operators.flowable.FlowableFromIterable.subscribe(FlowableFromIterable.java:69) io.reactivex.internal.operators.flowable.FlowableFromIterable.subscribeActual(FlowableFromIterable.java:47) ~app.jar:?\n\tat io.reactivex.Flowable.subscribe(Flowable.java:14935) ~app.jar:?\n\tat io.reactivex.Flowable.subscribe(Flowable.java:14882) ~app.jar:?\n\tat io.reactivex.internal.operators.mixed.MaybeFlatMapPublisher$FlatMapPublisherSubscriber.onSuccess(MaybeFlatMapPublisher.java:119) ~app.jar:?\n\tat io.reactivex.internal.operators.maybe.MaybePeek$MaybePeekObserver.onSuccess(MaybePeek.java:122) ~app.jar:?\n\tat io.vertx.reactivex.impl.AsyncResultMaybe.lambda$subscribeActual$0(AsyncResultMaybe.java:50) ~app.jar:?\n\tat io.vertx.reactivex.impl.AsyncResultMaybe$$Lambda$2064/0x0000000840908040.handle(Unknown来源)~?:?\n\n io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141) ~app.jar:?\n\tat io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54) io.vertx.core.impl.future.FutureBase$$Lambda$227/0x00000008402b9040.run(Unknown源)~?:?\n io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~app.jar:?\n\tat io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~app.jar:?\n\tat io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~app.jar:?\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~app.jar:?\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~app.jar:?\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~app.jar:?\n\tat java.lang.Thread.run(未知来源) ~?:?\n"},"endOfBatch":true,"loggerFqcn":"io.vertx.core.logging.Logger","threadId":19,"threadPriority":5}

我试图将Djava.util.concurrent.ForkJoinPool.common.parallelism=1,更改Hazelcast版本设置为4.2.5,增加CPU配额,但没有什么不同。

谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2022-08-23 13:07:28

最后,问题似乎在于实现+缺乏应用程序的资源。

代码语言:javascript
运行
复制
Completable.fromFuture(cache.submitToKey(id, new AnalysisEntryProcessor(analysis)).toCompletableFuture());

fromFuture函数调用将来阻塞的get()。这在单个CPU上会导致死锁,事件循环线程永远不会被释放。

工作解决办法是:

代码语言:javascript
运行
复制
private Completable handleOnlyUpdates(String id, Analysis analysis) {
    return Completable.create(emitter ->
            cache.submitToKey(id, new AnalysisEntryProcessor(analysis))
                    .whenComplete((v, error) -> {
                        if (error != null) {
                            emitter.onError(error);
                        } else {
                            emitter.onComplete();
                        }
                    }))
                    .observeOn(RxHelper.scheduler(vertx.getOrCreateContext()));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73419405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档