11

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

 3 years ago
source link: https://www.jdon.com/42437
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

11-08-31 banq
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。如下图:

solutionoverview.png?w=443&h=255

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

appendingevents.png?w=430&h=473

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

propagationjob.png?w=630&h=413

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

数据管理的未来: “Disk-less” 风格数据库?

[该贴被banq于2011-08-31 13:23修改过]


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK