Hazelcast分区计数和线程并发

Ken*_*thJ 5 java hazelcast

在"17.4.1.分区感知操作"下的Master Hazelcast电子书中,它指出:

要执行分区感知操作,将创建一个操作线程数组.

单个操作线程执行多个分区的操作;

每个分区只属于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.

pve*_*jer 3

忽略备份和近缓存,当我创建 IMap 实例时,这是否意味着我只能在集群中的每个映射分区上执行 1 个并发 put/get 操作?

正确的。因此,映射 a 和映射 b 的分区 25 可能正忙于处理映射 b 的操作,因此映射 a 的操作需要等待。

更进一步,如果我附加一个 MapStore,这是否意味着我只能对我的后端数据库运行 271 个并发操作,因为无法创建异步 MapStore?

对于通过映射存储进行写入 --> 是的。但我不太熟悉 writebehind(异步)映射存储线程模型。

这是否仅仅是由于 MapStore 在尝试从数据库获取数据时阻塞分区线程而导致的?我还应该注意到,虽然它说 20000 毫秒没有响应,但 20 秒还没有过去。

这很可能就是原因。