RabbitMQ面試精講 Day 4:Queue屬性與消息特性

【RabbitMQ面試精講 Day 4】Queue屬性與消息特性

開篇

歡迎來到"RabbitMQ面試精講"系列的第4天!今天我們將深入探討RabbitMQ中Queue的屬性配置與消息特性,這是理解和優化RabbitMQ使用的關鍵知識點。掌握這些內容不僅能幫助你在面試中展現深厚的技術功底,更能讓你在實際項目中合理配置隊列屬性,構建高效可靠的消息系統。

在面試中,面試官通常會通過以下方式考察候選人對Queue和消息特性的理解:

  • 解釋RabbitMQ隊列的核心屬性及其作用
  • 分析消息持久化與隊列持久化的區別與聯系
  • 討論消息TTL和隊列TTL的優先級關系
  • 解釋死信隊列的工作原理和實際應用
  • 處理消息堆積問題的策略和最佳實踐

本文將系統性地解析這些關鍵問題,并提供生產環境中的實際應用案例,助你全面掌握RabbitMQ隊列與消息特性的方方面面。

概念解析:Queue核心屬性

RabbitMQ隊列是消息的最終目的地,了解其核心屬性對于構建可靠的消息系統至關重要。以下是隊列聲明時可以配置的主要屬性:

屬性類型描述默認值
durableboolean是否持久化隊列false
exclusiveboolean是否為排他隊列false
auto-deleteboolean當最后一個消費者斷開后是否自動刪除隊列false
argumentsMap額外參數配置null

1. durable(持久化)

持久化隊列會在RabbitMQ服務器重啟后依然存在,而非持久化隊列會被刪除。注意:隊列持久化并不代表消息持久化,消息持久化需要單獨設置。

2. exclusive(排他性)

排他隊列只能被聲明它的連接使用,當連接關閉時,隊列會被自動刪除。適用于臨時隊列場景。

3. auto-delete(自動刪除)

當最后一個消費者取消訂閱后,隊列會被自動刪除。適用于臨時任務隊列。

4. arguments(額外參數)

常見的arguments配置包括:

參數作用示例值
x-message-ttl隊列中消息的存活時間(毫秒)60000
x-expires隊列空閑多久后被刪除(毫秒)1800000
x-max-length隊列最大消息數1000
x-max-length-bytes隊列最大字節數1048576
x-dead-letter-exchange死信交換機“dlx.exchange”
x-dead-letter-routing-key死信路由鍵“dlx.routing”
x-max-priority隊列支持的最大優先級10
x-queue-mode隊列模式("lazy"為惰性隊列)“lazy”

原理剖析:消息特性詳解

1. 消息持久化

消息持久化需要同時滿足兩個條件:

  1. 隊列設置為持久化(durable=true)
  2. 消息投遞時設置delivery mode=2
// 創建持久化隊列
channel.queueDeclare("persistent.queue", true, false, false, null);// 發送持久化消息
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2)  // 持久化消息
.build();
channel.basicPublish("", "persistent.queue", properties, "message".getBytes());

2. 消息TTL(Time-To-Live)

RabbitMQ支持兩種TTL設置方式:

方式作用范圍優先級設置方法
隊列TTL對整個隊列生效通過x-message-ttl參數設置
消息TTL對單個消息生效通過expiration屬性設置

當消息在隊列中存活時間超過TTL時,會變成死信(dead letter),可以被轉發到死信隊列。

// 設置隊列TTL (60秒)
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("ttl.queue", true, false, false, args);// 設置消息TTL (30秒)
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.expiration("30000")
.build();
channel.basicPublish("", "ttl.queue", props, "message".getBytes());

3. 優先級隊列

RabbitMQ支持優先級隊列,需要:

  1. 設置隊列的x-max-priority參數
  2. 發送消息時設置priority屬性
// 創建優先級隊列(支持0-10級)
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10);
channel.queueDeclare("priority.queue", true, false, false, args);// 發送高優先級消息
AMQP.BasicProperties highPriority = new AMQP.BasicProperties.Builder()
.priority(5)
.build();
channel.basicPublish("", "priority.queue", highPriority, "important".getBytes());

