关于putAsync调用顺序与客户端持续查询监听器接收顺序的疑问
Ignite putAsync调用顺序与持续查询监听器的接收顺序保证
一、一般场景下无法保证顺序
即使从同一线程发起多次putAsync调用,也不能保证监听器会按调用顺序收到更新。原因包括:
putAsync是异步非阻塞API,调用后任务会被提交到Ignite的线程池执行,底层可能由不同线程并行处理;- 不同key可能属于不同分区,会被分发到不同节点处理,网络传输延迟也可能导致更新到达监听器的顺序错乱;
- 即使是同一key,若底层执行时出现线程切换或调度延迟,也可能打破调用顺序(官方不对此做保证)。
二、受限场景下的顺序保证
当满足以下所有条件时,同一key的putAsync更新顺序可以保证,但不同key仍无法保证:
- 调用在Ignite服务内部执行;
- 操作对象是分区缓存;
- 调用发生在目标key所属的分区节点上。
具体说明:
- Ignite对同一分区的写操作会通过分区锁串行化处理,同一线程发起的同一key(属于同一分区)的
putAsync调用,会按提交顺序排队执行,最终监听器会先收到valA1的更新,再收到valA2的更新; - 不同key若属于不同分区,即使在同一节点执行,它们的写操作是并行处理的,因此监听器收到
valB与valA系列更新的顺序仍无法保证。
内容的提问来源于stack exchange,提问作者Mikha
相关产品推荐
相关产品推荐

