Kafka 消息模式實戰:從簡單隊列到流處理(一)

一、Kafka 簡介

**

Kafka 是一種分布式的、基于發布 / 訂閱的消息系統,由 LinkedIn 公司開發,并于 2011 年開源,后來成為 Apache 基金會的頂級項目。它最初的設計目標是處理 LinkedIn 公司的海量數據,如用戶活動跟蹤、消息傳遞和日志聚合等場景。隨著時間的推移,Kafka 憑借其卓越的性能和強大的功能,逐漸成為大數據和實時數據處理領域的首選工具。

1.1 Kafka 的特性

  • 高吞吐量:Kafka 采用了高效的磁盤 I/O 和批量處理機制,能夠在普通硬件上實現每秒數百萬的消息處理能力,輕松應對海量數據的傳輸和處理需求。例如,在電商平臺的訂單處理場景中,Kafka 可以快速處理大量的訂單消息,確保訂單數據的及時流轉和處理。
  • 可擴展性:Kafka 集群可以通過添加更多的節點(Broker)來實現水平擴展,從而應對不斷增長的數據量和吞吐量需求。這種靈活的擴展方式使得 Kafka 能夠適應不同規模的應用場景,從小型項目到大型企業級系統都能游刃有余。
  • 持久性:Kafka 將消息持久化存儲在磁盤上,并通過副本機制來確保數據的可靠性。即使部分節點發生故障,數據也不會丟失,因為 Kafka 會自動將消息復制到其他可用的節點上。以金融交易系統為例,Kafka 可以可靠地存儲交易記錄,保證數據的完整性和安全性。
  • 低延遲:Kafka 在設計上注重低延遲,能夠快速地處理和傳遞消息,滿足實時數據處理的需求。在實時監控系統中,Kafka 可以實時接收和處理傳感器數據,及時發出警報,以便管理員能夠及時采取措施。
  • 分布式架構:Kafka 的分布式架構使得它能夠在多個節點之間進行數據分區和負載均衡,提高系統的整體性能和可用性。同時,Kafka 還支持跨數據中心的部署,為全球化的應用提供了強大的支持。

1.2 Kafka 的應用場景

  • 日志收集與管理:Kafka 可以作為一個集中式的日志聚合平臺,收集和管理來自不同系統和服務的日志數據。這些日志數據可以用于故障排查、性能分析、安全審計等。以大型互聯網公司為例,每天都會產生海量的日志數據,如用戶的訪問記錄、系統操作日志等。Kafka 可以高效地收集這些日志,將不同來源、不同格式的日志數據匯聚到一起,再統一傳輸給后續的處理系統,比如 Hadoop、Elasticsearch 等,為數據分析和故障排查提供堅實的數據基礎。
  • 消息隊列:Kafka 可以作為一個高性能的消息隊列,用于解耦應用程序的不同組件,實現異步通信和流量控制。在電商系統中,訂單處理、庫存管理、支付系統等組件之間可以通過 Kafka 進行消息傳遞,從而提高系統的靈活性和可擴展性。
  • 用戶行為分析:Kafka 可以實時收集和處理用戶在網站或移動應用上的各種行為數據,如點擊、瀏覽、購買等,幫助企業深入了解用戶需求和行為模式,實現精準營銷和個性化推薦。以短視頻平臺為例,通過 Kafka 收集用戶的點贊、評論、轉發等行為數據,平臺可以分析出用戶的興趣偏好,為用戶推薦更符合其口味的視頻內容,提高用戶的粘性和活躍度。
  • 實時數據處理與流計算:Kafka 與流計算框架(如 Apache Flink、Apache Storm 等)結合,可以實現對實時數據流的處理和分析,用于實時報表、實時監控、欺詐檢測等場景。在金融領域,Kafka 可以用于實時處理交易數據,實現風險監控和交易決策;在物聯網領域,Kafka 能夠處理海量的設備傳感器數據,為智能設備的管理和優化提供支持。

二、Kafka 核心概念

在深入了解 Kafka 的消息模式實戰之前,我們先來熟悉一下 Kafka 的核心概念。這些概念是理解 Kafka 工作原理和應用場景的基礎,對于我們后續的實戰操作至關重要。

2.1 主題(Topic)

