加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > DOGE > Info

ArcBlock 課堂 ⑦ | Intro to CQRS and Commanded(全程視頻 + 文字)_BLO:LOC

Author:

Time:1900/1/1 0:00:00

昨天上午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的優點:

每個狀態發生的改變都有完備的日志記錄,可追溯

優化了的寫的操作,提高了性能

我們身邊的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某種程度上就解決了這樣的問題。

CQRS是什么?

CQRS全稱是CommandQueryRsponsibilitySegregation,將應用程序分為兩部分:命令端(Command)和查詢端(Query)。命令端處理程序創建,更新和刪除請求,并在數據更改時發出事件。查詢端通過執行查詢來處理查詢,并且通過訂閱數據更改時發出的事件流而保持最新。CQRS使用分離的接口將數據查詢操作(Queries)和數據修改操作(Commands)分離開來,這也意味著在查詢和更新過程中使用的數據模型也是不一樣的。這樣讀和寫邏輯就隔離開來了。

CQRS里面的一些概念:

Command(命令):不返回任何結果,被校驗成功后但會改變對象的狀態。

Query(查詢):有返回結果,但是不會改變對象的狀態。

Aggregate(聚合):保存狀態,處理command,和改變狀態。

EventStore:存儲Events。

怎么遵循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,過去式表達一種過去發生的事實。

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

↙點擊登陸報名聽課

Tags:BLOLOCLOCKBLOCKblockchain錢包進不去SLOCK幣LaunchblockBlockSAFU

DOGE
NBAI挖礦說明(中文版)_NBA:MINE

智云鏈Orion云平臺 Orion云平臺基于云計算的理念,利用全網閑置資源形成去中心化的分布式云計算基礎網絡,集結全球礦工,激活全球閑散的AI算力資源.

1900/1/1 0:00:00
波場TRON小課堂第十四問 | 什么叫區塊鏈主網上線?_tron:區塊鏈

波場TRON|小課堂 在日常工作中,我們經常能夠收到來自社區用戶對關于項目、數字資產、區塊鏈的提問,波場TRON為了向大家更好的展示去區塊鏈去中心化的優勢,普及區塊鏈基礎知識.

1900/1/1 0:00:00
課程預告 | NEO區塊鏈公開課(6):區塊鏈游戲的設計與開發_區塊鏈:NEO

NEO區塊鏈公開課是強調探討技術、動手實踐的區塊鏈技術學習專場活動。通過分享有切實幫助的技術技能,交流開發實戰經驗,讓每個人都能享受到區塊鏈技術創新的魅力.

1900/1/1 0:00:00
Bluzelle與Portal Network達成合作_BLU:區塊鏈技術通俗講解科普

我們很高興宣布與PortalNetwork達成合作!PortalNetwork是一家新興區塊鏈公司,從自身核心產品——區塊鏈域名注冊服務出發,致力于推廣區塊鏈技術,希望透過串聯、整合多方技術.

1900/1/1 0:00:00
關于DragonEx網頁版更新公告_DRAG:ARGON

關于DragonEx網頁版更新公告 2018-11-02 親愛的用戶: 即時起,DragonEx已更新網頁版及新增功能。誠邀各位體驗.

1900/1/1 0:00:00
借貸功能即將上線!MTC萬圣節四重禮請查收_MTC:aave幣的中文叫什么

MTC萬圣節四重禮 萬圣節將至,MTC為大家準備的可不只是糖果,現在開始,調整呼吸,MTC萬圣節四重禮,請查收: 一重禮:借貸功能上線禮 或許雙11將至.

1900/1/1 0:00:00
ads