事件流與事件溯源
事件流和事件溯源是事件驅動架構中兩個相關但不同的概念。
事件流是持續捕獲和儲存系統中發生的事件的過程。這些事件可以實時處理和分析,也可以儲存以供後續分析。事件流通常用於需要實時處理大量資料的系統,如金融交易系統或社交媒體平臺。
以下是使用流行的Kafka訊息系統在Go中進行事件流處理的簡單示例:
package main
import (
"context"
"fmt"
"github.com/segmentio/kafka-go"
)
func main() {
// 設定Kafka生產者以將事件傳送到主題
writer := kafka.NewWriter(kafka.WriterConfig{
Brokers: []string{"localhost:9092"},
Topic: "my-topic",
})
// 傳送一些事件到主題
writer.WriteMessages(context.Background(),
kafka.Message{
Key: []byte("key1"),
Value: []byte("value1"),
},
kafka.Message{
Key: []byte("key2"),
Value: []byte("value2"),
},
)
// 設定Kafka消費者以從主題讀取事件
reader := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"},
Topic: "my-topic",
})
// 從主題讀取事件
for {
msg, err := reader.ReadMessage(context.Background())
if err != nil {
break
}
fmt.Printf("Received message: key=%s, value=%s\n", string(msg.Key), string(msg.Value))
}
}
而事件溯源是一種構建系統的模式,將應用程式狀態的所有變化儲存為事件序列。這些事件然後可以用於在任何時間點重建應用程式的狀態。事件溯源通常用於需要可審計性、可追溯性或合規性的系統,如金融系統或醫療系統。
以下是在Go中使用記憶體事件儲存進行事件溯源的簡單示例:
package main
import (
"fmt"
)
type Event struct {
Type string
Data interface{}
}
type EventStore struct {
events []Event
}
func (store *EventStore) Append(event Event) {
store.events = append(store.events, event)
}
func (store *EventStore) GetEvents() []Event {
return store.events
}
type Account struct {
id string
balance int
store *EventStore
}
func NewAccount(id string, store *EventStore) *Account {
return &Account{
id: id,
balance: 0,
store: store,
}
}
func (account *Account) Deposit(amount int) {
event := Event{
Type: "deposit",
Data: amount,
}
account.store.Append(event)
account.balance += amount
}
func (account *Account) Withdraw(amount int) {
if account.balance >= amount {
event := Event{
Type: "withdraw",
Data: amount,
}
account.store.Append(event)
account.balance -= amount
}
}
func (account *Account) GetBalance() int {
return account.balance
}
func main() {
store := &EventStore{}
account := NewAccount("123", store)
account.Deposit(100)
account.Withdraw(50)
account.Deposit(25)
events := store.GetEvents()
for _, event := range events {
switch event.Type {
case "deposit":
amount := event.Data.(int)
fmt.Printf("Deposited %d\n", amount)
case "withdraw":
amount := event.Data.(int)
fmt.Printf("Withdrew %d\n", amount)
}
}
fmt.Printf("Final balance: %d\n", account.GetBalance())
}
事件溯源是透過將每個對聚合的修改記錄為事件並將其追加到連續流中的一種方法。要重建聚合的最終狀態,需要按順序讀取這些事件,然後將其應用於聚合。這與在建立、讀取、更新和刪除(CRUD)系統中執行的即時修改形成對比。在CRUD系統中,對記錄狀態的任何更改都儲存在資料庫中,實質上覆蓋了同
一聚合的先前版本。
一旦價格變化已儲存到Products表中,只更新了價格本身,而行的其餘部分保持不變。然而,如圖5.1所示,這種方法導致了先前價格和更改背後的上下文的丟失。
為了保留不僅新價格還包括關鍵後設資料(如調整原因)的資訊,將更改記錄為Events表中的事件。先前的價格在先前事件中保持不變,以便在需要時檢索。
為了實現有效的事件溯源,建議使用提供強大一致性保證並使用樂觀併發控制的事件儲存。在實踐中,這意味著當多個修改同時發生時,只有初始修改才能附加到流中。隨後的修改可能需要重試或可能會失敗。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024923/viewspace-3006080/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 事件協作和事件溯源事件
- PHP 事件溯源PHP事件
- 如何在Java後端中實現事件驅動架構:從事件匯流排到事件溯源Java後端事件架構
- 事件消費者之 Saga - 事件溯源事件
- 事件消費者之 Reactor - 事件溯源事件React
- 事件消費者之 Projector - 事件溯源事件Project
- 剖玄析微聚合 - 事件溯源事件
- 事件溯源:是來自事件的狀態與作為狀態的事件? - verraes事件
- 事件溯源與流水賬的結賬模式事件模式
- 事件溯源全指南 - Arkwrite事件
- 使用Kafka實現事件溯源Kafka事件
- Rust中的事件溯源 - ariseyhunRust事件
- js--事件流、事件委託、事件階段JS事件
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- JS事件流和事件委託JS事件
- 事件節流事件
- Chronicle事件溯源的最佳實踐事件
- .NET分散式Orleans - 6 - 事件溯源分散式事件
- Python的事件溯源開源庫Python事件
- Spring Boot和EventStoreDB事件溯源案例Spring Boot事件
- Occcurrent:JVM事件溯源工具庫包JVM事件
- 事件匯流排事件
- JS的事件繫結和事件流模型JS事件模型
- zepto繫結事件改變冒泡事件流事件
- HomeAway分享雲端事件溯源經驗事件
- Java反應式事件溯源:領域Java事件
- 從入門到放棄 - 事件溯源事件
- 從增刪改查到事件溯源 - PHP事件PHP
- .NET的事件溯源構建庫:Eventuous事件
- 事件流處理 (ESP) 與 Kafka 簡介事件Kafka
- 如何讓客戶方便地使用事件溯源?事件溯源有什麼好處?- daryush_d事件
- Java反應式事件溯源之第5部分:事件儲存Java事件
- MySQL的事件溯源Event Sourcing表結構MySql事件
- 事件溯源:投影或投射模式 -Kacper Gunia事件模式
- 如何遷移到微服務和事件溯源EventSourcing微服務事件
- 無伺服器與事件溯源結合的演示案例:將事件溯源作為Azure函式的資料持久化機制的庫伺服器事件函式持久化
- 事件匯流排的設計與實現事件
- touch事件與click事件區別事件