【发布时间】:2016-05-11 02:54:12
【问题描述】:
在Master Hazelcast 电子书中的“17.4.1. Partition-aware Operations”下指出:
为了执行分区感知操作,创建了一个操作线程数组。
单个操作线程执行多个分区的操作;
每个分区只属于1个操作线程。
假设我在一个 17 节点集群上默认有 271 个分区,每个集群有 16 个分区线程。将分区分布在集群中,这意味着所有分区都将有一个与之关联的线程,并且每个线程将只有 1 个分区(对我来说似乎是最佳情况)。
忽略备份和近缓存,当我创建 IMap 实例时,这是否意味着我只能在集群中的每个映射分区上执行 1 个并发 put/get 操作?更进一步,如果我附加一个 MapStore,这是否意味着我只能对我的后端数据库运行 271 个并发操作,因为无法创建异步 MapStore?
我问这个问题的原因是我有一个高度并发的 Web 应用程序,我最近将数据存储切换为在它前面运行 Hazelcast IMap。该应用程序接受数以千计的并发连接,并且几乎每个请求都至少从分布式映射中执行一次 get 操作。我看到很多这样的错误:
com.hazelcast.core.OperationTimeoutException: No response for 20000 ms. Aborting invocation! Invocation{serviceName='hz:impl:mapService', op=com.hazelcast.map.impl.operation.GetOperation{identityHash=1003806362, serviceName='hz:impl:mapService', partitionId=244, replicaIndex=0, callId=55212219, invocationTime=1462913274676 (Tue May 10 20:47:54 UTC 2016), waitTimeout=-1, callTimeout=10000, name=..., name=...}, partitionId=244, replicaIndex=0, tryCount=250, tryPauseMillis=500, invokeCount=1, callTimeout=10000, target=Address[10.0.2.221]:5701, backupsExpected=0, backupsCompleted=0, connection=Connection [/10.0.2.219:5701 -> /10.0.2.221:14565], endpoint=Address[10.0.2.221]:5701, alive=true, type=MEMBER} No response has been received! backups-expected:0 backups-completed: 0
这可能仅仅是因为 MapStore 在尝试从数据库中获取数据时阻塞了分区线程吗?我还应该注意,虽然它说 No response for 20000 ms,但 20 秒还没有过去。
我在 Java 8 上运行 Hazelcast 3.6.2。
【问题讨论】:
-
您是否因 20 秒超时而不是通常的 2x60 秒而更改了 hazelcast.operation.call.timeout.millis。