Prisma Pulse 讓您輕鬆建構事件驅動的應用程式,讓您可以對資料庫中的變更做出反應。 歸功於其新的事件持久性功能,現在保證所有資料庫變更事件都將 至少一次 且 依正確順序 交付!
如果您想親自試用 Prisma Pulse,請直接跳到範例專案:即時聊天、即時排行榜、傳送 新使用者入門電子郵件 的伺服器,以及將資料同步到搜尋索引的 無伺服器排程任務!
事件驅動架構實現可擴展性和即時性
建構具有即時功能(如 聊天、通知、即時協作、投票 或 測驗)的穩健且可擴展的應用程式可能很複雜。 輪詢資料庫以查找變更不僅消耗大量資源,而且在建構更進階的場景時,也會很快變得複雜。
我們希望透過 Prisma Pulse 讓這一切變得簡單,讓您可以將資料庫整合到事件驅動架構中!
什麼是事件驅動架構?
事件驅動架構有助於以 穩健 且 可擴展 的方式建構即時應用程式! 與輪詢等其他方法相比,它們還可以節省資源。 輪詢會消耗大量的資料庫連線和 CPU,無論是在您的應用程式伺服器還是在資料庫伺服器上
另一方面,在事件驅動架構中,事件會在事件發生時立即交付給消費者
在事件驅動架構中,您通常至少有兩個組件
- 事件生產者 負責 發布 事件並將其交付給消費者。
- 事件消費者 訂閱 事件,並在生產者發布事件後接收它們。
在上圖中,資料庫 是事件生產者,而 應用程式伺服器 是事件消費者。
使用 Prisma Pulse 輕鬆串流資料庫的變更事件
Prisma Pulse 透過讓您輕鬆地將資料庫中發生的所有變更串流到您的應用程式中,從而實現事件驅動架構。
Pulse 使用 變更資料擷取 (CDC) 來擷取資料庫中發生的 寫入 事件(表示任何 建立、更新、刪除 操作),方法是監控資料庫的交易日誌,例如 PostgreSQL 中的 預寫式日誌。
具有 至少一次 語意的交付保證 🎉
假設您正在建構健康監測應用程式,並且您使用事件驅動架構在緊急情況下向使用者交付通知。 在這些和許多其他情境中,您的應用程式不能承受遺失任何事件,因為這可能會對您的業務產生嚴重影響 — 甚至更糟,對個人的健康產生影響!
注意: Prisma Pulse 需要啟用邏輯複寫的 PostreSQL 資料庫(> v12)。 如果您希望看到對其他資料庫的支援,請告訴我們。
事件驅動架構中的交付保證是什麼?
為了確保您的事件實際到達消費者端,您需要了解事件驅動架構的 交付語意。 交付語意定義了您的系統可以為事件交付提供的 保證
- 最多一次:事件交付一次或完全不交付。
- 至少一次:事件交付一次或多次,確保它永遠不會未交付。
- 恰好一次:事件恰好交付一次,避免重複。
交付保證的另一個維度是事件到達消費者的 順序。 一般來說,有兩種不同的選項
- 事件以 與生產者發出時相同的順序 交付。
- 事件可以以與生產者發出時相同或 不同的順序 交付。
Prisma Pulse 中的 至少一次 和 相同順序 交付
截至今日,Prisma Pulse 支援至少一次交付,且順序相同,因此可以保證您永遠不會遺失任何資料庫事件。
在底層,Pulse 現在能夠 持久化儲存事件,這些事件是由您的資料庫產生的,從而實現了新的交付保證。
注意: 事件持久性在我們所有的方案中都可用,包括免費限制,讓您可以試用
stream()
。 請造訪定價頁面以找到適合您的方案,並了解有關資料庫事件、事件讀取和事件儲存成本的更多資訊。
若要使用 Prisma Pulse 的新交付保證,您需要
-
在在主控台中設定 Pulse 時,請確保 事件持久性 已啟用
-
使用 Pulse 擴充功能提供的新
.stream()
APIstream()
方法會傳回一個 非同步可迭代物件,它將接收資料庫中發生的每個寫入操作的事件。 您可以如下使用它每當
User
表格上發生變更時,console.log
陳述式都會執行。 以下是更新記錄時將列印的範例終端機輸出
注意: 先前的
.subscribe()
API 仍然存在,但不與事件持久性相容,因此不提供任何交付保證。 如果您今天正在使用.subscribe()
,但想要利用交付保證,則需要在 Platform 專案中重新啟用 Prisma Pulse,更新 Pulse 的 Client 擴充功能以使用最新版本,並調整您的程式碼以使用.stream()
。
Prisma Pulse 中的 恰好一次 交付
雖然 Pulse 預設提供「至少一次」語意,但它也為您提供了 基本元件,讓您可以自己實作「恰好一次」交付保證!
Prisma Pulse 產生的每個事件都攜帶一個識別碼/等冪鍵(您可以透過 id
欄位存取)。 此金鑰可用於在事件的下游處理期間進行重複資料刪除。 最好的實作方式是將 id
傳遞給支援 等冪性 的外部服務,或在使用資料庫時使用 upsert 等概念。
永遠不會遺失任何事件 — 即使您的伺服器當機
如果您使用新的 .stream()
API,Pulse 保證所有資料庫事件都將至少一次依正確順序到達您的應用程式。
但是,如果您的伺服器當機了會怎樣? 您會遺失這段時間資料庫中發生的事件嗎?
您不必這樣做:新的 .stream()
API 讓您可以透過為其提供 name
引數來「從上次中斷的地方繼續」
每當您提供 name
時,Pulse 都會將游標與該特定串流關聯,以追蹤哪些事件已到達消費者端。
如果您的伺服器(在本情境中為消費者)當機,則這段時間資料庫中發生的任何事件都不會被消費者確認,並且游標也不會移動。
一旦您的伺服器恢復連線,串流就會再次啟動,並交付這段時間錯過的所有事件。 串流從中斷點 恢復

