譯文|藉助 Pulsar Functions 遷移到無服務應用程式

ApachePulsar 發表於 2022-01-27

本文作者是 Axel Sirota,譯者為 StreamNative 的劉昱、Jennifer、Sijia。

原文連結 https://streamnative.io/en/bl...

關於 Apache Pulsar

Apache Pulsar 是 Apache 軟體基金會頂級專案,是下一代雲原生分散式訊息流平臺,集訊息、儲存、輕量化函式式計算為一體,採用計算與儲存分離架構設計,支援多租戶、持久化儲存、多機房跨區域資料複製,具有強一致性、高吞吐、低延時及高可擴充套件性等流資料儲存特性。 
GitHub 地址:http://github.com/apache/pulsar/

Pulsar 2.0 版本引入 Pulsar Functions。Pulsar Functions 支援使用者輕鬆地平滑遷移到無服務應用程式。本文主要介紹 Pulsar Functions 的基本資訊以及如何開發 Pulsar Functions。此外,本文還列舉了將應用程式遷移到 Pulsar Functions 時的一些注意事項。

簡單場景

假設有這樣一個使用場景:我們運營一家電子商務公司,公司主要業務是處理支付發票。在 Pulsar 中,這一業務包含以下三步:

  • 將發票匯入到訂單 topic;
  • 執行程式碼,以逗號分隔發票值;
  • 將發票值寫入 PostgreSQL。

本文主要介紹第二步。一般來說,我們執行的程式碼可能是在 AWS Lambda 中建立的無服務 function,也可能是成熟的微服務。這種方法有很多缺點。

首先,我們為一段簡短程式碼開發全面服務。由於開發工作比較複雜,所以完全實現可能需要兩週時間。

其次,由於源資料 schema 一直在變,維護工作也會越來越難。我們需要對服務和基礎 PostgreSQL 表進行完整的版本控制和重新部署,而這一項工作可能需要至少一天時間。

此外,在連線或斷開 Pulsar 時,AWS Lambda function 需要進行身份驗證。Pulsar 先呼叫 Lambda function,然後由 Lambda function 自身向 Pulsar 驗證身份。由於 Lambda function 引入了非必要的訊息雙向傳遞,因此會影響效能。

引入 Pulsar Functions

Pulsar Functions 是輕量級計算框架,用於處理 topic 之間的資料。Pulsar Functions 在 Pulsar 中執行,因此無需單獨部署微服務,節省時間,簡化排錯。

Pulsar Functions 的複雜性比較靈活。Pulsar Functions 不僅支援從一個 topic 轉換/移動資料到另一個 topic,還支援傳送資料到多個 topic、進行復雜的路由選擇和批處理請求等。

Pulsar Functions 易於除錯,支援在除錯模式下部署 function,即可以在連線到程式碼並實時執行時進行除錯。

開發 Pulsar Functions

使用熟悉的程式語言建立 Pulsar Function 和實現 Pulsar Functions 子類一樣簡單。下面的程式碼使用 Java 語言編寫,Pulsar 也支援 Python 和 Go 語言。

public class SplitFunction implements Function<String, List<String>> {
   @Override
   public List<String> apply(String input) {
       return Arrays.asList(input.split(","));
   }
}

編譯並打包程式碼後,通過 functions create 命令將 function 部署到 Pulsar 例項中。這一命令的引數為打包的程式碼和 function 的 input/output topic。

bin/pulsar-admin functions create --jar target/split.jar --classname demo.SplitFunction --input input-topic --output output-topic

開發和部署自定義 Pulsar Function 最多需要兩天時間。部署完成後,Pulsar Functions 可以為使用者極大簡化工作量,縮短產品釋出時間。Pulsar 支援使用者部署任意數量的 Pulsar Function,用於從 topic 獲取資料併傳送到其他 topic,還可以輕鬆地將狀態訊息寫入 Pulsar 日誌。Pulsar Functions 不僅簡化了 Pulsar 的部署流程,增強了 Pulsar 的靈活性,還擴充了 Pulsar 的功能。

開發完整的 Pulsar Functions

如何充分利用 Pulsar Functions 豐富的特性?

開發完整的 Pulsar Function 和在類中實現 Function 介面一樣簡單。首先實現 process() 方法,process() 方法提供的語義物件即為連線到 Pulsar 的閘道器。通過語義物件,我們可以訪問記錄器、追蹤輸出、向 topic 傳送訊息等。

