Below you will find pages that utilize the taxonomy term “Event Store”
Posts
Event Store - Scavenging events
當刪除 Event 或是 Stream 時, Event Store 不會立即刪除,硬碟空間也並未被回收,若要讓 Event Store 立即做刪除的處理,可以使用 Event Store 的 Scavenge。
像是筆者這邊將大量的 Event 寫入 Event Store,並將 Event 設為一秒後自動刪除。
當 Event 被刪除後,雖然 Event Store 看不到這些 Event,但是 Event Store 其實必為真的將之刪除。
這時我們可以打 Event Store 的 Scavenge API。
curl -i -d {} -X POST http://localhost:2113/admin/scavenge -u "admin:changeit" 或是透過 Web interface Admin 頁面的 Scavenge 按鈕觸發 Scavenge。
處理完後點選 Scavenge 紀錄查看。
可以看到 Scavenge 處理的細部資訊,像是節省了多少硬碟空間等。
Link Scavenging events | Event Store
read morePosts
Event Store - Max age
要設定 Event Store 的 Stream 內 Event 的存活時間,可以設定 Stream 的 Max age。
透過 StreamMetadata 的 maxAge 指定 Stream 內 Event 的存活時間,然後透過 Connection.SetStreamMetadataAsync,帶入 Stream 的名稱、ExpectedVersion、以及剛設定好的 StreamMetadata。
... var streamMetaData = StreamMetadata.Create(maxAge: TimeSpan.FromSeconds(maxAge)); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); 像是筆者這邊設定了 Stream 內 Event 的存活時間。
using EventStore.ClientAPI; ... using (var conn = EventStoreConnection.Create(connectionString, connectionName)) { conn.ConnectAsync().Wait(); var streamName = "MyStream"; var streamMetaData = StreamMetadata.Create(maxAge: TimeSpan.FromSeconds(10)); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); } Stream 內的 Event 在指定的存活時間過後就會自動被清除。
Link Deleting streams and events | Event Store
read morePosts
Event Store - Max count
要設定 Event Store 的 Stream 只存放指定個數的 Event,可以設定 Stream 的 Max count。
透過 StreamMetadata 的 MaxCount 指定 Stream 最大存放的 Event 數,然後透過 Connection.SetStreamMetadataAsync,帶入 Stream 的名稱、ExpectedVersion、以及剛設定好的 StreamMetadata。
... var streamMetaData = StreamMetadata.Create(maxCount: maxCount); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); 像是筆者這邊設定了 Stream 的 Metadata,指定 Stream 只存放指定個數的 Event,然後接著嘗試塞入超過指定個數的 Event。
using EventStore.ClientAPI; ... using (var conn = EventStoreConnection.Create(connectionString, connectionName)) { conn.ConnectAsync().Wait(); var streamName = "MyStream"; var typeName = "MyType"; var streamMetaData = StreamMetadata.Create(maxCount: 10); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); var data = new { Msg = "Hello world!
read morePosts
Event Store - Truncate before
要使用 Event Store 的 Truncate before 刪除指定 Event 編號以前的 Event,可以設定 StreamMetadata。
透過 StreamMetadata 的 truncateBefore 指定編號多少以前的 Event 要被刪除,然後透過 Connection.SetStreamMetadataAsync,帶入 Stream 的名稱、ExpectedVersion、以及剛設定好的 StreamMetadata。
... var streamMetaData = StreamMetadata.Create(truncateBefore: eventID); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); 像是筆者這邊準備了一個內含 100 筆 Event 的 Stream。
設定 Stream 的 truncateBefore metadata 為 85。
using EventStore.ClientAPI; ... using (var conn = EventStoreConnection.Create(connectionString, connectionName)) { conn.ConnectAsync().Wait(); var streamName = "MyStream"; var streamMetaData = StreamMetadata.Create(truncateBefore: 85); conn.SetStreamMetadataAsync(streamName, ExpectedVersion.StreamExists, streamMetaData).Wait(); } 運行後重整, Number 85 以下的 Event 就會被刪除。
read morePosts
Event Store - Setting up a Cluster using only Database Nodes (OSS)
要啟用 Event Store 的 Cluster 功能,可以開啟 Event Store,設定 IP、Port、與 gossip-seed。
像是下面這邊就在本機起了三個 Event Store 服務,服務的 Log、IP、Post 都錯開,並互設 gossip-seed。
start EventStore.ClusterNode.exe --mem-db --log .\logs\log1 --int-ip 127.0.0.1 --ext-ip 127.0.0.1 --int-tcp-port=1111 --ext-tcp-port=1112 --int-http-port=1113 --ext-http-port=1114 --cluster-size=3 --discover-via-dns=false --gossip-seed=127.0.0.1:2113,127.0.0.1:3113 start EventStore.ClusterNode.exe --mem-db --log .\logs\log2 --int-ip 127.0.0.1 --ext-ip 127.0.0.1 --int-tcp-port=2111 --ext-tcp-port=2112 --int-http-port=2113 --ext-http-port=2114 --cluster-size=3 --discover-via-dns=false --gossip-seed=127.0.0.1:1113,127.0.0.1:3113 start EventStore.ClusterNode.exe --mem-db --log .\logs\log3 --int-ip 127.0.0.1 --ext-ip 127.0.0.1 --int-tcp-port=3111 --ext-tcp-port=3112 --int-http-port=3113 --ext-http-port=3114 --cluster-size=3 --discover-via-dns=false --gossip-seed=127.0.0.1:1113,127.0.0.1:2113 服務啟用後,因為 Cluster 會互相抄寫,所以可在 Web interface 的 Dashboard 頁面下面看到來自其它 Event Store 服務的連線。
read morePosts
Event Store - Subscribing to Receive Stream Updates with .NET API
要使用 Event Store .NET API 訂閱並監聽 Stream 的變化,可以使用 PersistentSubscriptionSettings.Create 設定訂閱,然後調用 Connection.CreatePersistentSubscriptionAsync 方法建立 Persistent Subscriptions。
... var settings = PersistentSubscriptionSettings.Create() .DoNotResolveLinkTos() .StartFromCurrent(); ... conn.CreatePersistentSubscriptionAsync(streamName, groupName, settings, credentials).Wait(); ... 建立後可在 Web interface 看到對應的 Persistent Subscriptions。
接著透過 Connection.ConnectToPersistentSubscription 訂閱 Persistent Subscriptions,指定 Stream 的名稱、Group 的名稱、收到訂閱要做的處理…等即可。
conn.ConnectToPersistentSubscription(streamName, groupName, (_, x) => { ... }, (sub, reason, ex) => { }, credentials); ... 像是下面這邊筆者建立了一個名為 MyGroup 的訂閱,訂閱的來源來自 MyStream,建立訂閱後連結訂閱,然後將收到的訂閱訊息顯示出來。
using EventStore.ClientAPI; using EventStore.ClientAPI.SystemData; ... using (var conn = EventStoreConnection.
read morePosts
Event Store - Read a Single Event with .NET API
要使用 Event Store .NET API 讀取 Event Store 特定 Stream 內特定的 Event,可以帶入 Stream 的名稱、Event 的編號,調用 Connection.ReadEventAsync 方法。
... var readResult = conn.ReadEventAsync(streamName, 0, true).Result; ... 然後再去讀取需要的 Event 資料即可。
... Console.WriteLine("{0} {1}", readResult.EventNumber, Encoding.UTF8.GetString(readResult.Event.Value.Event.Data)); ... 像是筆者這邊有個 Event 如下:
就可以像下面這樣讀取指定的 Event。
using EventStore.ClientAPI; ... using (var conn = EventStoreConnection.Create(connectionString, connectionName)) { conn.ConnectAsync().Wait(); var streamName = "MyStream"; var readResult = conn.ReadEventAsync(streamName, 0, true).Result; Console.WriteLine("{0} {1}", readResult.EventNumber, Encoding.UTF8.GetString(readResult.Event.Value.Event.Data)); } ... Link Step 2 - Read events from a stream and subscribe to changes | Event Store
read morePosts
Event Store - Read a Stream of Events with .NET API
要使用 Event Store .NET API 讀取 Event Store 特定 Stream 內的 Event,可以帶入 Stream 的名稱、起始的 Event 編號、以及預計要讀取的 Event 數,去調用 Connetction.ReadStreamEventsForwardAsync 方法。
... var readEvents = conn.ReadStreamEventsForwardAsync(streamName, start, count, true).Result; ... 然後再去讀取需要的 Event 資料即可。
... foreach (var evt in readEvents.Events) Console.WriteLine("{0} {1}", evt.Event.EventNumber, Encoding.UTF8.GetString(evt.Event.Data)); ... 像是這邊筆者有個 Stream 內含有 100 個相同資料的 Event。
就可以像下面這樣讀取特定範圍的 Event。
using EventStore.ClientAPI; ... using (var conn = EventStoreConnection.Create(connectionString, connectionName)) { conn.ConnectAsync().Wait(); var streamName = "MyStream"; var readEvents = conn.ReadStreamEventsForwardAsync(streamName, 10, 10, true).
read morePosts
Event Store - Appending to a stream in a single write with .NET API
要使用 Event Store .NET API 發送 Event 給 Event Store,可以先進行 Event Store 的連線。
連線後設定 EventData。
... var typeName = "MyType"; var data = new { Msg="Hello world!" }; var jsonData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data)); var eventData = new EventData(Guid.NewGuid(), typeName, true, jsonData, null); ... 呼叫 Connection.AppendToStreamAsync 將 EventData 送入 Event Store 指定的 Stream (ExpectedVersion 可用來決定是否要判斷 Stream 是否存在)。
... conn.AppendToStreamAsync(streamName, ExpectedVersion.Any, eventData); ... 程式寫起來會像下面這樣:
using EventStore.ClientAPI; using Newtonsoft.Json; using System; using System.Text; ... var connectionName = "MyConsole"; var connectionString = "ConnectTo=tcp://admin:changeit@localhost:1113; HeartBeatTimeout=500"; using (var conn = EventStoreConnection.
read morePosts
Event Store - Connect with .NET API
要使用 Event Store .NET API 連接 Event Store,先要安裝 EventStore.Client 套件。
加入 EventStore.ClientAPI 命名空間。
using EventStore.ClientAPI; 接著調用 EventStoreConnection.Create 取得 Connection 物件。
... using (var conn = EventStoreConnection.Create(...)) { ... } 調用 Connection 物件的 ConnectAsync 方法建立與 EventStore 的連線。
... conn.ConnectAsync(); ... 像是下面這樣,指定 Connection name 與 uri 建立出對應的連線物件,然後進行連線。
var connectionName = "MyConsole"; var uri = new Uri("tcp://admin:changeit@localhost:1113"); using (var conn = EventStoreConnection.Create(uri, connectionName)) { conn.ConnectAsync().Wait(); Console.ReadKey(); } 連線的建立可從 Web interface 的 Dashboard 頁面查閱,像是這邊 Connections 下就有剛所建立的 MyConsole connection。
read morePosts
Event Store - Subscribing to Receive Stream Updates with web interface
要透過 Web interface 去訂閱事件,可切換至 Persistent Subscriptions 頁面,點選 New Subscription 按鈕。
填寫 Group、 Stream…等資訊建立 Subscription。
切回到 Stream Browser 頁面發送 Event, Stream ID 需符合 Subscription 的 Stream 。
再回到 Persistent Subscriptions 頁面,可從 Subscription 的狀態因收到了 Event 而有所變動。
Link Step 2 - Read events from a stream and subscribe to changes | Event Store
read morePosts
Event Store - Streams projection
$streams 是 Event Store 預設提供的 Projection,可以將 Event Link 到一個集中的 Stream。
使用前需先將 $streams projection 開啟。
開啟後切到 Stream Browser 頁面,點選 Add Event 按鈕發送 Event。
這邊可一次發送了多個 Event 做個測試。
發送完切回 Stream Browser 頁面,會看到 $streams projection 會幫我們產生 $streams 這樣的 Stream。
點進去會看到剛所發送的 Event 都被 Link 在這個 Stream 內。
Link System Projections | Event Store
read morePosts
Event Store - By event type projection
$by_event_type 是 Event Store 預設提供的 Projection,可以將 Event 依 Event Type 拆分成到對應的 Stream。
使用前需先將 $by_event_type projection 開啟。
開啟後切到 Stream Browser 頁面,點選 Add Event 按鈕發送 Event。
這邊可一次發送了多個 Event 做個測試。
發送完切回 Stream Browser 頁面,會看到 $by_event_type projection 會幫我們產生 $et-[EventType] 這樣的 Stream。
Link
read morePosts
Event Store - By category projection
$by_category 是 Event Store 預設提供的 Projection,可以將 Event 依 Stream ID 去拆分成不同 Category 的 Stream。
使用前需先將 $by_category projection 開啟。
開啟後切到 Stream Browser 頁面,點選 Add Event 按鈕發送 Event。
Event 的 Stream ID 可依 [Category]-[ID] 這樣的格式下去定義。
這邊可一次發送了多個 Event 做個測試。
發送完切回 Stream Browser 頁面,會看到 $by_category projection 會幫我們產生 $ce-[Category] 這樣的 Stream。
裡面都是相同 Category 的 Event 。
$by_category projection 若有需要也可以做些調動,只要點選 Edit 按鈕。
對 Source 部份做些調動,Source 中的 first 是指第一個分隔符號,- 是指用來分隔的符號,這邊可以試著把 first 改為 last。
按下 Save 按鈕儲存。
$by_category project 就會依最後一個分隔符號下去切割 Category。
read morePosts
Event Store - Read a Stream of Events with HTTP API
要透過 HTTP API 去讀取 Stream 下的所有 Event,可以像下面這樣向 Event Store 查詢。
http://<URL>/streams/<STREAM_ID> Accept 可以指定回傳的格式是 JSON。
application/vnd.eventstore.atom+json 或是 XML。
application/atom+xml 像是如果要讀取 newstream Stream 下的所有 Event,就可以像下面這樣透過 CURL 發送請求給 Event Store。
curl -i -H "Accept:application/vnd.eventstore.atom+json" "http://127.0.0.1:2113/streams/newstream" Link Step 2 - Read events from a stream and subscribe to changes | Event Store
read morePosts
Event Store - Writing events with HTTP API
要透過 HTTP API 去發送 event,可以朝以下位置發送 Post。
http://<URL>/streams/<STREAM_ID> MediaType 可以是 JSON。
application/vnd.eventstore.events+json 也可以是 XML。
application/vnd.eventstore.events+xml Post 的內容需包含 eventId、eventType、data。
像是如果要發送個 Event 給 Event Store,就可以像下面這樣準備要發送的 Event 內容。
[ { "eventId": "fbf4a1a1-b4a3-4dfe-a01f-ec52c34e16e4", "eventType": "event-type", "data": { "a": "1" } } ] 然後使用 CURL 發送給 Event Store。
curl -i -d "@event.json" "http://127.0.0.1:2113/streams/newstream" -H "Content-Type:application/vnd.eventstore.events+json" Event Store 就會接收到剛發送的 Event。
read morePosts
Event Store - Install with docker
要透過 Docker 使用 Event Store,可以調用下列命令:
docker run --name eventstore-node -it -p 2113:2113 -p 1113:1113 eventstore/eventstore Docker 會下載 eventstore-node image。
然後會運行 Event Store 服務。
訪問 http://127.0.0.1:2113 即可看到 Event Store 的 Web 介面,若要登入可用帳號 admin 密碼 changeit 登入。
Link eventstore/eventstore - Docker Hub Step 1 - Install, run, and write your first event | Event Store
read morePosts
Event Store - Writing events with web interface
要透過 Web interface 去發送 event,可以將 Web interface 切換至 Stream Browser 頁面。
點擊 Add Event 按鈕。
填入要發送的 Event 資訊。
按下 Add 按鈕發送設定的 Event。
發送完回到 Stream Broser 頁面,可以看到剛剛所發送的 Event,點選即可查閱。
要查閱更為細部的資訊可點選 Event 後方的 JSON 字樣。
即可看到更為細部的資訊。
也可以透過點選 Event name 字樣。
一樣可看到更為細部的資訊。
read morePosts
Event Store - Install on Windows
要在 Windows 下使用 Event Store,首先需確定環境已安裝:
NET Framework 4.0+ Windows platform SDK with compilers (v7.1) or Visual C++ installed (Only required for a full build) 若環境已備妥,我們可選擇透過 Chocolatey 安裝 eventstore-oss 套件。
choco install eventstore-oss 或是至下載頁下載壓縮檔。
將之解壓縮也可以。
安裝完可調用下列命令將 Event Store 服務啟動。
EventStore.ClusterNode.exe --db ./db --log ./logs 服務啟動後訪問 http://127.0.0.1:2113,沒意外的話可以看到 Event Store 的 Web 介面,若要登入可用帳號 admin 密碼 changeit 登入。
透過這 Web 介面可以觀察到服務的狀況、發送 Event、管理帳號…等。
Link Event Store
read more