青岛市天泰体育场:NOSQL存储的基于事件的事务实现

来源:百度文库 编辑:九乡新闻网 时间:2024/10/04 03:05:09

NOSQL存储的基于事件的事务实现

NoSQL认为两段事务2PC容易导致每个参与者锁定一段时间,不能实现数据分区(CAP定理),但是关系数据库能够实现我们需要的原子级别事务更新。这在许多应用中是必须的。

那么在这种需要高一致性原子事务情况下一定要使用关系数据库呢?甚至有人提出关系数据库为主,NoSQL为辅助的所谓通用方案。这篇文章就提出了基于事件的NoSQL事务解决方案。

NOSQL中忽视原子事务的一个自然解决方案是:如果在分区更新失败情况下,就让数据不一致呗,如果将吞吐量因素高于一切,甚至高于数据本身的话,这是一种可接受方案。

如果非得需要事务情况下,怎么办呢,文章认为其实在4年前的Adam Heroku一篇博客已经给出答案:http://adam.heroku.com/past/2007/12/17/a_world_without_sql/

银行账户之间转帐的老式做法是使用数据库事务,这种做法比较刚性(公牛),正确做法是将转帐事件存储起来(banq注:EDA事件驱动架构,把事件当数据,Hold住事件本身,而不是事件的结果数据),如果你是一个面向函数范式的思维者,这本身没有什么奇怪的。

对于NoSQL,解决方式是使用两种不同的数据空间,一个用来写数据,一个用来读书节,还有一个Job异步地从第一个数据空间拉数据,将其传送复制到第二个空间,两个空间有不同的数据模型,读写分离架构CQRS。如下图:



写数据空间这边主要保存的是写操作事件,比如ProfileUpdateEvent,如下图:


异步的传送Job再将这些写事件获得,运行这些写事件(事件触发函数),向读数据空间里写入更新的数据。如下图:



非常重要的是,要保证读领域的更新操作是幂等的(见蒯因与引用透明),还有事件必须充分有效地保存到DB中,事件本身必须是自我独立的。

数据管理的未来: “Disk-less” 风格数据库?
[该贴被banq于2011-08-31 13:23修改过]