美文网首页
Code Design

Code Design

作者: 泓礼 | 来源:发表于2019-01-28 15:54 被阅读0次

当异步碰到了锁?!

异步更新状态时如何设计幂等?

异步环境下,如何判断锁有效?因为数据此刻没有更新,锁过后,数据才更新

无状态和有状态杂糅到一起,怎么办?!

异步实现有状态,相当困难,后续的请求,应该走向哪个分支,依赖于前面的结果/状态,所以不能简单地更新其他状态,不能预先决定分支选择

有几种解决方案: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,当最新状态不能变化时,所有的请求都不返回给客户端,效果是异步阻塞,后续请求都在队列中阻塞着,这样需要确保的是第一个特殊读请求位于队首。

相关文章

网友评论

      本文标题:Code Design

      本文链接:https://www.haomeiwen.com/subject/ddbajqtx.html