代碼實現:多語言客戶端示例

Java (RabbitMQ Client) 示例

import com.rabbitmq.client.*;public class QueueExample {
private final static String QUEUE_NAME = "example.queue";public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {// 創建帶有多種屬性的隊列
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl", 60000); // 消息TTL 60秒
arguments.put("x-max-length", 100);    // 最大100條消息
arguments.put("x-dead-letter-exchange", "dlx.exchange"); // 死信交換機channel.queueDeclare(QUEUE_NAME,
true,     // 持久化
false,    // 非排他
false,    // 非自動刪除
arguments // 額外參數
);// 發送不同特性的消息
sendPersistentMessage(channel);
sendTTLMessage(channel);
sendPriorityMessage(channel);
}
}private static void sendPersistentMessage(Channel channel) throws Exception {
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2) // 持久化消息
.build();channel.basicPublish("", QUEUE_NAME, properties,
"Persistent Message".getBytes());
}private static void sendTTLMessage(Channel channel) throws Exception {
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.expiration("30000") // 30秒TTL
.build();channel.basicPublish("", QUEUE_NAME, properties,
"TTL Message".getBytes());
}private static void sendPriorityMessage(Channel channel) throws Exception {
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.priority(8) // 優先級8
.build();channel.basicPublish("", QUEUE_NAME, properties,
"Priority Message".getBytes());
}
}

Python (pika) 示例

import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 創建復雜隊列
args = {
'x-message-ttl': 60000,          # 消息TTL 60秒
'x-max-length': 100,             # 最大100條消息
'x-dead-letter-exchange': 'dlx', # 死信交換機
'x-max-priority': 10             # 支持優先級
}
channel.queue_declare(queue='example.queue', durable=True, arguments=args)# 發送持久化消息
channel.basic_publish(
exchange='',
routing_key='example.queue',
body='Persistent Message',
properties=pika.BasicProperties(
delivery_mode=2,  # 持久化消息
))# 發送TTL消息
channel.basic_publish(
exchange='',
routing_key='example.queue',
body='TTL Message',
properties=pika.BasicProperties(
expiration='30000',  # 30秒TTL
))# 發送優先級消息
channel.basic_publish(
exchange='',
routing_key='example.queue',
body='Priority Message',
properties=pika.BasicProperties(
priority=5,  # 優先級5
))connection.close()

面試題解析

面試題1:RabbitMQ的隊列持久化和消息持久化有什么區別?如何同時實現兩者?

考察意圖:考察候選人對RabbitMQ持久化機制的理解深度和應用能力。

結構化回答

  1. 概念區別
  • 隊列持久化:隊列定義在RabbitMQ重啟后仍然存在
  • 消息持久化:消息內容在RabbitMQ重啟后仍然存在
  1. 配置方式
  • 隊列持久化:在queueDeclare時設置durable=true
  • 消息持久化:在basicPublish時設置deliveryMode=2
  1. 相互關系
  • 隊列不持久化時,即使消息持久化,重啟后隊列和消息都會丟失
  • 隊列持久化但消息不持久化,重啟后隊列存在但消息丟失
  • 兩者都持久化才能確保消息不丟失
  1. 最佳實踐
// 持久化隊列
channel.queueDeclare("durable.queue", true, false, false, null);// 持久化消息
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.deliveryMode(2)
.build();
channel.basicPublish("", "durable.queue", props, message.getBytes());

面試題2:消息TTL和隊列TTL同時設置時,哪個優先級更高?

考察意圖:考察候選人對TTL機制的理解和實際應用經驗。

結構化回答
RabbitMQ中TTL的優先級規則如下:

  1. 消息級TTL優先
  • 如果消息設置了expiration屬性,則以此值為準
  • 否則使用隊列的x-message-ttl參數值
  1. 設置方式對比
    | 設置級別 | 參數 | 影響范圍 | 靈活性 |
    | — | — | — | — |
    | 隊列 | x-message-ttl | 所有消息 | 統一管理 |
    | 消息 | expiration | 單個消息 | 靈活控制 |

  2. 實際應用建議

  • 需要統一過期時間的場景使用隊列TTL
  • 需要差異化過期時間的場景使用消息TTL
  • 兩者可以結合使用,提供默認值和特殊值
  1. 代碼示例
