从CRUD编程切换到事件溯源和区块链编程

CRUD是增删改查的简称,其中增删改都属于一种变动操作,而新增和删改分别属于两种不同类型的变动,如果以记账来类比,新增等同于多了一笔金额,而删改等同于减少了一笔金额。

下面以文档的增删改查从记账角度看看如何理解。


文档 记账

新增文档 +100

修改文档 -50

删除文档 -50

文档的当前状态就是这些变动动作的累计,新增文档以后修改了这篇文档,最后又删除了这个文档,那么这个文档当前状态是没有了。而记账如果假设期初余额为零,存入了一笔100元,后来取出50,当再取出50时,这个账户当前余额就是0了。

事件溯源EventSourcing与CRUD的区别就在于:
ES中记录的是这三个变动,将这三个变动作为事件记录保存下来;而CRUD则是将这三个动作通过服务的增删改查方法调用SQL的insert/update/delete语句实现。

CRUD实现方式:


文档 记账 SQL实现

新增文档 +100 insert/update

修改文档 -50 update

删除文档 -50 delete/update

事件溯源EventSourcing实现方式:


文档 记账 ES实现

新增文档 +100 Event1

修改文档 -50 Event2

删除文档 -50 Event3

ES实际记录的是包含Event1 Event2 Event3的集合,当需要获得当前状态时,通过播放这些事件获得,比如账户当前余额是:100 -50 -50=0,文档当前状态通过遍历事件集合:apply(event1) --> apply(event2) --->apply(event3) 计算以后的结果。

区块链实际是将ES的这些事件集合复制到每个机器上,同时将这些事件严格通过事件编号链接起来,事件之间就无法随意插入其他事件,保证事件链在分散式环境中的完整。

区块链就是把Event1 <--- Event2 <--- Event3事件通过编号串联起来,每台机器上不但有一个完整的事件集合,而且这些事件通过编号串联起来如同一个链条,当有新的事件进来,首先找出事件链中最后的事件编号,然后靠算力算出新的事件编号:
Event1编号Hash <--- Event2编号Hash --->Event3编号Hash

区块链其实是一种分布式的事件溯源ES。

总之,基于事件驱动的事件溯源ES是一种与传统CRUD完全不同的编程范式,更是一种新的区块链编程范式。通过这种事件驱动编程方式不但可以解决传统分布式事务的难题,而且可以提升了系统的扩展性和弹性。传统的CRUD方式虽然简单易用,但是非常依赖关系数据库技术,相信随着区块链技术的发展,传统CRUD编程将慢慢会淘汰,变成培训课堂上的练习入门技术。

上文谈到区块链与事件溯源的区别是:区块链将事件通过哈希值有顺序地排列起来,这个有顺序的排序本身是一个大难题,因为存在拜占庭将军问题,希腊时期人类还没有时钟或表,两个无法碰面的将军通过人送信约定某个时刻进攻目标,但是却无法到时真正一起攻打目标,因为他们没有对时,因为没有手表或时钟。在一个分布式系统中也是这样,那么区块链是如何解决这个共识问题呢?通过工作证明:

区块链的工作证明其实是一个分布式时钟

楼主真厉害,区块链经楼主简单的事件朔源描述后,理解起来容易多了。