Hazelcast分区计数和线程并发

时间:2016-05-11 02:54:13

标签: java hazelcast

Master Hazelcast电子书“17.4.1。分区感知操作”下,它指出:

  

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

     

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

     

每个分区只属于一个操作线程。

假设我在一个17节点集群上有默认的271个分区,每个集群有16个分区线程。在群集中分配分区,这意味着所有分区都有一个与之关联的线程,每个线程只有1个分区(对我来说似乎是最佳情况)。

忽略备份和近缓存,当我创建IMap实例时,这是否意味着我只能在群集中的每个映射分区上执行1个并发的put / get操作?更进一步,如果我附加一个MapStore,这是否意味着我只能对我的后端数据库运行271个并发操作,因为无法生成异步MapStore?

我之所以提出这个问题,是因为我有一个高度并发的网络应用程序,而我最近将数据存储区切换为在其前面运行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。

1 个答案:

答案 0 :(得分:3)

  
    

创建一个IMap实例,这意味着我只能在群集中的每个地图分区上执行1个并发的put / get操作吗?

  

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

  
    

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

  

对于通过mapstore的写入 - >是。但我不是那种带有写回(异步)mapstores线程模型的家伙。

  
    

这可能仅仅是因为MapStore在尝试从数据库中提取时阻塞了分区线程吗?我还应该注意到虽然它表示没有响应20000毫秒,但20秒还没有过去。

  

这很可能是原因。