// 隊列TTL設置為60秒
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("ttl.queue", true, false, false, args);// 消息TTL設置為30秒(優先級更高)
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.expiration("30000")
.build();
channel.basicPublish("", "ttl.queue", props, "message".getBytes());

面試題3:如何設計一個可靠的死信隊列處理系統?

考察意圖:考察候選人對RabbitMQ高級特性的理解和解決實際問題的能力。

結構化回答
死信隊列(DLX)是處理失敗消息的重要機制,可靠設計需要考慮以下方面:

  1. 死信隊列定義
  • 消息變成死信的條件:
  • 消息被拒絕(basic.reject/nack)且requeue=false
  • 消息TTL過期
  • 隊列達到最大長度
  1. 核心組件
  • 死信交換機(DLX):接收死信的普通交換機
  • 死信隊列:綁定到DLX的隊列,存儲死信
  • 死信消費者:專門處理死信的服務
  1. 實現步驟
// 1. 定義死信交換機
channel.exchangeDeclare("dlx.exchange", "direct");
channel.queueDeclare("dlx.queue", true, false, false, null);
channel.queueBind("dlx.queue", "dlx.exchange", "dlx.routing");// 2. 定義工作隊列并指定DLX
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "dlx.routing");
channel.queueDeclare("work.queue", true, false, false, args);// 3. 消費者處理邏輯
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
try {
processMessage(delivery.getBody());
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
} catch (Exception e) {
// 處理失敗,發送到死信隊列
channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);
}
};
channel.basicConsume("work.queue", false, deliverCallback, consumerTag -> {});
  1. 增強可靠性
  • 監控死信隊列長度
  • 實現死信消息的重試機制
  • 記錄死信原因和上下文信息
  • 設置死信消息的TTL防止無限堆積

實踐案例

案例1:電商訂單超時取消系統

利用消息TTL和死信隊列實現訂單30分鐘未支付自動取消功能。

public class OrderTimeoutSystem {
private static final String ORDER_EXCHANGE = "order.exchange";
private static final String ORDER_QUEUE = "order.queue";
private static final String DLX_EXCHANGE = "order.dlx";
private static final String DLX_QUEUE = "order.dlx.queue";public void init() throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();// 定義死信交換機和隊列
channel.exchangeDeclare(DLX_EXCHANGE, "direct");
channel.queueDeclare(DLX_QUEUE, true, false, false, null);
channel.queueBind(DLX_QUEUE, DLX_EXCHANGE, "");// 定義訂單隊列并配置死信
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", DLX_EXCHANGE);
args.put("x-message-ttl", 1800000); // 30分鐘TTL
channel.queueDeclare(ORDER_QUEUE, true, false, false, args);// 定義訂單交換機
channel.exchangeDeclare(ORDER_EXCHANGE, "direct");
channel.queueBind(ORDER_QUEUE, ORDER_EXCHANGE, "");// 死信消費者處理超時訂單
DeliverCallback dlxCallback = (consumerTag, delivery) -> {
String orderId = new String(delivery.getBody());
cancelOrder(orderId); // 取消訂單業務邏輯
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(DLX_QUEUE, false, dlxCallback, consumerTag -> {});
}public void placeOrder(String orderId) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.basicPublish(ORDER_EXCHANGE, "", null, orderId.getBytes());
}
}private void cancelOrder(String orderId) {
// 實現訂單取消邏輯
System.out.println("Canceling order: " + orderId);
}
}

案例2:優先級任務處理系統

實現支持高優先級任務插隊的后臺任務系統。