主題是消息的邏輯分類,就像是數據庫中的表名,用于標識一類相關的消息。生產者將消息發送到特定的主題,消費者則從感興趣的主題中訂閱并獲取消息。例如,在一個電商系統中,我們可以創建 “訂單”“庫存”“物流” 等主題,分別用于存儲和處理相關的業務消息。每個主題都可以有多個生產者和消費者,生產者無需關心消費者的存在,它們只負責將消息發送到指定的主題即可,這種解耦的設計使得系統具有更高的靈活性和可擴展性。

2.2 生產者(Producer)

生產者負責向 Kafka 集群發送消息。在發送消息時,生產者首先會將消息封裝成 ProducerRecord 對象,然后經過序列化器將其轉換為字節數組,以便在網絡中傳輸。接著,消息會通過分區器確定要發送到主題的哪個分區。如果沒有指定分區,分區器會根據消息的鍵(Key)或采用輪詢(Round - Robin)算法來選擇分區 。最后,消息會被發送到 Kafka 集群中的相應分區。

生產者的關鍵配置參數包括:

  • bootstrap.servers:指定 Kafka 集群的地址列表,生產者通過這些地址與集群建立連接。例如 “hadoop102:9092,hadoop103:9092”。
  • key.serializervalue.serializer:指定消息的鍵和值的序列化器,用于將消息轉換為字節數組。常見的序列化器有 StringSerializer、ByteArraySerializer 等。
  • acks:指定生產者在發送消息后等待的確認級別。acks=0 表示生產者發送消息后不等待任何確認;acks=1 表示生產者等待分區的領導者(Leader)副本確認消息已寫入;acks=-1 或 acks=all 表示生產者等待分區的所有同步副本(ISR)確認消息已寫入 ,這提供了最高的數據可靠性,但也會增加消息發送的延遲。
  • retries:當消息發送失敗時,生產者重試的次數。默認情況下,生產者會在每次重試之間等待一段時間(由 retry.backoff.ms 參數指定),以避免無效的頻繁重試。
  • batch.size:生產者將消息批量發送時,每個批次的最大大小(以字節為單位)。當批次達到這個大小時,生產者會將其發送到 Kafka 集群。適當增加 batch.size 可以提高吞吐量,但也會增加消息的延遲。
  • linger.ms:生產者在發送批次之前等待更多消息加入批次的時間(以毫秒為單位)。如果設置為非零值,生產者會在 linger.ms 時間內等待更多消息,以便將它們合并成一個批次發送,從而提高傳輸效率。例如,將 linger.ms 設置為 5,表示生產者最多等待 5 毫秒,即使批次未達到 batch.size,也會發送消息。

2.3 消費者(Consumer)

消費者從 Kafka 集群拉取消息。消費者通過訂閱主題來接收感興趣的消息。Kafka 支持兩種消費模式:單消費者模式和消費者組模式。在單消費者模式下,一個消費者消費主題的所有分區;在消費者組模式下,一個消費者組內的多個消費者共同消費主題的所有分區,每個分區只能被組內的一個消費者消費 ,這樣可以實現消息的并行消費,提高消費效率。

消費者組是 Kafka 實現消息廣播和單播的關鍵機制。如果所有消費者都屬于同一個消費者組,那么消息會被均衡地分發給組內的各個消費者,實現單播;如果每個消費者都屬于不同的消費者組,那么消息會被廣播給所有消費者。

消費者消費消息的方式是通過拉取(Poll)操作。消費者定期調用 poll 方法從 Kafka 集群獲取消息,每次調用會返回一批消息。消費者在處理完消息后,需要提交消費位移(Offset),表示已經成功消費到了哪個位置。Kafka 提供了自動提交和手動提交兩種方式:自動提交是消費者在一定時間間隔內自動提交消費位移;手動提交則由開發者根據業務邏輯在合適的時機調用 commitSync 或 commitAsync 方法來提交位移,手動提交可以更精確地控制消息的消費進度,避免重復消費或消息丟失。

