使用 SQL 的方式查詢訊息佇列資料以及踩坑指南

2023-08-31 09:00:29

背景

為了讓業務團隊可以更好的跟蹤自己訊息的生產和消費狀態,需要一個類似於表格檢視的訊息列表,使用者可以直觀的看到傳送的訊息;同時點選詳情後也能查到訊息的整個軌跡。

訊息列表

點選詳情後檢視軌跡

原理介紹

由於 Pulsar 並沒有關係型資料庫中表的概念,所有的資料都是儲存在 Bookkeeper 中,為了模擬使用 SQL 查詢的效果 Pulsar 提供了 Presto (現在已經更名為 Trino)的外掛。

Trino 是一個分散式的 SQL 查詢引擎,它也提供了外掛能力,如果我們想通過 SQL 從自定義資料來源查詢資料時,基於它的 SPI 編寫一個外掛是很方便的。

這樣便可以類似於查詢資料庫一樣查詢 Pulsar 資料:



Pulsar 外掛的執行流程如上圖所示:

  • 啟動的時候通過 Pulsar-Admin 介面獲取一些後設資料,比如 Scheme,topic 分割區資訊等。
  • 然後會建立一個唯讀的 Bookkeeper 使用者端,用於獲取資料。
  • 之後根據 SQL 條件過濾資料即可。

相關程式碼:

使用 Pulsar-SQL

使用起來也很簡單,官方提供了兩個命令:

  • sql-worker: 會啟動一個 trino 伺服器端同時執行了 Pulsar 外掛
  • sql: 就是一個 SQL 命令列終端。

遇到的問題

自己在本地執行的時候自然是沒問題,可是一旦想在生產執行,同時如果你的 Pulsar 叢集是執行再 k8s 環境中時就會碰到一些問題。

無法使用現有 Trino 叢集

首先第一個問題是如果生產環境已經有了一個 Trino 叢集想要複用的時候就會碰到問題,常規流程是將 Pulsar 的外掛複製到 TrinoPlugin 目錄,然後重啟 Trino 後就能使用該外掛。

當然社群也是支援這麼做的:

但是當我將 Pulsar-plugin 複製到 Trino 中執行的時候卻失敗了,整體的流程可以參考這個 issue:
https://github.com/apache/pulsar/discussions/20941

簡單來說 Trino 的官方映象和 pulsar-plugin 並不能相容,這個問題直接影響到我們是否可以在生產環境使用它。

但是手動編譯出來的 Trino 服務和外掛是相容的,可以直接執行。

因此我只能在本地編譯出 Trino 伺服器端和 pulsar-plugin 然後打包成一個映象來執行了,當然這樣的壞處就是無法利用到我們現有的 Trino 叢集,又得重新部署一個了。

流程也比較麻煩:

  • 首先是本地編譯 Pulsar-SQL 模組
  • 將生成物複製到當前目錄
  • 執行 make docker 打出 docker 映象並上傳到私服
  • 再執行 kubectl 將 trino 部署到 k8s 環境中

整個流程做下來加上和社群的溝通,更加確定這個功能應該是很少有人在生產環境使用的,畢竟第一個坑就很麻煩,更別提後續的問題了