import pikaclass PriorityTaskSystem:
def __init__(self):
self.connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost'))
self.channel = self.connection.channel()# 創建優先級隊列
args = {'x-max-priority': 10}
self.channel.queue_declare(queue='task.queue', durable=True, arguments=args)def add_task(self, task, priority=0):
properties = pika.BasicProperties(
priority=priority,
delivery_mode=2  # 持久化消息
)
self.channel.basic_publish(
exchange='',
routing_key='task.queue',
body=task,
properties=properties)def process_tasks(self):
def callback(ch, method, properties, body):
print(f"Processing task: {body}, priority: {properties.priority}")
# 模擬任務處理
time.sleep(1)
ch.basic_ack(delivery_tag=method.delivery_tag)# 設置QoS,每次只處理一個任務
self.channel.basic_qos(prefetch_count=1)
self.channel.basic_consume(
queue='task.queue',
on_message_callback=callback)print('Waiting for tasks...')
self.channel.start_consuming()# 使用示例
if __name__ == "__main__":
system = PriorityTaskSystem()
# 添加普通任務
system.add_task("Normal task 1")
system.add_task("Normal task 2")
# 添加高優先級任務
system.add_task("Urgent task", priority=9)
system.process_tasks()

技術對比:普通隊列 vs 惰性隊列

RabbitMQ 3.6.0引入了惰性隊列(Lazy Queue)的概念,與傳統隊列在工作方式上有顯著差異:

特性普通隊列惰性隊列
內存使用盡可能將消息保存在內存盡可能將消息保存在磁盤
吞吐量稍低
適用場景消息處理速度快,內存充足消息堆積嚴重,內存有限
配置方式默認模式x-queue-mode=lazy
消息堆積容易導致內存溢出更適合處理堆積
啟動速度快(消息在內存)慢(需要從磁盤加載)

惰性隊列適合以下場景:

  • 消費者可能長時間離線
  • 需要處理突發的大量消息
  • 系統內存資源有限
// 創建惰性隊列
Map<String, Object> args = new HashMap<>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("lazy.queue", true, false, false, args);

面試官喜歡的回答要點

  1. 全面理解隊列屬性
  • 清楚解釋durable、exclusive、auto-delete的區別
  • 能列舉并說明常見arguments參數的作用
  1. 深入消息特性
  • 區分消息持久化和隊列持久化的關系和區別
  • 理解TTL的兩種設置方式及優先級
  1. 高級特性應用
  • 能設計完整的死信隊列處理系統
  • 了解優先級隊列和惰性隊列的使用場景
  1. 實際問題解決
  • 針對消息堆積、順序處理等問題提供解決方案
  • 討論不同場景下的隊列配置策略
  1. 性能考量
  • 分析不同配置對性能的影響
  • 理解內存與磁盤使用的權衡

總結與預告

今天我們深入學習了RabbitMQ的Queue屬性與消息特性,包括:

  • 隊列的核心屬性及其作用
  • 消息持久化與TTL機制
  • 死信隊列的實現原理
  • 優先級隊列和惰性隊列
  • 多語言客戶端代碼示例
  • 高頻面試題解析
  • 生產環境實踐案例

明日預告:Day 5將探討"Virtual Host與權限控制",我們將深入分析:

  • Virtual Host的概念和作用
  • RabbitMQ權限系統詳解
  • 用戶角色與權限配置
  • 多租戶系統設計實踐
  • 安全最佳實踐

進階學習資源

  1. RabbitMQ官方文檔 - Queues
  2. RabbitMQ in Depth - 隊列特性章節
  3. RabbitMQ最佳實踐指南

希望本文能幫助你在面試中自信應對RabbitMQ隊列與消息特性的相關問題,并在實際開發中合理運用這些特性構建可靠的消息系統。如有任何疑問,歡迎在評論區留言討論!

文章標簽:RabbitMQ,消息隊列,隊列屬性,消息特性,面試技巧,后端開發,分布式系統

文章簡述:本文是"RabbitMQ面試精講"系列第4篇,全面解析RabbitMQ隊列屬性與消息特性。內容涵蓋隊列持久化、消息TTL、死信隊列、優先級隊列等核心概念,提供Java/Python多語言代碼示例,深入分析3個高頻面試題及電商訂單超時、優先級任務處理等實踐案例。針對RabbitMQ消息特性的常見面試難點,如持久化機制、TTL優先級、死信隊列設計等,提供結構化回答模板和技術對比,幫助開發者深入理解RabbitMQ隊列工作原理,提升面試表現和工程實踐能力。

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

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