如果您省略 name
選項,您的串流將不會「重新播放」伺服器當機時遺失的任何事件

搭配 Prisma Pulse 使用無伺服器的理由
Prisma Pulse 的一個主要用例是建構 即時 應用程式。 如果您希望資料庫事件即時交付到您的應用程式,則需要一個 長時間運行的伺服器,Prisma Client 在其上呼叫 .stream()
API。
但是,憑藉新的交付保證,Prisma Pulse 可以在 無伺服器環境 中用於某些用例。 如果事件 何時 到達並不重要,而重要的是事件最終 會到達,那麼具有交付保證的 Prisma Pulse 將滿足您的需求。
假設您正在建構電子商務應用程式,並且需要將您的產品資料同步到輔助資料儲存區(例如搜尋索引):您可以設定無伺服器函數中的排程任務,每小時執行一次,而不是使用不斷運行的長時間運行的伺服器(從而消耗您需要付費的資源)。 如果您使用新的 .stream()
API 並帶有 name
引數,則排程任務下次執行之前一小時內發生的所有事件都將由 Pulse「重新播放」

查看用例和範例專案
為了讓您輕鬆試用 Prisma Pulse,我們為您建立了一些 範例專案。
即時排行榜
這個即時排行榜範例示範了如何使用 Prisma Pulse 建構全端應用程式,其中前端會在資料庫變更時即時更新。 它使用以下技術堆疊
- Next.js (前端)搭配 自訂伺服器 (後端)
- React Flip Move 用於動畫化 React 組件
- socket.io 用於用戶端和伺服器之間的 websocket 連線
- Prisma Pulse 用於從資料庫取得即時更新
- PostgreSQL 作為資料庫
您可以依照下列步驟使用範例
-
執行以下命令
-
依照 README 中的步驟操作。 請注意,您需要使用 支援 Pulse 的資料庫,並在 Platform Console 中產生 Pulse API 金鑰,才能使其運作。
更多範例
查看 prisma-examples
儲存庫,以取得更多 Prisma Pulse 範例,例如
- 即時聊天:使用 Next.js、Express 和 socket.io 的全端聊天應用程式
- 入門電子郵件:使用 Resend 向新使用者傳送入門電子郵件的伺服器
- 同步排程任務:將資料同步到 Typesense 以啟用產品搜尋的無伺服器排程任務
試用並分享您的意見回饋 💚
我們對 Prisma Pulse 中的新交付保證感到非常興奮! 它們不僅讓您確信您永遠不會遺失資料庫中發生的任何事件,而且還實現了全新的用例,例如在無伺服器環境中使用 Pulse(因為事件可以在函數衍生時「恢復」)。
試用 並告訴我們您對 Prisma Pulse 新增功能的看法。 如果您遇到困難或不確定從哪裡開始,您可以隨時在 X 或 Discord 上與我們聯繫。
不要錯過下一篇文章!
註冊 Prisma 電子報