当异步碰到了锁?!
异步更新状态时如何设计幂等?
异步环境下,如何判断锁有效?因为数据此刻没有更新,锁过后,数据才更新
无状态和有状态杂糅到一起,怎么办?!
异步实现有状态,相当困难,后续的请求,应该走向哪个分支,依赖于前面的结果/状态,所以不能简单地更新其他状态,不能预先决定分支选择
有几种解决方案:1.使用state machine,当异步的更新尚未生效时,使对象一直处于invalid状态,设置后续请求不能直接操作invalid对象,或者当对象为invalid时触发状态变化
2.请求入队,这样方便按序处理请求,第一个请求失败时,后面请求全部失效,或者都重试从特定位置读取;
3.返回异常,消费者重试
当前range没有data时,直接告诉client,由client负责重试,或者server侧ColumnReader重试VectorReader
但不是end of stream,告诉client无益;server侧轮询,即colunReadSession处理,可以考虑延时处理。实现起来均复杂。
难点在于:ColumnReader需要协调多个列的VectorReader,这些子列需要步伐一致,否则读取的数据会错位。而设置一致的读取点时,各个子列快慢不同,是否有数据源也各异。
而厘清后的真正问题是:第一个设置初始位置的读请求存在数据暂时无法获得的情况,而后续的读请求异步到达,存在请求顺序被打乱的风险(顺序是app要求)
最终解决方案:state machine + blocking,当最新状态不能变化时,所有的请求都不返回给客户端,效果是异步阻塞,后续请求都在队列中阻塞着,这样需要确保的是第一个特殊读请求位于队首。