相關文章

uniapp vue3 vite項目使用微信云開發(云函數)

1、在根目錄新建文件夾 cloudfunctions2、配置 manifest.json在項目根目錄的 manifest.json 文件中&#xff0c;找到微信小程序配置部分&#xff0c;添加 cloudfunctionRoot 字段&#xff0c;指向你的云函數目錄&#xff1a;{"mp-weixin": {"cloudfunctionRoot&…

AK視頻下載工具:免費高效,多平臺支持

近期小編又發現了一款更強大的新神器——AK視頻下載&#xff08;電腦版&#xff09;&#xff0c;一起來了解下吧~ 軟件亮點 完全免費&#xff0c;無需安裝&#xff0c;操作便捷&#xff0c;直接打開即可使用。 支持多平臺視頻下載&#xff0c;包括抖音、B站、小紅書、快手等主…

7月21日星期一今日早報簡報微語報早讀

7月21日星期一&#xff0c;農歷六月廿七&#xff0c;早報#微語早讀。1、廣東佛山累計報告基孔肯雅熱確診病例1873例&#xff0c;均為輕癥&#xff1b;2、祝賀&#xff01;石宇奇奪得日本羽毛球公開賽男單冠軍&#xff1b;3、中國和匈牙利順利完成引渡條約談判&#xff1b;4、科…

基于Milvus Lite的輕量級向量數據庫實戰指南

一、為什么選擇Milvus Lite&#xff1f; 在人工智能和語義搜索應用中&#xff0c;高效的向量檢索是核心需求。相比需要部署Docker的完整版Milvus&#xff0c;Milvus Lite提供&#xff1a; 零依賴&#xff1a;純Python實現&#xff0c;無需安裝Docker或外部組件 開箱即用&…

深度學習時代下的社交媒體情感分析:方法、工具與未來挑戰

摘要&#xff1a;基于Yue等學者2019年發表的權威綜述&#xff0c;本文系統總結情感分析的技術框架、實戰資源與前沿方向&#xff0c;附Python代碼示例。 一、情感分析為何重要&#xff1f; 情感分析&#xff08;Sentiment Analysis&#xff09;旨在從文本中提取主觀態度&…

Spring Boot 3.0新特性全面解析與實戰應用

Spring Boot 3.0新特性全面解析與實戰應用 引言 Spring Boot 3.0作為Spring生態系統的一個重要里程碑&#xff0c;帶來了眾多令人興奮的新特性和改進。本文將深入解析Spring Boot 3.0的核心變化&#xff0c;并通過實戰示例展示如何在項目中應用這些新特性。 核心變化概覽 Java版…

C# sqlsugar 主子表 聯合顯示 LeftJoin

在C#中使用SqlSugar ORM進行Left Join操作是一種常見需求&#xff0c;尤其是在處理復雜數據庫查詢時。SqlSugar是一個輕量級、高性能的ORM框架&#xff0c;支持多種數據庫。下面是如何使用SqlSugar進行Left Join操作的示例。1. 安裝SqlSugar首先&#xff0c;確保你的項目中已經…

【ROS1】08-ROS通信機制——服務通信

目錄 一、概念 二、何時使用服務 三、話題通信與服務通信的區別 四、案例 4.1 C實現 4.1.1 服務端 4.1.2 客戶端 4.1.3 測試執行 4.2 Python實現 4.2.1 服務端 4.2.2 客戶端 4.2.3 客戶端優化——動態傳參 4.2.4 客戶端優化——等待服務端啟動后再發起請求 一、概…

45.sentinel自定義異常

上文提到Blocked by Sentinel(flow limits) 限流異常,這樣返給用戶就不太友好,所以需要自定義異常。 默認情況下,發生限流、降級、授權攔截時,都會拋出異常到調用方。如果要自定義異常時的返回結果,需要實現BlockExceptionHandler接口: BlockException有很多子類: pac…

f4硬件配置spi

