是否可以使用Azure表存储进行条件插入

是否可以使用Windows Azure表存储服务进行条件插入

基本上,我想要做的是在表格存储服务的分区中插入一个新的行/实体,当且仅当自上次查看时该分区中没有任何更改。

如果你想知道的话,我会考虑事件采购,但我认为这个问题比这个更普遍。

基本上我想阅读部分或整个分区,并根据数据内容做出决定。 为了确保数据加载后分区中没有任何变化,插入应该像普通的乐观并发一样行事:只有在分区中没有任何变化的情况下插入才能成功 - 没有添加,更新或删除行。

通常在REST服务中,我希望使用ETags来控制并发性,但据我所知,分区没有ETag。

我可以想到的最佳解决方案是为表中每个分区维护一个单独的行/实体,其中包含一个时间戳/ ETag,然后使所有插入部分成为由插入部分组成的批处理的一部分以及此'时间戳实体“。 但是,这听起来有点麻烦和脆弱。

Azure表存储服务有可能吗?


从一千英尺的视角

我可以跟你分享一个小故事......

曾几何时,有人想要针对一个给定的命令持续聚合事件(来自Domain Driven Design的名气)。 这个人希望确保聚合只能创建一次,并且可以检测到任何形式的乐观并发。

为了解决第一个问题 - 一个聚合应该只创建一次 - 他做了一个事务性介质的插入,当检测到一个重复聚合(或者更准确地说,它的主键)时抛出。 他插入的东西是作为主键的聚合标识符和变更集的唯一标识符。 在处理命令时由聚合生成的事件集合,这里的变更集意味着什么。 如果有人或其他人殴打他,他会考虑已经创建的集合并将其留在那里。 变更集将事先存储在他选择的媒体中。 这个媒介唯一的承诺就是当被问到时返回原样存储的内容。 任何未能存储变更集将被视为整个操作的失败。

为了解决第二个问题 - 在集合的进一步生命周期中检测到乐观并发 - 在写入另一个更改集之后,他会在事务性媒体中更新合计记录,当且仅当没有人在其背后更新它时即与执行命令之前他上次读取的内容相比)。 如果发生这种事情,交易媒介会通知他。 这将导致他重新开始整个操作,重新读取聚集(或其变化集)以使命令这次成功。

当然,现在他已经解决了写作问题,随之而来的是阅读问题。 如何能够读取构成其历史的聚合的所有变更集? 最后,他只有最后一次承诺的变更集与该交易媒介中的汇总标识符相关联。 所以他决定嵌入一些元数据作为每个变更集的一部分。 元数据 - 作为变更集的一部分并不罕见 - 将成为先前最后提交的变更集的标识符。 可以这样说,他可以像他的链表一样“走上线”。

作为额外的优点,他还将命令消息标识符存储为变更集元数据的一部分。 这样,在阅读变更集时,他可以预先知道他即将执行的汇总指令是否已经成为其历史的一部分。

一切都很好,结束了...

PS
1.事务介质和变更集存储介质可以是相同的,
2.变更集标识符务必不是命令标识符,
3.随意在故事中打洞:-),
4.尽管与Azure表存储没有直接关系,但我已经使用AWS DynamoDB和AWS S3成功实现了上述故事。


如何在基于AggregateId / AggregateVersion创建的“PartitionKey / RowKey”中存储每个事件?其中AggregateVersion是基于聚合已经有多少事件的序号。

这是非常确定的,所以当向聚合添加新事件时,您将确保您使用的是最新版本,否则会出现错误,指出该分区的行已经存在。 此时,您可以放弃当前操作并重试,或者尝试确定是否可以合并操作,而不管新操作是否与您刚刚执行的操作冲突。

链接地址: http://www.djcxy.com/p/57317.html

上一篇: Is it possible to make conditional inserts with Azure Table Storage

下一篇: Using Knockoutjs And Server Side Validation in .NET MVC2