消費者的關鍵配置參數包括:

  • group.id:指定消費者所屬的消費者組 ID,同一消費者組內的消費者共享消費進度和分區分配。
  • auto.offset.reset:當消費者首次啟動或找不到已提交的消費位移時,指定從哪里開始消費消息。可以設置為 “earliest”(從最早的消息開始消費)、“latest”(從最新的消息開始消費)或 “none”(如果沒有找到已提交的位移,則拋出異常)。
  • enable.auto.commit:控制是否自動提交消費位移。設置為 true 時,消費者會按照 auto.commit.interval.ms 參數指定的時間間隔自動提交位移;設置為 false 時,需要手動調用提交方法。
  • fetch.min.bytes:消費者從 Kafka 集群拉取消息時,期望的最小字節數。如果拉取的消息不足這個數量,Kafka 會等待更多消息到達,直到滿足這個條件或等待超時(由 fetch.max.wait.ms 參數控制)。
  • max.poll.records:每次調用 poll 方法時,消費者最多拉取的消息數量。通過合理設置這個參數,可以控制每次拉取的消息量,避免一次性處理過多消息導致內存溢出或處理時間過長。

2.4 分區(Partition)

分區是主題的物理劃分,每個主題可以包含一個或多個分區。分區的主要作用是提高并發處理能力和實現數據的分布式存儲。當生產者發送消息到主題時,消息會被分配到主題的某個分區中。分區的分配策略可以根據消息的鍵、輪詢算法或自定義策略來確定。例如,如果消息的鍵不為空,Kafka 會根據鍵的哈希值將消息分配到特定的分區,這樣可以保證具有相同鍵的消息總是被發送到同一個分區,從而實現按鍵的有序性。

每個分區在 Kafka 集群中都是一個獨立的日志文件,消息按照順序追加到分區日志中,并且每個消息都有一個唯一的偏移量(Offset),用于標識消息在分區中的位置。消費者通過偏移量來跟蹤自己的消費進度,確保不會重復消費或遺漏消息。

分區的存在使得 Kafka 能夠處理大量的數據,并支持水平擴展。通過增加分區數量,可以提高系統的并發處理能力,因為不同的分區可以被不同的消費者并行消費。同時,分區還可以分布在不同的 Broker 節點上,實現數據的分布式存儲,提高系統的容錯性和可靠性。例如,在一個大規模的日志收集系統中,通過將日志主題劃分為多個分區,并將這些分區分布在多個 Broker 上,可以有效地處理海量的日志數據,并且在某個 Broker 出現故障時,其他 Broker 上的分區仍然可以正常提供服務,保證數據的可用性。

2.5 副本(Replica)

副本用于數據備份,每個分區可以有多個副本,其中一個副本被選舉為領導者(Leader)副本,其他副本為追隨者(Follower)副本。領導者副本負責處理生產者和消費者的讀寫請求,追隨者副本則從領導者副本同步數據,保持與領導者副本的一致性。

當領導者副本發生故障時,Kafka 會從追隨者副本中選舉出一個新的領導者副本,確保服務的連續性和數據的可用性。這種多副本機制大大提高了 Kafka 集群的數據安全性和高可用性,即使部分節點出現故障,數據也不會丟失。

副本的同步機制是基于一種稱為 ISR(In - Sync Replicas)的概念。ISR 是指與領導者副本保持一定程度同步的追隨者副本集合。只有在 ISR 中的副本才被認為是可靠的,當生產者發送消息并等待 acks=-1 或 acks=all 的確認時,Kafka 會等待 ISR 中的所有副本都確認收到消息后才向生產者返回成功響應。如果某個追隨者副本與領導者副本的同步滯后過多,它會被從 ISR 中移除,當它重新追上領導者副本的進度時,會再次被加入到 ISR 中。通過這種機制,Kafka 能夠在保證數據可靠性的同時,提高系統的性能和穩定性。例如,在一個金融交易系統中,Kafka 的副本機制可以確保交易數據的安全存儲,即使某個 Broker 節點出現故障,也不會影響交易的正常進行和數據的完整性。

2.6 Broker

Broker 是 Kafka 集群的服務器節點,每個 Broker 負責存儲和管理一部分主題的分區和副本。當生產者發送消息時,消息會被發送到某個 Broker 上的分區;當消費者拉取消息時,也是從 Broker 上獲取消息。

