無伺服器與事件溯源結合的演示案例:將事件溯源作為Azure函式的資料持久化機制的庫
簡單的說,事件溯源是一種儲存狀態(對於實體)的方法,該狀態是通過儲存該實體發生的所有事件的順序歷史記錄而起作用的。對實體的更改將作為新事件寫入,附加到該實體的事件流的末尾。
當查詢或業務流程需要使用實體的當前狀態時,它會通過在事件流上執行投影來獲取此資訊,這是一段非常簡單的程式碼,對於每個事件,它決定(a)我是否關心這種型別事件(b)如果是,我收到事件後該怎麼辦。
目標是能夠與實體的事件流進行互動,而無需在Azure函式本身中進行任何額外的設定-既可以訪問事件流,又可以通過在執行Azure函式時例項化的繫結變數來執行投影。
要將事件新增到事件流,可以使用事件流屬性和類,因此:
[FunctionName("OpenAccount")] public static async Task<HttpResponseMessage> OpenAccountRun( [HttpTrigger(AuthorizationLevel.Function, "POST", Route = "OpenAccount/{accountnumber}")]HttpRequestMessage req, string accountnumber, [EventStream("Bank", "Account", "{accountnumber}")] EventStream bankAccountEvents) { if (await bankAccountEvents.Exists()) { return req.CreateResponse(System.Net.HttpStatusCode.Forbidden , $"Account {accountnumber} already exists"); } else { // Get request body AccountOpeningData data = await req.Content.ReadAsAsync<AccountOpeningData>(); // Append a "created" event DateTime dateCreated = DateTime.UtcNow; Account.Events.Opened evtOpened = new Account.Events.Opened() { LoggedOpeningDate = dateCreated }; if (! string.IsNullOrWhiteSpace( data.Commentary)) { evtOpened.Commentary = data.Commentary; } await bankAccountEvents.AppendEvent(evtOpened); return req.CreateResponse(System.Net.HttpStatusCode.Created , $"Account {accountnumber} created"); } } |
從事件流中獲得狀態的方式稱為投射 projection:
[FunctionName("GetBalance")] public static async Task<HttpResponseMessage> GetBalanceRun( [HttpTrigger(AuthorizationLevel.Function, "GET", Route = "GetBalance/{accountnumber}")]HttpRequestMessage req, string accountnumber, [Projection("Bank", "Account", "{accountnumber}", nameof(Balance))] Projection prjBankAccountBalance) { string result = $"No balance found for account {accountnumber}"; if (null != prjBankAccountBalance) { Balance projectedBalance = await prjBankAccountBalance.Process<Balance>(); if (null != projectedBalance ) { result = $"Balance for account {accountnumber} is ${projectedBalance.CurrentBalance} (As at {projectedBalance.CurrentSequenceNumber}) "; } } return req.CreateResponse(System.Net.HttpStatusCode.OK, result); } |
這兩個屬性的所有屬性都設定為AutoResolve,因此可以在執行時設定它們。
由於事件流本質上是僅附加系統,因此其基礎的儲存技術是AppendBlob-一種特殊的Blob儲存型別,它僅允許將塊附加到Blob的末尾。每個Blob最多可以儲存50,000個事件,並且容器路徑可以與任何其他Azure Blob儲存相同的方式巢狀。
對於高容量流,可以使用Azure Tables後端代替AppendBlob。儲存技術和儲存目標的選擇可以通過應用程式上的配置設定進行切換。
在該庫中,必須根據需要檢索實體的狀態-這是為了使函式應用程式分解為零,並且實際上允許多個獨立的Azure功能應用程式使用相同的基礎事件流而不必使用任何“始終線上”一致性服務。
相關文章
- 事件溯源將顛覆關聯式資料庫! - Remy事件資料庫REM
- 事件溯源:是來自事件的狀態與作為狀態的事件? - verraes事件
- 事件流與事件溯源事件
- 事件溯源與流水賬的結賬模式事件模式
- 函式化事件溯源的決策者模式 - thinkbeforecoding函式事件模式
- 事件溯源超越關聯式資料庫 - confluent事件資料庫
- Python的事件溯源開源庫Python事件
- .NET的事件溯源構建庫:Eventuous事件
- 事件協作和事件溯源事件
- Rust中的事件溯源 - ariseyhunRust事件
- PHP 事件溯源PHP事件
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- Spring Boot和EventStoreDB事件溯源案例Spring Boot事件
- Chronicle事件溯源的最佳實踐事件
- MySQL的事件溯源Event Sourcing表結構MySql事件
- .NET分散式Orleans - 6 - 事件溯源分散式事件
- 剖玄析微聚合 - 事件溯源事件
- Occcurrent:JVM事件溯源工具庫包JVM事件
- Java反應式事件溯源:領域Java事件
- 事件溯源全指南 - Arkwrite事件
- 事件溯源不是什麼?事件
- 事件消費者之 Projector - 事件溯源事件Project
- 事件消費者之 Reactor - 事件溯源事件React
- 用資料結構解釋事件溯源 – {4Comprehension}資料結構事件
- 事件消費者之 Saga - 事件溯源事件
- 使用Kafka實現事件溯源Kafka事件
- 事件溯源在物聯網裝置資料同步中應用案例 - eventstore事件
- 從 CRUD 遷移到事件溯源的祕訣 - eventstore事件
- 拯救祭天的程式設計師——事件溯源模式程式設計師事件模式
- .NET Core中的事件溯源開源專案事件
- 審計系統的一劑良方——事件溯源事件
- JS的事件物件與事件機制JS事件物件
- Linux伺服器應急事件溯源報告Linux伺服器事件
- 事件溯源概念深入人心:Kafka將拋棄ZooKeeper,替換為自我管理的後設資料仲裁事件Kafka
- 使用AsyncAPI規範簡潔實現CQRS事件溯源案例API事件
- Java反應式事件溯源之第5部分:事件儲存Java事件
- 事件溯源的優點並不能兌現 - Jimmy Bogard事件
- JavaScript中的事件迴圈機制跟函式柯里化JavaScript事件函式