跳到主要內容

資料庫事件

結構

資料庫變更事件的結構取決於模型和執行的操作類型。您可以在 API 參考中了解更多資訊。

以下範例基於此 User 模型

model User {
id Int @id @default(autoincrement())
name String?
email String @unique
}

所有事件都有以下共同的欄位

  • id:唯一識別碼
  • action:執行的事件類型,以下其中一種:createupdatedelete

根據事件的類型,透過 Prisma Pulse 收到的事件物件中可能會有其他欄位。請參閱以下章節以查看一些範例事件。

建立事件

以下是當新記錄建立時,您可能會收到的事件物件範例

{
action: 'create',
created: { id: 3, email: 'jane@prisma.io', name: 'Jane Doe' },
id: '0/2A5A590'
}

更新事件

以下是當記錄更新時,您可能會收到的事件物件範例

{
action: 'update',
after: { id: 2, email: 'jane@prisma.io', name: 'Jane Doe' },
before: null,
id: '0/2A5A248'
}

如果您希望 before 欄位攜帶記錄在更新之前的數值,您需要將 REPLICA IDENTITY 設定為 FULL,如此處所述。在這種情況下,事件物件可能如下所示

{
action: 'update',
after: { id: 2, email: 'jane@prisma.io', name: 'Jane Doe' },
before: { id: 2, email: 'jane@prisma.io', name: 'Jane' },
id: '0/2A5A248'
}

刪除事件

以下是當記錄刪除時,您可能會收到的事件物件範例

 {
action: 'delete',
deleted: { id: 1 },
id: '0/2A5A398'
}

如果您希望 deleted 欄位攜帶已刪除記錄的數值,您需要將 REPLICA IDENTITY 設定為 FULL,如此處所述。否則,它只會攜帶記錄的 id 值。在這種情況下,事件物件可能如下所示

 {
action: 'delete',
deleted: { id: 21, email: 'jane@prisma.io', name: 'Jane Doe' },
id: '0/2A5A398'
}

傳遞語意

本節概述 Prisma Pulse 的事件傳遞語意。

什麼是事件傳遞語意?

事件傳遞語意描述事件生產者可以針對事件驅動架構中事件傳遞提供的保證

一般來說,有三種傳遞保證

  • 至多一次:事件傳遞一次或完全不傳遞。
  • 至少一次:事件傳遞一次或多次,確保永遠不會遺失傳遞。
  • 恰好一次:事件精確傳遞一次,避免重複。

Prisma Pulse 中的事件傳遞語意

以下是 Prisma Pulse 中事件傳遞語意的摘要

stream()subscribe()
需要事件持久性
傳遞保證至少一次至多一次
事件順序與事件產生順序相同可能與事件產生順序不同
可以「重播」錯過的事件
警告

請注意,如果事件超過您的訂閱方案大小限制,事件將被拒絕,並且不會傳送到您的應用程式。

stream()

當使用 stream() 時,Prisma Pulse 提供以下傳遞保證

至少一次傳遞

當使用 stream() 串流資料庫變更事件時,保證資料庫變更事件將以至少一次語意傳遞,這表示 Prisma Pulse 可以保證資料庫中發生的任何事件都將傳遞一次或多次。

依正確順序傳遞事件

Prisma Pulse 進一步保證以事件產生的順序傳遞資料庫變更事件。

恰好一次傳遞

雖然 Pulse 預設提供至少一次語意,但它也提供基本元件,讓您可以自己實作恰好一次傳遞保證!

Prisma Pulse 產生的每個事件都帶有一個識別碼/等冪金鑰,您可以使用它在事件的下游處理期間進行重複資料刪除。最好的實作方式是將識別碼傳遞給支援等冪性的外部服務,或在使用資料庫時使用類似 upsert 的概念。

User 模型的事件酬載中的 id 欄位代表識別碼/等冪金鑰

{
action: 'update',
after: { id: 1, name: 'Jane', email: "doe@prisma.io" },
before: null,
id: '01HYBEER1JPSBVPG2NQADNQTA6'
}

subscribe()

至多一次傳遞

當使用 .subscribe() 串流資料庫變更事件時,保證資料庫變更事件將以至多一次語意傳遞,這表示某些資料庫事件可能會遺失。

不保證事件的順序

subscribe() 不保證事件到達的順序。

事件持久性

您可以在您的 Console 專案中為 Pulse 設定事件持久性。只有啟用事件持久性,您才能透過 stream() API 利用 Prisma Pulse 的至少一次正確順序傳遞保證。

哪些事件會被持久化?

一旦您在 Console 專案中為 Pulse 啟用事件持久性,Pulse 將儲存來自所有表格所有資料庫事件。

事件以何種形式持久化?

事件以與傳遞的結構相同的形式持久化。

事件持久性如何影響定價?

啟用事件持久性後,定價會受到以下影響

  • 資料庫事件:Pulse 擷取的資料庫事件數量
  • 事件讀取:Pulse 透過 .stream() 讀取傳遞的資料庫事件數量
  • 事件儲存:儲存的事件消耗的磁碟空間量 (以 GiB 為單位)

有關更多詳細資訊,請參閱訂閱方案。無論您使用 subscribe()stream(),定價都適用。

恢復事件串流

stream() API 提供提供 name 引數的選項,這會使串流可恢復

const stream = await prisma.user.stream({
name: "all-user-events"
})

如果提供了 name,Pulse 會使用游標追蹤事件的傳遞。只有在接收端確認事件後,與該 name 關聯的游標才會移動。

如果串流由於某些原因而無法使用,例如,因為您的伺服器已關閉,則接收器無法確認任何事件。一旦串流再次可用,串流將從最後一個游標位置恢復,並傳遞在此期間未確認的任何事件

Resuming event streams with a name argument

如果省略了 name 選項,則不會有游標與串流關聯,並且當串流關閉時發生的事件將不會傳遞

Resuming event streams without a name argument

請注意,如果提供了 name,則在任何給定時間,只能有一個用戶端連線到具有該特定 name 的串流。