Broker 在集群中扮演著至關重要的角色,它負責處理生產者和消費者的請求,維護分區和副本的狀態,以及與其他 Broker 進行通信和協調。多個 Broker 組成的集群可以實現高可用性、可擴展性和負載均衡。在集群中,每個 Broker 都有一個唯一的 ID,通過 Zookeeper(Kafka 早期版本依賴 Zookeeper 進行集群管理和協調,新版本也有一些元數據管理依賴 Zookeeper)來管理 Broker 的注冊、發現和狀態監控。例如,當一個新的 Broker 加入集群時,它會向 Zookeeper 注冊自己的信息,其他 Broker 和客戶端可以通過 Zookeeper 獲取到新 Broker 的地址和狀態,從而實現集群的動態擴展和管理。同時,Kafka 集群會根據各個 Broker 的負載情況,自動將分區和副本分配到不同的 Broker 上,實現負載均衡,提高整個集群的性能和資源利用率。

三、Kafka 簡單隊列實戰

3.1 環境搭建

在開始 Kafka 簡單隊列實戰之前,我們需要先搭建好 Kafka 和 Zookeeper 的運行環境。這里以 Linux 系統為例進行介紹。

步驟一:下載 Kafka 和 Zookeeper 安裝包

你可以從 Apache Kafka 官網(https://kafka.apache.org/downloads)下載最新版本的 Kafka 安裝包,例如kafka_2.13-3.5.1.tgz。Zookeeper 是 Kafka 運行所依賴的分布式協調服務,通常 Kafka 安裝包中會自帶 Zookeeper,無需單獨下載。

步驟二:解壓安裝包

將下載好的 Kafka 安裝包解壓到指定目錄,比如/usr/local/kafka。使用以下命令:

 

tar -zxvf kafka_2.13-3.5.1.tgz -C /usr/local/

mv /usr/local/kafka_2.13-3.5.1 /usr/local/kafka

步驟三:配置環境變量

編輯~/.bashrc文件,添加 Kafka 的安裝目錄到PATH環境變量中:

 

export KAFKA_HOME=/usr/local/kafka

export PATH=$PATH:$KAFKA_HOME/bin

然后執行以下命令使配置生效:

 

source ~/.bashrc

步驟四:啟動 Zookeeper

進入 Kafka 的安裝目錄,執行以下命令啟動 Zookeeper:

 

cd /usr/local/kafka

bin/zookeeper-server-start.sh config/zookeeper.properties

Zookeeper 啟動后,會監聽默認端口 2181,等待 Kafka 集群的連接。

步驟五:啟動 Kafka

在另一個終端窗口中,同樣進入 Kafka 安裝目錄,執行以下命令啟動 Kafka:

 

bin/kafka-server-start.sh config/server.properties

Kafka 啟動后,會監聽默認端口 9092,開始接收生產者和消費者的請求。

3.2 創建主題

主題(Topic)是 Kafka 中消息的邏輯分類,我們可以使用 Kafka 提供的命令行工具來創建主題。

執行以下命令創建一個名為test-topic的主題,指定分區數為 3,副本數為 1:

 

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic test-topic

  • --bootstrap-server:指定 Kafka 集群的地址和端口。
  • --replication-factor:指定每個分區的副本數,這里設置為 1,表示每個分區只有一個副本。
  • --partitions:指定主題的分區數,這里設置為 3,表示主題test-topic將包含 3 個分區。
  • --topic:指定要創建的主題名稱。

創建成功后,你可以使用以下命令查看當前 Kafka 集群中所有的主題:

 

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

如果test-topic主題創建成功,你將在輸出中看到該主題的名稱。

3.3 生產者發送消息

接下來,我們使用 Java 代碼來實現 Kafka 生產者發送消息。首先,需要在項目中引入 Kafka 客戶端依賴。如果使用 Maven 項目,可以在pom.xml文件中添加以下依賴:

 

<dependency>

<groupId>org.apache.kafka</groupId>

<artifactId>kafka-clients</artifactId>

<version>3.5.1</version>

</dependency>

下面是一個簡單的 Kafka 生產者示例代碼,展示了如何同步和異步發送消息:

 

import org.apache.kafka.clients.producer.*;

import java.util.Properties;

import java.util.concurrent.ExecutionException;

public class KafkaProducerExample {

public static void main(String[] args) {

// 配置生產者屬性

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

// 設置acks參數,確保消息被成功寫入

props.put(ProducerConfig.ACKS_CONFIG, "all");

// 創建Kafka生產者實例

try (KafkaProducer<String, String> producer = new KafkaProducer<>(props)) {

// 同步發送消息

ProducerRecord<String, String> syncRecord = new ProducerRecord<>("test-topic", "key1", "value1");

try {

RecordMetadata metadata = producer.send(syncRecord).get();

System.out.println("同步發送消息成功,分區: " + metadata.partition() + ", 偏移量: " + metadata.offset());

} catch (InterruptedException | ExecutionException e) {

System.err.println("同步發送消息失敗: " + e.getMessage());

}

// 異步發送消息

ProducerRecord<String, String> asyncRecord = new ProducerRecord<>("test-topic", "key2", "value2");

producer.send(asyncRecord, new Callback() {

@Override

public void onCompletion(RecordMetadata metadata, Exception e) {

if (e != null) {

System.err.println("異步發送消息失敗: " + e.getMessage());

} else {

System.out.println("異步發送消息成功,分區: " + metadata.partition() + ", 偏移量: " + metadata.offset());

}

}

});

}

}

}

在上述代碼中:

  • 首先配置了 Kafka 生產者的基本屬性,包括 Kafka 集群地址、鍵和值的序列化器以及acks參數。
  • 然后創建了KafkaProducer實例,并分別演示了同步和異步發送消息的方式。
  • 同步發送時,調用send方法并通過get方法等待發送結果;異步發送時,通過Callback接口來處理發送結果。

3.4 消費者接收消息

同樣地,我們使用 Java 代碼實現 Kafka 消費者接收消息。在 Maven 項目中,繼續使用之前引入的kafka-clients依賴。

以下是一個 Kafka 消費者示例代碼,展示了如何自動提交和手動提交偏移量:

 

import org.apache.kafka.clients.consumer.*;

import java.time.Duration;

import java.util.Collections;

import java.util.Properties;

public class KafkaConsumerExample {

public static void main(String[] args) {

// 配置消費者屬性

Properties props = new Properties();

props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");

props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

// 自動提交偏移量

props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");

props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "5000");

// 創建Kafka消費者實例

try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {

// 訂閱主題

consumer.subscribe(Collections.singletonList("test-topic"));

// 持續拉取消息

while (true) {

ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));

for (ConsumerRecord<String, String> record : records) {

System.out.printf("自動提交: 偏移量 = %d, 鍵 = %s, 值 = %s%n",

record.offset(), record.key(), record.value());

}

}

}

}

}

