RabbitMQ消息隊列 面試專題

csdn

RabbitMQ消息隊列 面試專題

  • RabbitMQ的實現原理
  • 為什么需要消息隊列
  • 常見消息隊列比較
  • 如何保證消息不丟失
  • 如何防止消息重復消費
  • 如何保證消息的有序性
  • 如何處理消息堆積

RabbitMQ的實現原理

RabbitMQ 是一個基于 AMQP(Advanced Message Queuing Protocol) 協議實現的開源消息中間件,其核心設計圍繞 消息路由、持久化、可靠性傳輸和高可用性 展開。以下是其核心實現原理的深度解析:

  • 核心架構模型
    RabbitMQ 基于 AMQP 的 生產者-消費者模型,關鍵組件包括:
組件作用
Producer(生產者)發送消息到 Exchange
Exchange(交換機)接收消息并根據規則(Binding Key)路由到指定隊列
Queue(隊列)存儲消息的緩沖區,消息在此等待被消費
Consumer(消費者)從隊列訂閱并處理消息
Binding(綁定)定義 Exchange 和 Queue 之間的映射關系(基于 Routing Key)
Channel(信道)復用 TCP 連接的輕量級虛擬通道,減少資源消耗
Virtual Host(虛擬主機)邏輯隔離的多租戶機制,類似命名空間

