什麼是流式 SQL,它有什麼用?

摘要

流式 SQL 是指採用用於編寫數據庫查詢的相同的聲明式 SQL,而在快速變化的數據流上運行。

這很有用,因爲。

SQL 的 "聲明" 性質在解決第二點方面發揮了重要作用,因爲它允許用戶專注於他們想要什麼,而讓底層引擎擔心如何完成。

在現實世界中,流式 SQL 被用來。

什麼是流式 SQL?

讓我們先具體說明一下我們說的流處理和 SQL 是什麼意思。

流(事件流)

流指的是像 Kafka、Kinesis 或 Pulsar 這樣的消息中介,它們將數據作爲事件或消息的連續流來處理。

事件流處理一切,從交易到用戶在網站或移動應用程序上的行動、物聯網傳感器數據、服務器的指標,甚至是傳統數據庫上的活動,都通過 change data capture.

SQL

在流的背景下,SQL 爲用戶提供了一種聲明性語言,用於。

注意:CREATE MATERIALIZED VIEW 命令是流式 SQL 的核心概念。它來自於 databases 來的,在那裏它被用來提前計算視圖,以防數據發生變化。在流媒體中,數據一直在變化,所以查詢在維護成物化視圖時往往更有用。

其他常見的 SQL 動詞如 INSERT、UPDATE 和 DELETE 在流式 SQL 中也有作用,但在這篇文章中,我們將重點討論從流中讀取、連接 / 過濾 / 轉換這些流的核心概念,並使其輸出可查詢或 寫到一個新的流。

流上的 SQL 和數據庫之間的區別

一旦你嘗試在流上使用 SQL,一些關鍵的區別就會變得很明顯。

時間點查詢與連續查詢

在傳統數據庫上運行 SQL 查詢,會從一個時間點上返回一組靜態的結果。

以這個疑問爲例:

SELECT SUM(amount) as total_amount FROM invoices;

當你運行它時,數據庫引擎會掃描在查詢時存在的所有的 Invoices,並返回其金額之和。

使用流式 SQL,你可以運行上面的確切查詢,並得到一個時間點的答案。但是你查詢的是快速變化的數據流,一旦你得到了結果,它們可能就已經過時了。在許多情況下,一個持續更新的查詢(物化視圖)在以下幾個方面更有用,我們將在下面描述。

要把上面的查詢變成一個物化的視圖,你要寫。

CREATE MATERIALIZED VIEW invoice_summary AS

SELECT SUM(amount) as total_amount FROM invoices;

當你第一次創建時,SQL 引擎將處理它所能訪問的整個 Invoice 事件歷史,直到現在,然後隨着新的發票事件的到來繼續更新。

響應時間與滯後

傳統的數據庫有查詢響應時間的概念:你運行一個查詢,在引擎計算結果的過程中會經過一些時間,然後你得到響應。

在流處理中,最初的響應時間只是在你第一次物化一個視圖時的一個因素。但是,如果我們的輸入事件突然激增,在流結果中一定會有某種時間上的懲罰。這種懲罰就是時間滯後:輸出比輸入落後多少時間?

就像傳統數據庫的響應時間一樣,大多數終端用戶不需要考慮流式系統的時滯問題,但知道它的存在有助於以避免問題的方式編寫和使用流式 SQL。

不同的行動爲底層引擎創造工作

在讀取方面,傳統的數據庫引擎一直在閒置,直到它收到一個查詢,然後它計劃和優化它,並開始工作提供結果。一旦它回覆了結果,它就會再次閒置,直到它收到另一個查詢。發送查詢是爲引擎創造工作。

如果你回到上面的物化視圖,來自流的新數據爲引擎創造了工作。在 Materialize 中,這種方法是通過增量計算實現的:更新視圖所做的工作與進來的數據成比例,而不是與查詢的複雜性成比例。我們不需要對數據進行全面的重新掃描來更新結果。

這種模式的轉變使得流式 SQL 最適合於反覆詢問同一問題的查詢(如儀表盤、報告、自動化、大多數應用程序代碼),而不是臨時性的查詢。

爲什麼流式 SQL 是有用的?

  1. 數據最初出現時往往是最有價值的

這有兩個原因,一個很明顯,一個不太明顯。

2.SQL 是一種從流式數據中獲得洞察力的偉大手段

這裏是另一個關於流式事件的物化視圖的例子。

 CREATE MATERIALIZED VIEW experiments AS
   SELECT
     experiment_views.name,
     experiment_views.variant,
     COUNT(DISTINCT(experiment_views.user_id)) as unique_users,
     COUNT(DISTINCT(conversions.user_id)) as unique_conversions
   FROM experiment_views
   LEFT JOIN conversions ON
     conversions.user_id = experiment_views.user_id 
     AND conversions.created_at > experiment_views.created_at
   GROUP BY experiment_views.name, experiment_views.variant;

SQL 有一個額外的好處,那就是它是一種成熟的語言,建立了 30 多年,周圍有一個工具和教育的生態系統。這意味着更多的開發者可以使用流媒體數據,並輕鬆地將其整合到他們的堆棧的其他部分。

流式 SQL 的用例

今天,任何已經在使用像 Kafka 這樣的消息代理的人都可以開始使用流式 SQL,而不需要付出很大努力。在未來,隨着 CDC 軟件的成熟,這一標準將擴展到 "任何擁有數據庫的人"。" 以下是一些使用流式 SQL 的例子。

商業智能和分析

當決定 "什麼是賦予我們的內部團隊從數據中做出智能決策的最佳方式" 時,流式 SQL 是一個需要考慮的選項,它的權衡使它對某些情況比其他情況更好。

在許多情況下,用流式 SQL 完成的主源數據的物化視圖是一個更簡單的 data pipeline. 除了實時數據的好處外,企業使用這種方法還可以迴避以下問題。

微服務

流式 SQL 被用來取代在微服務中做複雜數據協調和轉換的代碼。

像 kafka 這樣的事件流通常已經是微服務架構中的第一等公民。工程師們經常發現自己在構建和維護複雜的應用程序,從 kafka 中消費。例如:從事件日誌中讀取的應用程序,以產生對 SaaS 應用程序的 API 使用的洞察力和測量。

微服務中任何看起來像查詢的組件都可能被流式 SQL 所取代。

實時應用

如果你的應用程序的價值取決於你實時交付更新和數據的能力,流式 SQL 可能是建立一個昂貴或複雜的多組件堆棧的替代方案。

新的能力

總結

Materialize 提供了一個流式 SQL 實現,它在兩個重要方面是獨一無二的。

來源:

https://www.toutiao.com/a7064627902859559461/?log_from=a0ba4eca93df4_1645061477485

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aisXbJgZMJRrb2HdHstDXw