上述代碼實現了一個自動提交偏移量的 Kafka 消費者:

  • 配置了消費者的基本屬性,包括 Kafka 集群地址、消費者組 ID、鍵和值的反序列化器,以及自動提交偏移量的相關配置。
  • 使用subscribe方法訂閱了test-topic主題。
  • 通過poll方法持續從 Kafka 集群拉取消息,并打印消息的偏移量、鍵和值。

如果需要手動提交偏移量,可以將ENABLE_AUTO_COMMIT_CONFIG設置為false,并在合適的時機調用commitSync或commitAsync方法來提交偏移量,示例代碼如下:

 

import org.apache.kafka.clients.consumer.*;

import java.time.Duration;

import java.util.Collections;

import java.util.Properties;

public class KafkaConsumerManualCommitExample {

public static void main(String[] args) {

// 配置消費者屬性

Properties props = new Properties();

props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");

props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

// 關閉自動提交偏移量

props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");

// 創建Kafka消費者實例

try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {

// 訂閱主題

consumer.subscribe(Collections.singletonList("test-topic"));

// 持續拉取消息

while (true) {

ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));

for (ConsumerRecord<String, String> record : records) {

System.out.printf("手動提交: 偏移量 = %d, 鍵 = %s, 值 = %s%n",

record.offset(), record.key(), record.value());

}

// 手動同步提交偏移量

consumer.commitSync();

}

}

}

}

在這個示例中,將ENABLE_AUTO_COMMIT_CONFIG設置為false,關閉了自動提交偏移量功能。在處理完消息后,調用commitSync方法手動同步提交偏移量,確保消息處理的準確性和可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83420.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux中使用yum安裝MYSQL

