昨天上午8:00,ArcBlockTechnicalLearningSeries第六期“IntrotoCQRSandCommanded”,由ArcBlock后端工程师周蕾讲授。
#讲座全程视频
#讲座全程文字:浅谈查询职责分离(CQRS)模式
最近几年,在DDD的领域,我们经常会看到CQRS架构的概念,CQRS是查询职责分离模式(CommandQueryResponsibilitySegregation)的缩写。正好这些日子Arcblock的后端的服务有考虑使用CQRS的架构,所以今天和大家一起分享一下最近的研读收获。今天会从EventSourcing出发介绍CQRS,以及通过Commanded,一起看一看如何遵循ES/CQRS的概念开发应用程序。
什么是EventSourcing(事件溯源)?
EventSourcing本质来说是保存了发生事件的本身,而不是当前的事物的状态。在EventSourcing的概念里,Event作为既定的发生之后的事情,也是最小的单位。比如:
EventSourcing的工作模式:在下面这条数据流里面,由4个发生的事件(event)组成,进而每一次改变当前的状态,同时事件们的相对顺序也是我们需要保证的。
我们会得到这样的总结:
Sn=apply(Sn-1,En)或者Sn=reduce(E,S0,apply)
其中:(S:state,E:Event)
现在我们可以发现EventSourcing的优点:
DeFi 借贷协议 Sentiment 完成 240 万美元种子轮融资,Archetype Ventures 领投:9月10日消息,DeFi 借贷协议 Sentiment 宣布完成 240 万美元种子轮融资,Archetype Ventures 领投,参投方包括 Castle Island Ventures、Matrixport Ventures 等。
Sentiment 允许借款人针对其资产创建杠杆债务头寸,这些头寸可用于与整个生态系统中的其他应用程序进行交互。贷方为协议提供流动性。[2022/9/10 13:20:58]
每个状态发生的改变都有完备的日志记录,可追溯
优化了的写的操作,提高了性能
我们身边的EventSourcing
每个程序员的每天都离不开的Github。在Git的世界里,Events(事件)是Commits,State(状态)是文件系统。
WAL:也就是Write-aheadlogging,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。Events(事件)是每一个操作,State(状态)是数据库。
对于EventSourcing来说,想做查询(query)怎么办?
试想一下,在一个银行系统里面,如果我们想要查询账户余额在1000块以上的用户,那我们难道需要把每个账户的按照Sn=reduce(E,S0,apply)这个公式在重新计算一遍吗?如果我们考虑用一个DB来保存Event,再用另外一个DB去专门为Query提供数据,同时两个DB通过发送消息进行信息同步,如何?CQRS某种程度上就解决了这样的问题。
加密对冲基金Arca:押注UST使公司措手不及,但仍有偿付能力:5月13日消息,由 Wisdom Tree 联合创始人 Ryan Steinberg 领导的数字资产对冲基金 Arca 由于押注 UST 而被传言破产,但该公司表示并非资不抵债。Arca 此前于周二向其 LP 发出了一封信,信中概述了该公司如何加倍投资UST,Arca 表示:团队相信 LUNA 将重新挂钩,而后 UST 以每枚 0.19 美元的价格下跌超过 70%。尽管如此,据一位发言人称,公司措手不及,但仍然完全有偿付能力并继续运营,一切将照旧。(The Block)[2022/5/13 3:13:15]
CQRS是什么?
CQRS全称是CommandQueryRsponsibilitySegregation,将应用程序分为两部分:命令端(Command)和查询端(Query)。命令端处理程序创建,更新和删除请求,并在数据更改时发出事件。查询端通过执行查询来处理查询,并且通过订阅数据更改时发出的事件流而保持最新。CQRS使用分离的接口将数据查询操作(Queries)和数据修改操作(Commands)分离开来,这也意味着在查询和更新过程中使用的数据模型也是不一样的。这样读和写逻辑就隔离开来了。
CQRS里面的一些概念:
Command(命令):不返回任何结果,被校验成功后但会改变对象的状态。
Query(查询):有返回结果,但是不会改变对象的状态。
Aggregate(聚合):保存状态,处理command,和改变状态。
OKEx Research首席研究员:从长期看,不但比特币价格会上涨,全球大宗商品,股票,债券的价格都会上涨:今日,OKEx Research首席研究员William在接受金色财经独家采访时表示,开动“印钞机”放水,造成币供应的增长率超过经济增长率,这就是一种货币超发。弗里德曼有一句名言:“通货膨胀在任何时候、任何地方都是货币现象”(Inflation is always and everywhere a monetary phenomenon)。货币超发是一定会导致通货膨胀的,只不过货币政策具有一定的时滞性,需要经过货币传导机制向市场注入流动性,而不是直接“直升机撒钱”式地注入流动性。比如弗里德曼对历史数据的统计发现,货币增长平均需在6~9个月以后才能引起名义收入的变化;在名义收入和产量受到影响之后,平均要再过6~9个月价格才会受到影响。所以通货膨胀一定会发生,只是发生的时间和通胀的温和程度还需要多方面因素的考虑。
通货膨胀的结果当然就是以该货币计价的商品价格上涨。目前全球以美元为主要计价单位,所以从长期看,不但比特币价格会上涨,全球大宗商品,股票,债券的价格都会上涨。
比特币在投资上的价值分析并没有多少意义,至少目前比特币现在为止还不是真正意义上的“避险资产”,由货币超发引起通货膨胀,再推导到比特币的“避险属性”根本是逻辑不通,防止通胀和避险本来就是两个概念。大家不持有货币性资产,都持有黄金、茅台、房产,这也能防通胀,为什么一定要选比特币,还要面临高风险?其实我们更多的是经济学上的价值:加密数字货币中“code is law”,“代码即法律”的思想是值得我们借鉴的。一国央行可以创造法定数字货币,为了防止人物的干预和货币政策的滥用,将单一规则的货币政策写入数字货币的发行机制中,这样既避免了信用货币贬值引发的通货膨胀,也能维持经济正常增长的需要。[2020/3/24]
EventStore:存储Events。
动态 | Arcane Research:Deribit使CME和Bakkt的交易量相形见绌:据AMBCrypto报道,分析平台Arcane Research指出,从BTC期权交易的角度来看,加密货币衍生品交易所Deribit使CME和Bakkt的交易量相形见绌。根据加密数据提供商Skew的数据,Bakkt的期权在10天内交易量为零。Arcane Research表示,“虽然CME的新期权比巴克特做得好很多,但他们也有很长的路要走。”[2020/2/3]
怎么遵循CQRS模式建立应用程序?
首先我们会基于一个Commanded,一个Elixir遵循CQRS/ES模式实现Commandside的库。
1.Commands
Commands是用户发送给应用程序的指令,表示用户的一种请求,当然请求是有可能失败的,如果想在余额有10的账户里面取出1000块这样的操作。每一个指令对应是一个module,然后使用defstruct定义域,命名方式是MineCoin,动名结构。
defmoduleMineCoindo
defstruct[
:account_id,
:nonce
]
end
2.Events
Events是由Command产生,最终导致状态改变。会最终在eventstore里面序列化存储,可以用于日后想要恢复状态。命名方式相比于Command来说发生了变化,CoinMined,过去式表达一种过去发生的事实。
DataTrek Research联合创始人:现在不是买入比特币的好时机:DataTrek Research联合创始人Nick Cola在接受cnbc报采访时解释了为何他现在对比特币发出了警告。Cola表示,许多投资者现在都在询问是不是买入比特币的好时间,Cola表示并不是。两个基础的原因分别是:1.并没有看到递增的对比特币有兴趣的新买家入场。与其它新科技一样,比特币也需要许多新的参与者而使它变得更有价值。根据谷歌搜索数据显示,目前人们对比特币的兴趣与去年12月相比减少了很多;2.上个月,新建立加密货币钱包的增长率仅有2.2%,而去年全年这一数字每月均为为5%至6%。Nick Cola同时也表示,比特币确实是个泡沫。如果比特币在交易平台之外获得“真实世界”的采用,人们对于比特币的兴趣才会重新回来。[2018/5/5]
defmoduleCoinMineddo
defstruct[
:account_id,
:nonce
]
end
3.Aggregates
Aggregates作为接受处理Command,产生或者引起对应事件的发生,以及一些改变状态的处理器。
里面包含两个函数:execute方法使用来添加我们的校验Command的一些逻辑,输入时状态和command,如果成功输出就是Event。apply函数用来更改状态,注意这里的对象是已经是生成出来的event。
|{:error,term(。
@specapply(state,event)::state
现在我们有了Command,Event,Aggregates...
那我们还需要一个派遣的角色帮助我们把Command走向对应的Aggregates。Commanded库提供了Router:
defmoduleCoins.Routerdo
useCommanded.Commands.Router
aliasCoins.Account
aliasCoins.Commands,as:C
dispatch(
[
C.MineCoin
],
to:Account
)
end
最后我们使用Commanded推荐的EventStore,它是基于PostgreSQL作为存储引擎,来保存Events。
现在我们可以说是齐活了,可以发现我们构建了如下的整个流程:这样我们就可以愉快发布Commands和生成对应的Events。
最后怎么进行数据同步到读取的DB里呢?
在这里Commaned库推荐了CommandedEctoprojections来做Eventhandler,或者也可以采用Kafka同步信息,在这里就基于不同的应用场景选择适合的Eventhandler。
主讲
周蕾
ArcBlock后端工程师
●美国东北大学毕业
●信息系统计算机专业硕士
●区块链技术爱好者
●编程语言:ElixirJavaScriptPython
下周三上午8:00,同一时间,ArcBlock区块链技术培训系列讲座第7期,现在开放报名!
点击文末左下角“阅读原文”登陆注册:
https://hack.arcblock.io/learning/
或登陆掘金注册:
https://juejin.im/events/all
ArcBlock课堂①|IntrotoGraphQLandAbsinthe
ArcBlock课堂②|IntrotoEthereumSmartContract
ArcBlock课堂③|IntrotoAWSDataPipelineServices
ArcBlock课堂④|IntrotoAWSAthena
ArcBlock课堂⑤|WhatisAWSKinesis
ArcBlock课堂⑥|多步验证那些事
ArcBlock课堂预告|是的,我们将开放大部分技术讲座
相关阅读:
ArcBlock课堂预告|是的,我们将开放大部分技术讲座
ArcBlock课堂①|IntrotoGraphQLandAbsinthe
ArcBlock课堂②|IntrotoEthereumSmartContract
ArcBlock课堂③|IntrotoAWSDataPipelineServices
ArcBlock课堂④|IntrotoAWSAthena
ArcBlock课堂⑤|WhatisAWSKinesis
ArcBlock课堂⑥|多步验证那些事
ArcBlock博客|北京黑客马拉松小记
ArcBlock黑客松③|360分钟11个DApp北京黑客创意令人大开眼界
ArcBlock北京黑客松,你来不来?
ArcBlock黑客松②|新SDK亮相黑客应用质量更高
ArcBlock活动|首场内测版黑客马拉松成功举行
ArcBlock博客|Exchange服务的工作流程以及如何集成到OCAP服务
ArcBlock博客|OCAP超简易集成攻略
ArcBlock博客|OCAP超简易集成攻略
ArcBlock博客|浅析数据对区块链行业发展的重要性
ArcBlock博客|开放链访问协议为何采用GraphQL
ArcBlock博客|如何解析BITCOIN的数据
ArcBlock博客|30天21个版本OCAPPlayground都经历了哪些变化?
ArcBlock博客|如何在几十个Repo中游刃有余?
ArcBlock博客|OCAPPlayground入门指南
ArcBlock分享|冒志鸿:公链性能焦虑是被EOS忽悠了
ArcBlock分享|冒志鸿:从互联网、移动互联网到区块链,20年方法论总结
ArcBlock分享|从OCAP到Blocklet,为传统开发者打开迈向区块链的大门
ArcBlock分享|OCAPPlayground让区块链开发变得更友好
更多ArcBlock区块基石信息,可关注以下渠道了解:
Twitter|https://twitter.com/ArcBlock_io
Instagram|https://www.instagram.com/arcblock/
Facebook|https://www.facebook.com/arcblock.io/
Telegram|https://t.me/ArcBlock
LinkedIn|https://www.linkedin.com/company/18355951/
Reddit|https://www.reddit.com/r/arcblock/
Medium|https://medium.com/arcblock
微博|https://weibo.com/realArcBlock
微信群|加拉群小助手:Ddchain
电报群|Telegramgroups:
Telegram(English):https://t.me/ArcBlock
Telegram(繁体中文):https://t.me/ArcblockAsian
↙点击登陆报名听课
尊敬的BlockGame用户为更好的完善无边界区块链游戏生态,让玩家价值得到重塑,行使对游戏的投资权利。平台将于2018年11月8号17点上线游戏投资者计划.
1900/1/1 0:00:00亲爱的用户:????IDAX将上线MGO。开通MGO/BTC交易。???充值开放时间:10月31日12:00(UTC08:00)??交易开放时间:11月01日12:00(UTC08:00)??提.
1900/1/1 0:00:00DragonEx平台10月29日龙币分红公告2018-10-301DT分红0BTC0.00024466DC0.0012USDT0.
1900/1/1 0:00:002008年11月1日,中本聪发表比特币白皮书。由此,开启了一个崭新的时代。10年后的今天,比特币白皮书发布十周年之际,星云链(Nebulas)所属星云研究院重磅发布星云紫皮书.
1900/1/1 0:00:00亲爱的用户,DigiFinex于2018年11月5日20:50开放TUSD交易区,首批开放交易对为:EOS/TUSD,ETH/TUSD,BTC/TUSD,BCH/TUSD,NEO/TUSD.
1900/1/1 0:00:00亲爱的用户:DigiFinex将于2018年11月03日15:00(GMT8)上线LendChain并同步开启充币服务,并将于2018年11月05日10:00(GMT8)开启交易和提币服务.
1900/1/1 0:00:00