資料Redpanda平臺簡介

banq發表於2024-05-19

Redpanda 是一個開源流媒體平臺,旨在快速、可擴充套件且可靠,滿足現代資料密集型應用程式的需求。它提供了與 Apache Kafka 相容的 API,可以輕鬆遷移現有應用程式。本文將探討 RedPanda,瞭解其基礎知識,並演示如何使用 Java 來利用其功能。

Redpanda 是什麼?
Redpanda是一個高效能的流資料平臺,專為儲存和處理實時資料流而設計。它有助於構建事件驅動的架構,其中應用程式透過交換訊息(事件)進行通訊。 Redpanda 將生產者(資料釋出者)與消費者(資料訂閱者)解耦,從而實現非同步通訊和可擴充套件性。

Redpanda的關鍵元件

  • 儲存引擎:Redpanda 採用針對現代硬體最佳化的高效能儲存引擎,實現海量資料的高效儲存和檢索。
  • 流處理:它提供強大的流處理功能,允許使用者使用Kafka Streams或KSQL等框架實時處理和分析資料。
  • 分散式共識:Redpanda 採用名為 Raft 的分散式共識協議,確保叢集中節點之間的強一致性和容錯能力。
  • 與 Kafka 的相容性:Redpanda 完全相容 Apache Kafka 協議,使得 Kafka 使用者可以無縫遷移或與 Redpanda 整合。

Redpanda的特點

  • 簡單性: Redpanda 是輕量級的,不需要外部依賴。它作為單個二進位制檔案執行,簡化了部署和管理。
  • 操作簡單:Redpanda 提供使用者友好的 Web 控制檯和命令列介面 (Redpanda Keeper),用於叢集管理和監控。 Redpanda 還透過其直觀的管理介面和自動化工具簡化了部署和管理,減少了 DevOps 團隊的運營開銷。
  • 高效能:Redpanda 專為高吞吐量和低延遲 而設計,使其適合要求苛刻的實時應用程式,例如實時分析、欺詐檢測和金融交易。
  • 可擴充套件性:它可以輕鬆水平擴充套件,允許使用者無縫擴充套件其叢集以適應不斷增長的工作負載和資料量。
  • 可靠性:憑藉分散式架構和內建容錯機制,Redpanda 即使在節點故障的情況下也能確保資料的永續性和可用性。
  • Kafka API 相容性: Redpanda 由於相容 Kafka API,與現有 Kafka 工具和應用程式無縫整合,使 Kafka 使用者更容易過渡。

安裝與設定
作為設定 RedPanda 的一部分,瞭解broker代理/經紀人的概念至關重要。在 RedPanda 中,代理是負責管理資料流的儲存和處理的基本元件。每個 RedPanda 節點都充當叢集內的代理。

1 broker代理/經紀人
RedPanda 中的經紀人在促進資料生產者和消費者之間的溝通方面發揮著至關重要的作用。它充當中介者,從生產者接收資料,將其持久儲存在磁碟上,並可供消費者使用。此外,代理還處理複製、分割槽和訊息路由等各種任務,以確保系統的容錯性、高可用性和可擴充套件性。

從本質上講,RedPanda 中的代理的功能類似於一個集中式樞紐,負責編排流平臺內的資料流。透過在叢集中的多個代理之間分配資料,RedPanda 確保了針對故障的恢復能力和資源的高效利用。

2 安裝
在繼續之前,請確保Docker已在您的計算機上安裝並執行。

要僅使用一個代理啟動 RedPanda 叢集,最簡單的方法是使用rpk( rpk container start -n 1)。建立此命令列實用程式是為了配置和管理 RedPanda 叢集。

docker-compose.yml我們還可以透過從RedPanda Docs網站下載檔案到本地計算機來啟動 RedPanda 叢集,並使用docker-compose up -d在儲存檔案的目錄中啟動叢集 docker-compose.yml 。

釋出和消費訊息的Java程式
下面是簡單的 Java 程式,演示如何向 Redpanda 主題釋出訊息,然後從中讀取訊息。

1 Java 客戶端設定
我們將使用 Kafka Java 客戶端庫從 Java 應用程式與 RedPanda 進行互動。您可以使用 Maven 或 Gradle 將其新增到您的專案中。以下是 Maven 的依賴項:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>3.7.0</version>
</dependency>

2 使用AdminClient建立主題
除了釋出和使用訊息之外,管理主題是使用 Redpanda 的一個重要方面。 Kafka 客戶端庫提供了一個AdminClient類,允許使用者以程式設計方式建立、刪除和管理主題。

下面是一個示例 Java 程式,演示如何使用AdminClientKafka 客戶端庫中的類建立主題:

public class TopicCreator {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        <font>// Kafka broker address<i>
        String bootstrapServers =
"localhost:9092";
       
// Topic name<i>
        String topicName =
"new-topic";
       
// Number of partitions for the topic<i>
        int numPartitions = 3;
       
// Replication factor for the topic<i>
        short replicationFactor = 1;

       
// Configure AdminClient properties<i>
        Properties properties = new Properties();
        properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);

       