RabbitMQ

  • 消息路由機制
    RabbitMQ 的核心是 Exchange 如何將消息路由到隊列,支持四種類型:

    • Direct Exchange(直連交換機)
      • 規則:精確匹配 Routing Key。
      • 場景:點對點精確投遞。
      channel.queue_bind(queue="order_queue", exchange="orders", routing_key="order.create")
      
    • Topic Exchange(主題交換機)
      • 規則:通配符匹配(* 匹配一個詞,# 匹配多個詞)。
      • 場景:靈活的多播路由。
      channel.queue_bind(queue="logs", exchange="log_topic", routing_key="logs.*.error")
      
    • Fanout Exchange(扇出交換機)
      • 規則:廣播到所有綁定隊列,忽略 Routing Key。
      • 場景:發布/訂閱模式。
      channel.queue_bind(queue="news_feed", exchange="news", routing_key="")
      
    • Headers Exchange(頭交換機)
      • 規則:基于消息頭的鍵值對匹配(而非 Routing Key)。
      • 場景:復雜屬性匹配。
  • 消息存儲與持久化
    RabbitMQ 通過 持久化機制 防止消息丟失:

    持久化對象配置方法
    Exchangechannel.exchange_declare(exchange=“orders”, exchange_type=“direct”, durable=True)
    Queuechannel.queue_declare(queue=“order_queue”, durable=True)
    Message設置 delivery_mode=2(消息屬性中指定)
    • 存儲引擎:使用 Erlang 的 Mnesia 數據庫 存儲元數據(Exchange、Queue、Binding),消息內容默認存儲在內存,啟用持久化后會寫入磁盤。
    • 性能優化:通過 消息批處理(Batching)惰性隊列(Lazy Queues) 減少磁盤 I/O 壓力。
  • 可靠性傳輸

    • 生產者確認(Publisher Confirms)
      • 生產者開啟 confirm 模式,Broker 在消息持久化后發送 basic.ack,失敗時發送 basic.nack
      • 實現原理:通過 Erlang 的 gen_server 進程管理確認狀態。
    • 消費者確認(Consumer Acknowledgements)
      • 消費者設置 auto_ack=false,處理完成后手動發送 basic.ack
      • 預取機制(Prefetch):通過 basic.qos 控制未確認消息的最大數量,防止消費者過載。
  • 高可用性設計

    • 集群模式
      • 普通集群:節點間同步元數據(Exchange、Queue 定義),但消息不跨節點復制。
      • 鏡像隊列(Mirrored Queues):消息在多個節點間鏡像復制,配置策略示例:
    rabbitmqctl set_policy ha-all "^ha." '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
    
  • 腦裂處理

    • 使用 仲裁機制(Quorum Queues)(RabbitMQ 3.8+)替代鏡像隊列,基于 Raft 協議保證數據一致性。
  • 流量控制

    • 背壓機制(Back Pressure):當消費者處理速度過慢時,RabbitMQ 通過阻塞生產者的 TCP 連接施加背壓。
    • 流控(Flow Control):基于內存和磁盤閾值自動限制消息接收速率。
  • 底層實現技術

    • Erlang/OTP:RabbitMQ 使用 Erlang 語言開發,利用其輕量級進程(每個 Connection 對應一個 Erlang 進程)和高并發特性。
    • Mnesia:分布式數據庫存儲元數據,支持事務和快速查詢。
    • 協議解析:AMQP 協議幀解析通過二進制模式匹配高效實現。
  • 總結

    • 靈活的路由機制:通過 Exchange 類型和 Binding 規則實現消息的動態分發。
    • 持久化與可靠性:消息、隊列、交換機的持久化 + 生產者/消費者雙向確認。
    • 高可用架構:集群 + 鏡像隊列/仲裁隊列保證服務連續性。
    • 高效資源管理:Channel 復用連接、Erlang 輕量級進程、背壓控制。

為什么需要消息隊列

消息隊列(Message Queue)是一種在分布式系統中用于組件間通信的中間件技術,它通過異步、解耦、可靠傳輸等特性,解決了傳統系統設計中的許多痛點。以下是消息隊列的核心價值和應用場景:

  • 系統解耦
    • 問題:直接調用(如HTTP/RPC)會導致系統緊耦合,任一方的故障或升級都可能影響整體。
    • 解決方案:消息隊列作為中間層,生產者與消費者無需知道彼此存在。
      • 示例:訂單系統將訂單消息發送到隊列,庫存系統、物流系統各自獨立消費消息,即使某一系統宕機,其他系統仍可正常工作。
  • 異步處理
    • 問題:同步調用鏈路過長時,響應時間累積,用戶體驗差。
    • 解決方案:非關鍵操作異步化,提升主流程響應速度。
      • 示例:用戶注冊后,主流程僅寫入數據庫,發送驗證郵件、短信通知等通過消息隊列異步處理,用戶無需等待。
  • 流量削峰
    • 問題:突發流量(如秒殺活動)可能壓垮后端服務。
    • 解決方案:消息隊列作為緩沖區,平滑流量沖擊。
      • 示例:電商秒殺時,請求先寫入隊列,后端服務按最大處理能力逐步消費,避免服務器過載。
  • 數據可靠性
    • 問題:網絡抖動或服務宕機可能導致數據丟失。
    • 解決方案:消息隊列提供持久化、確認機制(ACK)、重試等保障。
      • 示例:支付結果通知失敗時,消息隊列自動重推,確保最終一致性(如RabbitMQ的ACK機制、Kafka的副本同步)。
  • 擴展性
    • 問題:系統規模擴大時,直接通信的架構難以水平擴展。
    • 解決方案:消息隊列天然支持分布式架構,方便增減生產者或消費者。
      • 示例:日志收集場景中,多個服務向隊列發送日志,消費者集群可動態擴容處理海量數據。
  • 數據流處理
    • 問題:實時數據分析、監控等場景需要低延遲處理流水數據。
    • 解決方案:消息隊列與流處理框架(如Flink、Spark)結合,實現實時管道。
      • 示例:用戶行為日志通過Kafka傳輸,實時計算集群分析后生成推薦結果。
  • 典型應用場景
    • 電商系統:訂單處理、庫存扣減、物流通知。
    • 金融支付:交易流水異步對賬、通知推送。
    • 物聯網:海量設備數據采集與分發。
    • 微服務架構:服務間通信、事件驅動設計(Event-Driven Architecture)。
  • 何時不需要消息隊列?
    • 低復雜度系統:若系統簡單,引入消息隊列可能增加運維負擔。
    • 強實時性需求:異步可能帶來延遲,不適合毫秒級響應場景。
    • 數據一致性要求極高:需結合分布式事務(如Saga、TCC)解決一致性問題。
  • 總結
    消息隊列通過解耦、異步、削峰、可靠傳輸等能力,成為分布式系統的“中樞神經”,尤其適用于高并發、多組件協作的場景。但其引入也需權衡復雜度,根據實際需求選擇適合的隊列類型(如RabbitMQ、Kafka、RocketMQ)。

常見消息隊列比較

特性RabbitMQKafkaRocketMQActiveMQ
吞吐量中等(萬級TPS)極高(百萬級)高(十萬級)低(萬級)
延遲低(微秒級)高(毫秒級)中低(毫秒級)中(毫秒級)
可靠性高(ACK機制)高(副本同步)高(事務消息)中(依賴配置)
消息持久化支持長期存儲支持支持
擴展性中等(垂直擴展)極強(水平)強(水平)
事務支持基礎事務無(需外部實現)分布式事務JMS事務
典型場景企業級異步日志/流處理金融/電商傳統企業應用

選型建議

  • 高吞吐 & 流處理:選Kafka(如日志采集、實時分析)。
  • 復雜路由 & 低延遲:選RabbitMQ(如訂單系統、即時通知)。
  • 金融級事務 & 高可靠:選RocketMQ(如支付、交易系統)。
  • 傳統企業集成:選ActiveMQ(簡單場景,非高并發)。
    擴展知識:新興隊列
  • Pulsar:云原生設計,支持多租戶、分層存儲,適合混合云場景。
  • NATS:輕量級、極低延遲,適合物聯網(IoT)和微服務通信。

如何保證消息不丟失

RabbitMQ 通過多層次的機制確保消息不丟失,涵蓋生產者、Broker 和消費者三個環節。以下是詳細的解決方案:

  • 生產者端:確保消息成功投遞
    • 啟用發布確認(Publisher Confirms)
      生產者將信道設置為 confirm 模式,消息成功寫入 Broker 后,會收到異步確認(basic.ack)。若未收到確認(如網絡故障),生產者需重發消息。
      channel.confirmSelect(); // 開啟確認模式
      // 發送消息...
      channel.waitForConfirms(); // 等待Broker確認
      
    • 事務機制(慎用)
      通過 AMQP 事務(txSelect/txCommit)確保原子性,但性能較差,推薦使用確認模式。
    • 消息持久化標記
      發送消息時設置 deliveryMode=2,即使 Broker 重啟,消息也不會丟失。
      AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().deliveryMode(2) // 持久化消息.build();
      channel.basicPublish(exchange, routingKey, props, message.getBytes());
      
  • Broker 端:持久化與高可用
    • 持久化交換機、隊列和消息

      • 聲明交換機時設置 durable=truechannel.exchangeDeclare(exchangeName, “direct”, true);
      • 聲明隊列時設置 durable=truechannel.queueDeclare(queueName, true, false, false, null);
      • 發送消息時設置 deliveryMode=2(見上文)。
    • 鏡像隊列(Mirrored Queues)
      在集群中配置鏡像隊列,確保消息在多個節點冗余存儲。即使某節點故障,其他節點仍可提供服務。

      rabbitmqctl set_policy ha-all "^ha." '{"ha-mode":"all"}' # 將所有隊列鏡像到所有節點
      
  • 消費者端:可靠消費與手動確認
    • 關閉自動應答(AutoAck=false)
      消費者手動發送確認(ACK),確保消息處理完成后才通知 Broker 刪除消息。
      channel.basicConsume(queueName, false, consumer); // 關閉自動ACK
      // 處理消息后手動確認
      channel.basicAck(deliveryTag, false);
      
    • 消費失敗重試
      若處理失敗,可發送 basicNack 或 basicReject 使消息重新入隊,或延遲后重試。
      channel.basicNack(deliveryTag, false, true); // 重新放回隊列
      
  • 其他增強措施
    • 監控與告警
      使用 RabbitMQ Management 插件或 Prometheus 監控消息堆積、節點狀態,及時發現問題。
    • 網絡與故障恢復
      配置合理的超時和重試機制,避免因短暫網絡抖動導致消息丟失。
    • 冪等性設計
      消費者處理消息時需支持冪等,避免因重復投遞(如生產者重試)導致數據不一致。

如何防止消息重復消費

在 RabbitMQ 中,消息重復消費通常是由于網絡問題、消費者故障或消息確認機制未正確處理導致的。RabbitMQ 本身不提供直接解決重復消費的機制,但可以通過以下方法實現防重:

  • 冪等性設計(核心方案)

    • 實現方式:
      • 唯一業務標識符:每條消息攜帶唯一 ID(如 UUID),消費者處理前檢查該 ID 是否已執行。

      • 數據庫去重:在業務表中記錄已處理的消息 ID,通過唯一索引或 INSERT … ON CONFLICT DO NOTHING 避免重復。

      • Redis 防重:用 Redis 的 SETNX(key 為消息 ID)記錄處理狀態,設置合理過期時間。

      • 樂觀鎖:更新數據時通過版本號或條件判斷(如 UPDATE table SET status = ‘done’ WHERE status = ‘pending’)。

        -- 示例:數據庫去重表
        CREATE TABLE processed_messages (id VARCHAR(255) PRIMARY KEY,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        );
        
  • 手動確認機制(ACK)
    合理配置 RabbitMQ 的消息確認機制,避免因未正確 ACK 導致消息重新入隊。

    • 步驟
      • 消費者處理完業務邏輯后,手動發送 basic_ack 確認消息。
      • 若處理失敗,發送 basic_nackbasic_reject 拒絕消息,并選擇是否重新入隊(requeue=false 時消息進入死信隊列)。
    • 注意:確保 ACK 前業務邏輯已完成,避免程序崩潰導致消息丟失。
      // 示例:Java 客戶端手動 ACK
      channel.basicConsume(queueName, false, (consumerTag, delivery) -> {try {// 處理業務邏輯processMessage(delivery.getBody());// 成功則手動 ACKchannel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);} catch (Exception e) {// 失敗則 NACK(不重新入隊)channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);}
      });
      
  • 消息全局唯一 ID
    在生產者端為每條消息生成唯一標識符,消費者通過該 ID 判斷是否重復。

  • 生產者示例:

    import uuid
    message = {"msg_id": str(uuid.uuid4()),"data": "your_payload"
    }
    channel.basic_publish(exchange='exchange',routing_key='routing_key',body=json.dumps(message),properties=pika.BasicProperties(delivery_mode=2)  # 持久化消息
    )
    
  • 死信隊列(DLX)與重試次數限制
    通過死信隊列捕獲多次處理失敗的消息,避免無限重試。

    • 配置步驟
      • 定義正常隊列并綁定死信交換機。
      • 設置消息的最大重試次數(通過 x-death 頭信息計數)。
      • 達到重試上限后,消息轉入死信隊列進行人工干預或日志記錄。
        // 創建隊列時聲明死信交換機
        Map<String, Object> args = new HashMap<>();
        args.put("x-dead-letter-exchange", "dlx_exchange");
        args.put("x-max-retries", 3);  // 自定義重試次數
        channel.queueDeclare("normal_queue", true, false, false, args);
        
  • 分布式鎖
    在并發場景下,使用分布式鎖確保同一消息在同一時刻僅被一個消費者處理。

    • 工具:Redis RedLock、ZooKeeper 或數據庫鎖。
    • 示例(Redis)
      lock_key = f"message_lock:{message_id}"
      if redis.set(lock_key, 1, ex=60, nx=True):try:process_message(message)redis.delete(lock_key)except:redis.delete(lock_key)
      else:# 鎖已被占用,放棄處理或重試
      

總結方案

  • 生產者端:為消息注入唯一 ID,確保消息可追蹤。
  • 消費者端
    • 使用唯一 ID + 數據庫/Redis 實現冪等性。
    • 正確配置手動 ACK,避免消息意外重新入隊。
    • 結合死信隊列限制重試次數。
  • 業務層:設計天然冪等的操作(如 SET 操作代替 INCREMENT)。

如何保證消息的有序性

RabbitMQ 默認不保證消息的全局有序性,但在特定場景和配置下可以實現有序性。以下是常見方法和注意事項:

  • 單生產者和單消費者
    • 原理:若只有一個生產者發送消息到隊列,且隊列僅有一個消費者(單線程處理),RabbitMQ 的 FIFO(先進先出)特性會保證消息順序。
    • 限制:無法橫向擴展消費者,性能受限。
  • 消息分組(Message Grouping)
    • 使用場景:需要多消費者但保證同一組消息有序。
    • 實現方式
      • 路由鍵分組:將需有序的消息通過相同路由鍵發送到同一隊列(如按用戶ID分組)。
      • 一致性哈希交換器:通過插件(如 rabbitmq-consistent-hash-exchange)將相同特征的消息路由到固定隊列。
    • 示例:訂單操作消息按訂單ID哈希到特定隊列,每個隊列由獨立消費者處理。
  • 消費者單線程處理
    • 預取限制(Prefetch):設置 prefetch_count=1,確保消費者一次只處理一條消息,避免并發導致的亂序。
      channel.basic_qos(prefetch_count=1)
      
    • 串行化處理:消費者內部使用單線程或隊列機制按順序處理消息。
  • 消息確認(ACK)機制
    • 順序確認:消費者在處理完當前消息后發送ACK,再接收下一條消息。結合 prefetch_count=1 可防止消息堆積導致的亂序。
  • 業務層有序性控制
    • 版本號/序列號:消息中攜帶序列號,消費者按序號重新排序或拒絕亂序消息。
    • 數據庫狀態:通過數據庫事務或狀態機確保業務操作順序,即使消息亂序也能正確處理。
  • 插件或外部系統
    • RabbitMQ 插件:如 rabbitmq-message-ordering 插件(需評估穩定性)。
    • 分布式鎖:在處理關鍵消息時使用鎖(如 Redis 鎖),確保同一資源的消息串行處理。

注意事項

  • 性能與擴展性:有序性常以犧牲并發為代價,需權衡吞吐量和順序需求。
  • 網絡分區與故障:RabbitMQ 集群在分區時可能影響消息順序,需設計容錯機制。
  • 重試機制:消息重試可能導致亂序,需結合業務邏輯處理(如丟棄舊消息或重新入隊)。

總結
RabbitMQ 的有序性需通過約束生產者、消費者、隊列設計及業務邏輯共同實現。在分布式場景下,嚴格全局有序較難實現,通常采用分組有序或最終一致性方案。設計時應優先評估是否必需強順序,避免過度設計。

如何處理消息堆積

針對 RabbitMQ 的消息堆積問題,可以從 預防堆積處理堆積 兩個方向入手,以下分步驟說明解決方案:

  • 預防消息堆積
    • 提升消費者處理能力
      • 橫向擴展(增加消費者)
        • 使用 Work Queue 模式,啟動多個消費者實例并行處理消息。
        • 示例代碼(Spring Boot 中配置消費者并發):
        @RabbitListener(queues = "myQueue", concurrency = "5-10") // 最小5,最大10個消費者
        public void handleMessage(String message) { ... }
        
      • 優化消費者邏輯
        • 減少單條消息處理耗時(如異步操作、避免阻塞調用)。
        • 使用批量消費(如 prefetchCount 調高 + 批量處理邏輯)。
    • 控制生產者速率
      • 限流機制
        • 在生產者端添加速率限制(如令牌桶算法)。
        • 使用 RabbitMQ 的 Publisher Confirms 確保消息可靠發送,避免盲目重試。
      • 流量削峰
        • 引入緩沖層(如 Redis、Kafka)暫存突發流量,平滑寫入 RabbitMQ。
    • 隊列配置優化
      • 設置隊列長度限制
        • 定義隊列最大長度,超出時丟棄舊消息或拒絕新消息。
        • 示例(聲明隊列時設置參數):
          args.put("x-max-length", 10000);  // 隊列最多存10000條消息
          args.put("x-overflow", "reject-publish"); // 超出后拒絕新消息
          
      • 設置消息 TTL(過期時間)
        • 自動刪除過期消息,避免堆積。
        • 示例:
          args.put("x-message-ttl", 60000); // 消息存活60秒
          
    • 使用惰性隊列(Lazy Queues)
      • 將消息直接存儲到磁盤,減少內存占用,避免內存爆滿。
      • 聲明隊列時添加參數:
        args.put("x-queue-mode", "lazy");
        
    • 死信隊列(DLX)處理異常消息
      • 將處理失敗或超時的消息路由到死信隊列,避免阻塞主隊列。
      • 配置示例:
        args.put("x-dead-letter-exchange", "dlx.exchange");
        args.put("x-dead-letter-routing-key", "dlx.routingKey");
        
  • 處理已有消息堆積
    • 臨時擴容消費者
      • 快速增加消費者實例或線程數,優先消化堆積消息。
      • 動態調整 prefetchCount(適當增大):
        spring:rabbitmq:listener:simple:prefetch: 100  # 每次從隊列拉取100條消息
        
    • 消息轉移與重分發
      • 使用 rabbitmqadmin 工具將堆積隊列的消息轉移到其他隊列臨時處理:
        rabbitmqadmin move messages source_queue="myQueue" target_queue="backupQueue" vhost="/"
        
      • 編寫腳本重新發布消息(注意避免循環)。
    • 批量清理消息
      • 通過管理界面或 API 刪除非關鍵消息:
        rabbitmqadmin purge queue name=myQueue
        
    • 降級處理
      • 抽樣分析消息內容,丟棄非關鍵數據(如日志消息)。
  • 監控與預警
    • 監控指標:
      • 隊列長度(rabbitmqctl list_queues)、消費者數量、消息吞吐速率。
    • 配置告警:
      • 使用 Prometheus + Grafana 或 RabbitMQ 插件(如 rabbitmq_prometheus)設置閾值告警。

總結方案對比

方案適用場景注意事項
增加消費者消費者處理能力不足確保系統資源(CPU/線程)充足
惰性隊列內存敏感型場景,允許稍高延遲磁盤 I/O 可能成為瓶頸
消息 TTL允許消息過期可能丟失數據,需業務容忍
死信隊列處理異常消息需額外監控死信隊列
隊列限流控制生產者速率可能增加生產者延遲

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

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

相關文章

【Hudi-SQL DDL創建表語法】

CREATE TABLE 命令功能 CREATE TABLE命令通過指定帶有表屬性的字段列表來創建Hudi Table。 命令格式 CREATE TABLE [ IF NOT EXISTS] [database_name.]table_name[ (columnTypeList)]USING hudi[ COMMENT table_comment ][ LOCATION location_path ][ OPTIONS (options_lis…

藍橋杯備考:動態規劃路徑類DP之矩陣的最小路徑和

如題&#xff0c;要求左上角到右下角的最短路徑&#xff0c;我們還是老樣子按順序做 step1:確定狀態表示 f[i][j]表示(1,1)到(i,j)的最短距離 step2 :推導狀態表達方程 step3:確定填表順序&#xff0c;應該是從上到下&#xff0c;從左到右 step4:初始化 step5 找結果&#…

【Maven】基于IDEA學習 Maven依賴 與 工程繼承、聚合關系

文章目錄 一、基于IDEA 進行Maven依賴管理1. 依賴管理概念2. Maven工程核心信息配置和解讀&#xff08;GAVP&#xff09;3. Maven工程依賴管理配置依賴管理和依賴添加依賴版本統一提取和維護 4. 依賴范圍5. Maven工程依賴下載失敗錯誤解決6. Maven工程Build構建配置指定打包命名…

微信小程序注冊組件

在微信小程序中注冊組件分為自定義組件的創建和全局/局部注冊&#xff0c;下面為你詳細介紹具體步驟和示例。 自定義組件的創建 自定義組件由四個文件組成&#xff0c;分別是 .js&#xff08;腳本文件&#xff09;、.json&#xff08;配置文件&#xff09;、.wxml&#xff08…

貪心算法二

> 作者&#xff1a;?舊言~ > 座右銘&#xff1a;松樹千年終是朽&#xff0c;槿花一日自為榮。 > 目標&#xff1a;了解什么是貪心算法&#xff0c;并且掌握貪心算法。 > 毒雞湯&#xff1a;有些事情&#xff0c;總是不明白&#xff0c;所以我不會堅持。早安! >…

react中的fiber和初次渲染

源碼中定義了不同類型節點的枚舉值 組件類型 文本節點HTML標簽節點函數組件類組件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…

Wireshark的OSPF報文抓包和分析(單區域ospf實驗)

一、OSPF的5種數據包和7種狀態機制 數據包 Hello&#xff1a;發現、建立鄰居&#xff08;鄰接&#xff09;關系、維持、周期保活&#xff1b;存在全網唯一的RID&#xff0c;使用IP地址表示 DBD&#xff1a;本地的數據庫的目錄&#xff08;摘要&#xff09;&#xff0c;LSDB的…

前后分離文件上傳案例,前端HTML,后端Net6開發的webapi(完整源代碼)下載

文件上傳功能在項目開發中非常實用&#xff0c;本案例前端用HTML頁面的form表單實現&#xff0c;后端用Net6實現。 前后分離文件上傳案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代碼&#xff09; 下載鏈接https://download.csdn.net/download/luckyext/9…

Linux之命令記錄【一】

文章目錄 前言幾個重要的熱鍵1.[Tab]按鍵2.[Ctrl]-c 按鍵3.[Ctrl]-d 按鍵4.[shift]{[PageUP]|[Page Down]}按鍵 線上求助&#xff08;查看幫助信息&#xff09;1. --help2.man page3.info page 用戶身份1.su 基礎指令1.date2.cal3.bc 系統字符集相關1.locale 文本編輯器1.nano …

Unity HDR顏色、基礎顏色、強度強度、HDR面板Intensity之間的相互轉換

目錄 前言&#xff1a; 一、UnityHDR面板的規律 二、HDR與基礎顏色轉換&#xff0c;HDR強度獲取&#xff0c;輸入設置強度獲取 1.基礎色->HDR顏色 2.HDR顏色->基礎色 3.獲取HDR顏色在面板中的強度 4.獲取HDR顏色在面板設置輸入時的強度 前言&#xff1a; HDR&#…

T41LQ專為人工智能物聯網(AIoT)應用設計,適用于智能安防、智能家居、機器視覺等領域 軟硬件資料+樣品測試

君正&#xff08;Ingenic&#xff09;T系列芯片涵蓋多個型號&#xff0c;每個型號根據不同應用需求提供了多個版本。以下是各型號及其主要版本&#xff1a; 1. T23系列&#xff1a; T23N&#xff1a;標準版&#xff0c;適用于移動攝像機、安全監控、視頻通話和視頻分析等應用…

高頻 SQL 50 題(基礎版)| 高級字符串函數 / 正則表達式 / 子句:1667. 修復表中的名字、1527. 患某種疾病的患者、196. 刪除重復的電子郵箱、176. 第二高的薪水、...

高級字符串函數 / 正則表達式 / 子句 1667. 修復表中的名字 題目鏈接&#xff1a;1667. 修復表中的名字 狀態&#xff1a;學會了 思路&#xff1a; 要求修復名字&#xff08;首字母大寫&#xff0c;其他字母小寫&#xff09;&#xff0c;按順序返回。 想法就是取出名字這一列&…

《異步江湖:XHR、Promise 與 Event Loop 的恩怨情仇》

XMLHttpRequest XMLHttpRequest&#xff08;簡稱 XHR&#xff09;是瀏覽器提供的一個 JavaScript 對象&#xff0c;用于在客戶端和服務器之間發送 HTTP 請求。它是實現 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; 技術的核心工具&#xff0c;允許網頁在不…

C++課程設計【宿舍管理查詢軟件】

宿舍管理查詢軟件 一、題目描述二、源碼以及說明宿舍管理查詢軟件設計與實現1. 系統設計思路1.1 功能需求1.2 數據結構2. 系統實現3. 代碼說明3.1 數據結構3.2 功能實現3.3 文件存儲4. 示例運行輸入輸出5. 總結其他QT文章推薦一、題目描述 (一)問題描述 為宿舍管理人員編寫一…

MWC 2025 | 移遠通信推出AI智能無人零售解決方案,以“動態視覺+邊緣計算”引領智能零售新潮流

在無人零售市場蓬勃發展的浪潮中&#xff0c;自動售貨機正經歷著從傳統機械式操作向AI視覺技術的重大跨越。 移遠通信作為全球領先的物聯網整體解決方案供應商&#xff0c;精準把握行業趨勢&#xff0c;在2025世界移動通信大會&#xff08;MWC&#xff09;上宣布推出全新AI智能…

C語言常用的頭文件,include文件

常用頭文件功能速覽 1 &#xff0c;通用常用頭文件 01. stdio.h——標準輸入輸出 02. stdlib.h——內存管理與分配、隨機數、字符串轉換 03. string.h——字符串處理 04. math.h——數學 05. time.h——時間和日期 06. ctype…

[MySQL初階]MySQL(4)基本查詢

標題&#xff1a;[MySQL初階]MySQL&#xff08;4&#xff09;基本查詢 水墨不寫bug 文章目錄 一. 數據表設計二、對數據表的操作1. Create 操作&#xff08;插入數據&#xff09;查看最近受影響的行數&#xff1a; 2. Retrieve 操作&#xff08;讀取數據&#xff09;&#xff0…

小米智能音箱Pro搭載“超級小愛”,支持遠程控車

大家好,今天我要給大家好好嘮嘮小米智能音箱Pro,尤其是它搭載的“超級小愛”,那功能可太強大了,還支持遠程控車,真的是給我們的生活帶來了超多便利和驚喜。 先來說說這小米智能音箱Pro的外觀。它的設計非常簡約時尚,整體造型方方正正,線條流暢,放在家里任何一個角落都…

react中的useContext--為什么使用(一)

React 的數據傳遞流程 在 React 中&#xff0c;數據傳遞通常是自上而下的&#xff0c;也就是父組件把數據通過 props 傳遞給子組件&#xff0c;子組件無法直接修改父組件的數據。 例子&#xff1a;父組件向子組件傳遞數據 const Parent () > {const user { name: &quo…

如何使用 LLM 生成的術語自動在搜索應用程序上構建 autocomplete 功能

作者&#xff1a;來自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通過使用 LLM 生成的詞匯&#xff0c;為搜索應用增強自動補全功能&#xff0c;實現更智能、更動態的搜索建議。 自動補全是搜索應用中的一項關鍵功能&#xff0c;它通過在用戶輸入時實…