Lyndon Li's Blog

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

Lyndon codingblockchain

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编程将慢慢会淘汰,变成培训课堂上的练习入门技术。

Lyndon
一个保持清醒的沉睡者