// Create AdminClient<i>
        try (AdminClient adminClient = AdminClient.create(properties)) {
           
// Create a new topic<i>
            NewTopic newTopic = new NewTopic(topicName, numPartitions, replicationFactor);
            adminClient.createTopics(Collections.singletonList(newTopic)).all().get();
            System.out.println(
"Topic created successfully: " + topicName);
        } catch (Exception e) {
            System.err.println(
"Error creating topic: " + e.getMessage());
        }
    }
}

在這個程式中:

  • localhost:9092是 Redpanda 經紀人的地址。
  • AdminClient是使用提供的配置屬性建立的。
  • NewTopic使用指定的主題名稱、分割槽數和複製因子來例項化物件。
  • createTopics呼叫的方法來AdminClient建立主題。

3 向 Redpanda Topic 釋出訊息(Producer 示例)
以下程式碼演示瞭如何建立生產者並向 RedPanda 中的主題傳送訊息:

public class RedpandaProducer {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        <font>// Redpanda broker address<i>
        String bootstrapServers =
"localhost:9092";
       
// Topic name<i>
        String topic =
"new-topic";

       
// Configure producer properties<i>
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

       
// Create KafkaProducer<i>
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);


       
// Publish messages to the topic<i>
        for (int i = 0; i < 10; i++) {
            ProducerRecord<String, String> record = new ProducerRecord<>(topic,
"Message " + i);
            producer.send(record).get();
        }

       
// Close the producer<i>
        producer.close();
    }
}

此程式碼定義了一個名為 的 Java 類RedpandaProducer,它充當 Kafka 生產者,用於將訊息釋出到 Redpanda 主題。我們來分解並解釋一下程式碼塊:

配置:用於配置生產者的屬性是使用Properties物件設定的。關鍵配置包括:

  • BOOTSTRAP_SERVERS_CONFIG:指定用於建立與 Redpanda 的初始連線的主機/埠對列表。在本例中,它設定為localhost:9092。
  • KEY_SERIALIZER_CLASS_CONFIGand VALUE_SERIALIZER_CLASS_CONFIG:指定鍵和值的序列化器類。在這裡,兩者都設定為,StringSerializer因為我們正在處理字串。

生產者初始化KafkaProducer:使用配置的屬性建立的例項。

訊息釋出:在迴圈內,生產者將訊息釋出到指定主題。該迴圈進行迭代,並且對於每次迭代,ProducerRecord都會使用主題名稱和訊息建立一個新的迭代。該producer.send(record)方法將記錄非同步傳送到主題。

4 讀取Redpanda主題訊息(消費者示例)
以下是如何使用 RedPanda Java 客戶端使用主題中的訊息:

public class RedpandaConsumer {

    public static void main(String[] args) {
        String bootstrapServers = <font>"localhost:9092"; // Redpanda broker address<i>
        String topic =
"new-topic"; // Topic name<i>

       
// Configure the consumer<i>
        Properties props = new Properties();
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
"earliest");
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.GROUP_ID_CONFIG,
"consumer-group");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);

       
// Subscribe to the topic<i>
        consumer.subscribe(Collections.singletonList(topic));

       
// Poll for new messages<i>
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(
"Received message: " + record.value());
            }
        }
    }
}

此程式碼定義了一個名為 的 Java 類RedpandaConsumer,它充當 Kafka 使用者,用於從 Redpanda 主題讀取訊息。以下是程式碼的細分:

配置:用於配置消費者的屬性是使用Properties物件設定的。關鍵配置包括:

  • AUTO_OFFSET_RESET_CONFIG:在這裡,它設定為“最早”,這意味著消費者將從最早的可用偏移量開始讀取。
  • BOOTSTRAP_SERVERS_CONFIG:指定用於建立與 Redpanda 的初始連線的主機/埠對列表。在本例中,它設定為localhost:9092。
  • GROUP_ID_CONFIG:指定消費者組id。組中的每個消費者必須有一個唯一的組 ID。這裡,它被設定為“ consumer-group ”。
  • KEY_DESERIALIZER_CLASS_CONFIGand VALUE_DESERIALIZER_CLASS_CONFIG:指定鍵和值的反序列化器類。在這裡,兩者都設定為,StringDeserializer因為我們正在處理字串。

消費者初始化KafkaConsumer:使用配置的屬性建立例項。

主題訂閱:消費者使用 訂閱指定的主題consumer.subscribe(Collections.singletonList(topic))。

訊息消費:在連續while迴圈內,消費者輪詢來自訂閱主題的新訊息。它用於consumer.poll(Duration.ofMillis(100))獲取記錄,其中Duration.ofMillis(100)指定如果沒有立即可用的記錄,則等待記錄的最長時間。一旦檢索到記錄,使用者就會迭代它們,將每條訊息的值列印到控制檯。

RedPanda 的一些常見用例

  • 實時分析:Redpanda 可以為實時分析平臺提供支援,使組織能夠從物聯網裝置、感測器和應用程式日誌等流資料來源中獲得可操作的見解。
  • 日誌聚合:Redpanda可以作為集中式日誌聚合平臺,收集和儲存來自分散式應用程式和系統的日誌,以進行監控、故障排除和分析。
  • 微服務通訊:Redpanda 促進現代雲原生架構中微服務之間的事件驅動通訊,從而實現服務的無縫整合和解耦。

相關文章