Rabbitmqtopic 主題詳解

一、基礎概念

RabbitMQ 是一種使用 AMQP(Advanced Message Queuing Protocol)協議來實現消息隊列(Message Queue)服務的中間件(Middleware)系統。它支持多種消息隊列模型,其中之一是 Topic。Topic 是一種支持主題(Topic)概念的消息隊列模型。在 Topic 模型中,消息可以被發送到一個這樣的主題(Topic)中,所有訂閱該主題的消費者都將收到該消息。而 RabbitMQ 通過 Exchange(交換機)來支持 Topic 模型。根據 Exchange 的不同綁定模式,可以實現以不同的主題來發送消息。

假設存在一個主題 topic.a.b,那麼所有使用該主題的訂閱者(Subscriber)都可以收到發送到該主題的消息。而 RabbitMQ 中,主題都是由一個或多個單片語成的路由鍵(Routing Keys)來表示的。所以,一個主題可以表示為用「.」分隔的多個單片語成的路由鍵,例如 topic.a.b.c 表示三個單片語成的主題。同時,在訂閱主題時,也可以使用通配符(Wildcards)來表示一些特定的主題,例如 topic.# 表示一組以 topic 開頭的主題。

二、Topic 模型的使用場景

在 RabbitMQ 中,使用 Topic 模型可以解決以下問題:

1、任務分發:一個任務被分發到多個消費者進行處理。例如,需要將爬取到的數據分發給多個處理模塊進行處理。

2、關注事件:多個消費者可以訂閱關注相同事件的主題。例如,在電商網站上,不同的用戶可能對同一件商品感興趣,而我們需要及時地通知他們在該商品上的優惠信息。

3、日誌分析:將不同的日誌事件路由到不同的消息隊列中進行處理。例如,將用戶行為日誌、伺服器日誌和業務邏輯日誌分別存儲到不同的消息隊列中。

三、Topic 模型的代碼實現

1、發送消息

const amqp = require('amqplib/callback_api');

// 創建連接
amqp.connect('amqp://localhost', function (err, connection) {

  // 創建頻道
  connection.createChannel(function (err, channel) {
    
    // 設置交換機類型為 topic
    let ex = 'topic_logs';
    let msg = process.argv.slice(2).join(' ') || 'Hello World!';
    let severity = process.argv.slice(2).join(' ') || 'anonymous.info';

    // 發布消息
    channel.assertExchange(ex, 'topic', { durable: false });
    channel.publish(ex, severity, Buffer.from(msg));
    console.log(" [x] Sent %s: '%s'", severity, msg);

    // 關閉頻道和連接
    setTimeout(function () { 
      channel.close(); 
      connection.close(); 
    }, 500);
  });
});

2、接收消息

const amqp = require('amqplib/callback_api');

// 創建連接
amqp.connect('amqp://localhost', function (err, connection) {

  // 創建頻道
  connection.createChannel(function (err, channel) {
    
    // 設置交換機類型為 topic
    let ex = 'topic_logs';
    let args = process.argv.slice(2);
    
    // 聲明交換機和隊列
    channel.assertExchange(ex, 'topic', { durable: false });
    channel.assertQueue('', { exclusive: true }, function (err, q) {
      
      // 根據傳入參數綁定相應的路由鍵
      args.forEach(function (key) {
        channel.bindQueue(q.queue, ex, key);
      });

      // 監聽消息隊列
      channel.consume(q.queue, function (msg) {
        console.log(" [x] %s:'%s'", msg.fields.routingKey, msg.content.toString());
      }, { noAck: true });
    });
  });
});

四、Topic 模型的優化

在 RabbitMQ 中,實現 Topic 模型的最佳實踐是合理地設計交換機和 Routing Keys。對於同一類主題的消息,應該儘可能地使用相同的 Routing Keys 策略。如果存在多個 Routing Keys,那麼建議將其扇出(Fanout)為多個隊列,避免重複消費等問題。

同時,在實現 Topic 模型時,應儘可能將消費者和生產者進行解耦。例如,可以使用 RPC(Remote Procedure Call,遠程過程調用)方式實現消費者和生產者之間的通信,從而極大地提高消息隊列的應用效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283009.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:06
下一篇 2024-12-22 08:06

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論