使用 Pulsar Functions 獲取輸入資料並提取發票價格的示例程式碼如下。我們可以使用語義物件傳送這些資料到另一個 output topic(如想在部署 Function 時傳送資料到指定的 output topic,只需將其作為 Function 的返回值返回。本示例通過傳送資料到另一個 topic 展示如何使用 Pulsar Functions 進行路由,並從 Function 返回 null。)

import org.apache.pulsar.functions.api.Function;
public class RoutingFunction implements Function<String, Void> {
   @Override
   public Void process(String input, Context context) throws Exception {
       Logger LOG = context.getLogger();
       LOG.info(String.format("Got this input: %s", input));
       Price inputPrice  = new Price(input);
       String topic = String.format("year-%s", inputPrice.getYear());
       context.newOutputMessage(topic, Schema.STRING).value(inputPrice.getPrice()).send();
       // We could also return some object here and it would be sent to the
       // output topic set during function submission
       return null;   
   }
}

比 AWS Lambda 成本低

既然 AWS Lambda 可以實現我們的需求,為什麼我們決定改用 Pulsar Functions?相比於 AWS Lambda,Pulsar Functions 具有一系列優勢,易於除錯、移除了 Pulsar 和 Lambda 之間的雙向身份驗證等。

下面我們通過一個常見的使用場景來對比一下使用 AWS Lambda 和 Pulsar Functions 的成本。假設某線上拍賣的實時競價系統中,每秒競價 1 萬次(每月 260 億請求),僅考慮請求費用,不考慮計算時間,成本為 5000 美元。假設每個請求需要 100 毫秒和 2048 GB 的虛擬機器,則計算成本為 8.6 萬美元。這還不包括 AWS 傳輸資料的費用!

AWS Lambda 是用於無服務 functions 的極佳選擇,但只適合用於小規模使用場景。使用 Lambda 處理數十億筆交易的資料管道開銷高昂。

使用 Pulsar Functions 可以極大地節省成本。我剛加入 JAMPP 時,JAMPP 團隊只使用 Lambda,一小部分資料管道的成本為每月 3 萬餘美元。當我們從 AWS Lambda 遷移到 Pulsar Functions 後,成本下降到每月幾百美元,而這部分支出主要用於在 Amazon EC2 例項上託管 Pulsar。

遷移到 Pulsar Functions

首先看一下使用 Pulsar Functions 的架構。在示例使用場景中,我們在 AWS Lambda 中編寫了一個 Java function 來處理 topic 之間的資料。Pulsar Functions 在這一架構中取代了 Lambda,簡化了開發和部署。

圖片

部署 Pulsar Functions 後,我們需要為資料建立匯入和轉存指令碼。通過 Pulsar IO,使用者可以在 Pulsar 內輕鬆定義外部資料 source/sink,簡化了這一過程。Pulsar IO source/sink 本身也是作為 Pulsar Functions 實現的,也就是說,使用者可以在 Pulsar 中建立自定義 source/sink,簡化除錯操作。

遷移到 Pulsar Functions 共需三步:

  • 遷移所有處理邏輯到一個或多個 Pulsar Functions
  • 轉換 IO 邏輯(使用 Pulsar IO source/sink)
  • 使用日誌 topic 處理日誌資料

僅需三步就可以完全遷移到在 Pulsar 中執行的無服務應用程式。

如果使用者目前使用的訊息系統是 Kafka,該怎麼辦?不必擔心,無需編寫程式碼,使用 Kafka-on-Pulsar 即可從 Kafka 平滑遷移到 Pulsar。

結語

本文簡要介紹瞭如何使用 Pulsar Functions。除了文中討論的特性以外,Pulsar Functions 正在新增更多令人眼前一亮的特性。比如,StreamNative 最近宣佈釋出 Pulsar Function Mesh,支援以協調方式部署 Pulsar Function 服務叢集。

本文主要介紹瞭如何開發 Pulsar Functions,如何將應用程式遷移到在 Pulsar 上執行的無服務應用程式,以及 Pulsar Functions 的易用性與靈活性。

預祝遷移順利!

相關閱讀

譯文|藉助 Pulsar Functions 遷移到無服務應用程式

點選“ 閱讀原文 ”,獲取 Apache Pulsar 硬核乾貨資料!