1、關系型數據庫 MySQL 使用 yum 安裝mysql 1、檢查是否已經安裝 Mysql rpm -qa | grep mysql如果安裝了 就進行卸載 rpm -e mysql-community-libs-5.7.44-1.el7.x86_64 rpm -e mysql57-community-release-el7-11.noarch rpm -e mysql-community-common-5.7.44-1.el7.x86_64…

Linux 文件系統與 I/O 編程核心原理及實踐筆記

文章目錄 一、理解文件1.1 狹義理解1.2 廣義理解1.3 文件操作的歸類認識1.4 系統角度&#xff1a;進程與文件的交互1.5 實踐示例 二、回顧 C 文件接口2.1 hello.c 打開文件2.2 hello.c 寫文件2.3 hello.c 讀文件2.4 輸出信息到顯示器的幾種方法2.5 stdin & stdout & st…

1.9 Express

Express 是一個基于 Node.js 平臺的輕量級、靈活的 Web 應用框架&#xff0c;它為構建 Web 應用和 API 提供了一系列強大的功能。 核心特性 中間件支持&#xff1a;Express 使用中間件&#xff08;middleware&#xff09;函數來處理 HTTP 請求和響應。中間件可以訪問請求對象&…

面壁智能MiniCPM4.0技術架構與應用場景

&#x1f4cb; 目錄 1. 引言&#xff1a;端側智能新時代2. MiniCPM4.0概述3. 核心技術架構 3.1 高效雙頻換擋機制3.2 稀疏注意力機制3.3 系統級優化創新 4. 技術突破與性能表現5. 應用場景深度解析 5.1 智能手機應用5.2 智能家居場景5.3 汽車智能化5.4 其他端側應用 6. 行業影…

RabbitMQ路由核心解密:從Exchange到RoutingKey的深度實踐與避坑指南

&#x1f50d; RabbitMQ路由核心解密&#xff1a;從Exchange到RoutingKey的深度實踐與避坑指南 “消息去哪了&#xff1f;”——這是每位RabbitMQ使用者在調試時最常發出的靈魂拷問。 理解Exchange與RoutingKey的協作機制&#xff0c;正是解開路由謎題的關鍵鑰匙。 一、Exchang…

Spring MVC完全指南 - 從入門到精通

目錄 1. Spring MVC簡介 2. MVC架構模式 3. Spring MVC核心組件 4. 請求處理流程 5. 控制器詳解 6. 請求映射 7. 參數綁定 8. 數據驗證 9. 視圖解析器 10. 模型數據處理 11. 異常處理 12. 攔截器 13. 文件上傳下載 14. RESTful API 15. 配置詳解 總結 1. Sprin…

實戰使用docker compose 搭建 Redis 主從復制集群

文章目錄 前言技術積累1、Redis 主從復制機制2、Docker Compose 編排3、 Redis 配置文件定制4、 驗證主從狀態5、 自動化部署與維護 環境準備實戰演示創建redis目錄及配置1、創建redis目錄2、創建redis配置文件 啟動redis集群服務1、創建docker-compose編排文件2、編排docker-c…

【學習筆記】RTSP-Ovnif-GB28181

【學習筆記】RTSP-Ovnif-GB28181 一、RTSP_RTP_RTCP RTSP&#xff08;Real Time Streaming Protocol&#xff09;&#xff0c;RFC2326&#xff0c;實時流傳輸協議&#xff0c;是TCP/IP協議體系中的一個應用層協議。 RTP協議詳細說明了在互聯網上傳遞音頻和視頻的標準數據包格…

stm32-c8t6實現語音識別(LD3320)

目錄 LD3320介紹&#xff1a; 功能引腳 主要特色功能 通信協議 端口信息 開發流程 stm32c8t6代碼 LD3320驅動代碼&#xff1a; LD3320介紹&#xff1a; 內置單聲道mono 16-bit A/D 模數轉換內置雙聲道stereo 16-bit D/A 數模轉換內置 20mW 雙聲道耳機放大器輸出內置 5…

RAG技術全解析:從概念到實踐,構建高效語義檢索系統——嵌入模型與向量數據庫搭建指南