f4型號是stm32f407zgt6用spi來進行MOSI&#xff0c;主機發送從機接收時鐘頻率設置為1MHzMOSI為PC3&#xff0c;SCK為PB10&#xff0c;CS設置為output->PB12時鐘配置如下&#xff1a;波特率計算公式為&#xff1a;128M/(4*Prescaler) 要讓波特率為1M&#xff0c;10…

Redis的持久化-RDB

1.持久化一提到持久化&#xff0c;我們就會第一時間聯想到M有SQL的事務&#xff0c;MySQL事務有四個比較核心的特征&#xff1a;原子性&#xff08;把多個操作打包成一個整體&#xff09;&#xff0c;一致性&#xff08;事務執行之前和之后&#xff0c;數據都不能離譜&#xff…

前端內存泄漏

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1f4c3;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于中國工業軟件事業 &#x1f680;人生格言&#xff1a; 積跬步…

部署zabbox企業級分布式監控

目錄 一、監控系統的基礎認知 2.1 監控的定義與核心價值 2.2 監控的五大類型與五層邏輯架構 &#xff08;1&#xff09;五大監控類型 &#xff08;2&#xff09;五層邏輯架構 2.3 主流開源監控產品對比 二、Zabbix 系統深度解析 3.1 Zabbix 的定位與發展歷程 3.2 Zabb…

時空數據可視化新范式:基于Three.js的生產全流程時間軸回溯技術解析

內容摘要在現代工業生產中&#xff0c;如何高效地管理和分析生產全流程數據是一個關鍵問題。傳統的數據可視化方法往往只能展示靜態的數據快照&#xff0c;難以捕捉和回溯生產過程中的動態變化。然而&#xff0c;基于 Three.js 的時間軸回溯技術為這一難題提供了一種全新的解決…

寶塔面板Nginx報錯: IP+端口可以直接從訪問,反向代理之后就504了 Gateway Time-out

原因表示代理服務器在等待上游服務器&#xff08;即后端服務&#xff09;響應時超時 &#xff1a;<html><head><title>504 Gateway Time-out</title> </head><body><center><h1>504 Gateway Time-out</h1></center&g…

【ComfyUI學習筆記01】下載安裝 | 運行第一個工作流 | 學習思路

【ComfyUI學習筆記01】下載安裝 | 運行第一個工作流 | 學習思路前言下載安裝ComfyUI的下載和安裝ComfyUI Manager 的下載和安裝運行第一個工作流初識節點 (Nodes) 工作流案例1 Image Generation繪制流程圖&#xff0c;確定關鍵節點放置關鍵節點&#xff0c;確定連接順序補充中間…

numpy庫的基礎知識

一.numpy是什么 &#xff1f;Numpy 是 Python 中專門用于高性能數值計算的庫&#xff0c;其核心是一個功能強大的 n 維數組對象&#xff08;ndarray&#xff09;&#xff0c;可以用來存儲和操作大規模的數字矩陣或張量數據。numpy庫的作用&#xff1a;核心功能&#xff1a;實現…

在UniApp中防止頁面上下拖動的方法

1、pages.json中在某個頁面設置禁用彈性滾動的頁面 {"path": "pages/yourPage/yourPage","style": {"app-plus": {"bounce": "none"}} } 2、 pages.json中在所有頁面設置禁用彈性滾動的頁面 {"globalStyl…

LinkedList的模擬實現(雙向鏈表Java)

一&#xff1a;結構LinkedList的底層是雙向鏈表結構(鏈表后面介紹)&#xff0c;由于鏈表沒有將元素存儲在連續的空間中&#xff0c;元素存儲在單獨的節點中&#xff0c;然后通過引用將節點連接起來了&#xff0c;因此在在任意位置插入或者刪除元素時&#xff0c;不需要搬移元素…

Shopify 知識點

&#x1f4dc; 一、Liquid模板語言&#xff08;核心基礎&#xff09;語法結構 ? 輸出變量&#xff1a;{{ product.title }} 動態顯示商品標題。 ? 邏輯控制&#xff1a;{% if product.available %}…{% endif %} 條件渲染。 ? 循環遍歷&#xff1a;{% for item in collectio…