一、RAG技術概述&#xff1a;為什么需要RAG&#xff1f; 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一種結合檢索與生成能力的AI架構。其核心思想是通過外部知識庫動態增強大語言模型&#xff08;LLM&#xff09;的生成能力&…

【資源分享】手機玩轉經典游戲!小雞模擬器1.9.0:PSP/NDS/GBA完美運行!

阿燦今天給大家推薦一款小雞模擬器&#xff0c;這是一個老款PC和掌上游戲機模擬器。完美模擬街機&#xff08;fbamamemameplus).PS、PSP、FC(NES)SFC(SNES)、GBA、GBC、MD、NDS、DC、NGP、WS (WSC) PCE、ONS 等18款經典掌機游戲機。小雞模擬器同時也提供海量熱門的漢化版游戲免…

matlab脈沖信號并繪制波形2025.6.11

以下是一個使用MATLAB生成5V、10MHz脈沖信號并繪制波形的示例代碼: % 5V 10MHz脈沖信號仿真 clc; clear; close all; % 參數設置 voltage = 5; % 信號幅度(V) frequency = 10e6; % 脈沖頻率(10MHz) duty_cycle =

ElasticJob初探

依賴版本 JDK版本是&#xff1a;jdk17 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>zookeeper elasticjo…

【Vue3】(三)vue3中的pinia狀態管理、組件通信方式及總結、插槽

目錄 一、vue3的pinia 1、什么是pinia&#xff1f; 2、為什么Vue3選擇pinia&#xff1f; 3、使用pinia的好處 4、安裝pinia 2、項目配置 3、存儲/讀取pinia中的數據 4、修改pinia中的數據 5、storeToRefs&#xff08;保持store中數據的響應式&#xff09; 6、getters 7、…

WEB3全棧開發——面試專業技能點P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循環 Node.js 的事件循環&#xff08;Event Loop&#xff09;是其異步編程的核心機制&#xff0c;它使得 Node.js 可以在單線程中實現非阻塞 I/O 操作。 &#x1f501; 簡要原理 Node.js 是基于 libuv 實現的&#xff0c;它使用事件循環來處理非阻塞操作。事件…

大數據學習棧記——Neo4j的安裝與使用

本文介紹圖數據庫Neofj的安裝與使用&#xff0c;操作系統&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安裝 Neofj可以進行官網安裝&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我這里安裝是添加軟件源的方法 最新版…

web架構4------(nginx常用變量,nginx中英文自動匹配,lnmp網站架構,正向代理,反向代理,負載均衡)

一.前言 本期來介紹nginx最后幾個知識點&#xff0c;看著要說的內容很多&#xff0c;其實一點也不多&#xff0c;都是所見即所得的東西。 二.nginx常用變量 2.1 常用變量 $args 請求中的參數&#xff0c;也叫查詢參數&#xff0c;如www.123.com/1.php?a1&b2的$args就是…

openeuler系統(CentOs)圖形化桌面黑屏/丟失(開啟VNC服務沖突)

1. VNC服務開啟如下&#xff1a; https://zhuanlan.zhihu.com/p/5049263261 在centos8系統上使用tigervnc-server搭建VNC_centos8 tigervnc-server-CSDN博客 2. 上述操作完成后&#xff0c;連接VNC仍會出現黑屏&#xff0c;則需要編輯/root/.vnc/xstartup&#xff1a; [運維…

MySQL:Prepared Statement 預處理語句

預處理語句&#xff08;Prepared Statements&#xff09;是 MySQL 中一種用于執行 SQL 查詢的高效、安全的方法。通過使用預處理語句&#xff0c;可以顯著提升查詢性能&#xff0c;并防止 SQL 注入攻擊。本文將詳細介紹 MySQL 預處理語句的概念、使用方法及其優勢。 一、預處理…

EPPLUS——CAD c#讀寫EXCEL的第三方庫

EPPLUS(可支持NET35) 在 CAD 的 C# 二次開發中&#xff0c;使用 EPPLUS 庫處理 Excel 文件具有以下顯著優點&#xff0c;尤其在兼容性、便捷性和性能等方面契合 CAD 項目的需求&#xff1a; 1. 跨.NET 版本兼容性強&#xff0c;適配 CAD 多環境部署 多框架支持&#xff1a;EP…