【序列晉升】28 云原生時代的消息驅動架構 Spring Cloud Stream的未來可能性

目錄

一、Spring Cloud Stream是什么?

二、誕生背景與設計動機

2.1 微服務架構的挑戰

2.2 Spring生態的發展

2.3 Spring Integration的演進

三、架構設計與核心組件

3.1 分層架構設計

3.2 核心組件詳解

3.3 編程模型

四、解決的問題與優勢

4.1 解決的核心問題

4.2 主要優勢

五、關鍵特性與高級功能

5.1 消息中間件抽象

5.2 分區與負載均衡

5.3 函數式編程模型

5.4 動態綁定

5.5 死信隊列支持

5.6 批量消費

六、與同類產品的對比

6.1 與傳統消息系統對比

6.2 與Kafka Streams對比

6.3 與AWS Kinesis對比

七、使用方法與最佳實踐

7.1 依賴配置

7.2 函數式編程實現

7.3 注解式模型實現

7.4 動態綁定

7.5 批量消費

7.6 死信隊列配置

7.7 最佳實踐

八、實際應用場景

8.1 事件驅動微服務

8.2 實時數據處理

8.3 微服務配置更新

8.4 服務間異步通信

九、未來發展趨勢

9.1 云原生支持

9.2 與Kubernetes集成

9.3 響應式編程支持

9.4 與Spring Cloud Function集成

9.5 與AI和機器學習結合

十、總結與建議

?參考資料:


Spring Cloud Stream是一個基于Spring Boot的框架,旨在簡化消息中間件的集成和使用,為微服務架構提供統一的消息驅動通信模型 。它通過抽象化消息中間件的實現細節,使開發者能夠專注于業務邏輯,而非底層消息傳遞機制。本文將深入探討Spring Cloud Stream的定義、背景、架構、關鍵特性、使用方法及其在微服務中的應用價值,幫助開發者全面理解并掌握這一強大工具。

一、Spring Cloud Stream是什么?

Spring Cloud Stream是一個用于構建消息驅動微服務的框架,它建立在Spring Boot和Spring Integration之上。Spring Cloud Stream的核心目標是提供一個統一的編程模型,讓開發者能夠輕松地與各種消息中間件進行交互,同時保持代碼的中間件無關性 。通過這一框架,微服務可以作為消息的生產者或消費者,實現服務間松耦合的異步通信。

Spring Cloud Stream提供了一套簡潔的API和注解,允許開發者以聲明式的方式定義消息通道。這些通道通過Binder與具體的消息中間件(如Kafka、RabbitMQ等)連接。框架的核心組件包括Binder、消息通道、消息轉換器和分區支持 ,它們共同構成了一個靈活且強大的消息處理平臺。

Spring Cloud Stream的編程模型分為兩種:注解式和函數式。注解式模型使用@EnableBinding@Input@Output@StreamListener等注解定義消息通道和處理邏輯;函數式模型則通過定義FunctionSupplierConsumer接口實現更簡潔的消息處理。這兩種模型都旨在降低消息處理的復雜度,使開發者能夠專注于業務邏輯。

二、誕生背景與設計動機

2.1 微服務架構的挑戰

在分布式微服務架構中,服務間的通信是一個關鍵挑戰。傳統方法通常采用RESTful API進行同步通信,但這帶來了緊耦合、延遲高和擴展性差等問題。消息驅動架構提供了一種更松耦合、異步且可擴展的通信方式,但直接使用消息中間件(如RabbitMQ或Kafka)的API往往會導致代碼與中間件緊密耦合,使得系統難以適應中間件的變化。

2.2 Spring生態的發展

Spring框架自誕生以來,一直在簡化Java開發。Spring Boot進一步簡化了Spring應用的創建和部署,而Spring Cloud則擴展了Spring Boot的功能,為微服務架構提供了一系列解決方案。Spring Cloud Stream作為Spring Cloud生態系統的一部分,旨在解決微服務間消息通信的復雜性,它繼承了Spring的簡潔性和可配置性,同時提供了對消息中間件的抽象。

2.3 Spring Integration的演進

Spring Cloud Stream的設計受到Spring Integration的啟發。Spring Integration是一個用于構建消息驅動應用的框架,提供了豐富的消息路由、轉換和處理功能。Spring Cloud Stream在Spring Integration的基礎上,進一步簡化了消息中間件的集成,提供了更直觀的API和配置方式,使開發者能夠快速構建消息驅動的微服務。

三、架構設計與核心組件

3.1 分層架構設計

Spring Cloud Stream采用分層架構設計,主要包括以下層次:

  1. 應用層:開發者編寫業務邏輯,定義消息處理函數。
  2. 綁定層:通過Binder將應用層與消息中間件連接。
  3. 中間件層:具體的消息中間件實現(如Kafka、RabbitMQ等)。

這種分層設計確保了應用層與中間件層的解耦,使得中間件的替換變得簡單。

3.2 核心組件詳解

Spring Cloud Stream的核心組件包括:

Binder:Binder是應用與消息中間件之間的橋梁。它負責創建和管理消息通道,處理消息的序列化和反序列化,并實現消息的發送和接收。Spring Cloud Stream提供了多種Binder實現,包括Kafka、RabbitMQ、AWS Kinesis和Azure Event Hubs等。

消息通道:消息通道是應用與外部消息系統之間的連接點。Spring Cloud Stream定義了三種類型的通道:輸入通道(@Input)、輸出通道(@Output)和處理器通道(同時包含輸入和輸出)。開發者可以通過這些通道發送和接收消息。

消息轉換器:消息轉換器負責將應用層的消息對象轉換為中間件支持的消息格式,反之亦然 。Spring Cloud Stream提供了多種內置轉換器,也支持自定義轉換器。

分區支持:分區是消息中間件(如Kafka)中用于提高吞吐量和實現并行處理的機制。Spring Cloud Stream提供了一個統一的分區抽象,使得開發者可以在不關心具體中間件實現的情況下,利用分區功能提高系統性能

3.3 編程模型

Spring Cloud Stream提供了兩種編程模型:

注解式模型:使用@EnableBinding注解啟用綁定器,并通過@Input@Output定義消息通道。消息處理通過@StreamListener注解實現。

函數式模型:通過定義FunctionSupplierConsumer接口實現消息處理邏輯,配置通過spring.cloud.stream.function狹義屬性定義。函數式模型在Spring Cloud Stream 3.x版本中成為推薦方式,提供了更簡潔的API。

這兩種模型都遵循Spring的配置即代碼理念,使開發者能夠以聲明式的方式定義消息處理邏輯,而無需關心底層實現細節。

四、解決的問題與優勢

4.1 解決的核心問題

Spring Cloud Stream主要解決了以下幾個關鍵問題:

消息中間件耦合:傳統消息系統開發中,應用代碼與特定消息中間件的API緊密耦合,使得中間件的替換變得困難。Spring Cloud Stream通過Binder抽象層隔離了應用與中間件的實現細節 ,使代碼與中間件無關。

配置復雜度:直接使用消息中間件API需要處理大量配置細節,如連接參數、交換機/主題創建、隊列綁定等。Spring Cloud Stream通過聲明式配置簡化了這些過程 ,使開發者能夠專注于業務邏輯。

分區與消費組管理:消息中間件的分區和消費組機制復雜,需要開發者手動管理。Spring Cloud Stream提供了一套統一的分區和消費組管理API,簡化了這些功能的使用。

消息轉換:不同消息中間件對消息格式有不同的要求,需要開發者手動處理轉換。Spring Cloud Stream內置了多種消息轉換器 ,并支持自定義轉換器,使消息格式轉換變得透明。

4.2 主要優勢

Spring Cloud Stream相比傳統消息系統和同類框架具有以下優勢:

中間件無關性:通過Binder抽象層,開發者可以輕松切換消息中間件,無需修改應用代碼。

聲明式配置:使用YAML/Properties文件進行配置,避免了硬編碼,提高了配置的靈活性和可維護性。

簡化API:提供了簡潔的API和注解,使消息處理邏輯的編寫變得簡單直觀。

統一的消息處理模型:提供了一套統一的消息處理模型,包括分區、消費組和消息轉換等高級功能。

與Spring生態無縫集成:與Spring Boot、Spring Cloud和Spring Integration等框架無縫集成,可以與其他Spring Cloud組件(如Config、Bus等)協同工作 。

五、關鍵特性與高級功能

5.1 消息中間件抽象

Spring Cloud Stream的核心優勢在于其消息中間件抽象能力 。通過Binder接口,框架屏蔽了不同消息中間件的實現差異,為開發者提供了一致的編程模型。這種抽象使得應用可以輕松切換消息中間件,而無需修改業務邏輯代碼。

目前,Spring Cloud Stream支持多種消息中間件,包括:

  • Apache Kafka
  • RabbitMQ
  • AWS Kinesis
  • Azure Event Hubs
  • Google Pub/Sub

每種中間件都有對應的Binder實現,如spring-cloud-stream-binder-kafkaspring-cloud-stream-binder-rabbit

5.2 分區與負載均衡

分區是Spring Cloud Stream中的一個關鍵特性,它允許應用在多個實例之間分配數據處理任務。在有狀態處理場景(如時間窗口計算)中,確保同一數據由同一實例處理至關重要。Spring Cloud Stream提供了統一的分區API,使得開發者可以在不關心具體中間件實現的情況下,利用分區功能提高系統性能。

分區支持包括:

  • 分區鍵表達式:通過partitionKeyExpression屬性定義分區鍵,決定消息發送到哪個分區 。
  • 分區計數:通過partitionCount屬性指定消息的分區數量 。
  • 負載均衡策略:支持多種負載均衡策略,如輪詢、隨機等,確保消息在不同分區間均勻分布。
5.3 函數式編程模型

函數式編程模型是Spring Cloud Stream 3.x版本中的重要特性,它提供了更簡潔的消息處理方式。在函數式模型中,開發者只需定義消息處理函數,而無需關注消息通道的創建和綁定。

函數式模型支持以下接口:

  • Function<T, R>:處理輸入消息并生成輸出消息。
  • Supplier<T>:生成輸出消息。
  • Consumer<T>:處理輸入消息。

通過spring.cloud.stream.function狹義屬性,可以指定應用使用的函數。

5.4 動態綁定

Spring Cloud Stream支持動態綁定,允許應用在運行時切換消息中間件或通道配置。通過BinderAwareChannelResolverExpressionEvaluatingRouter,應用可以根據需要動態創建和路由消息通道。

動態綁定的配置包括:

  • spring.cloud.stream dynamicDestinations:指定允許動態綁定的通道名稱白名單?。
  • spring.cloud.stream.bindings.*.destination:定義通道綁定的消息中間件目標(如Kafka的Topic或RabbitMQ的Exchange)。
5.5 死信隊列支持

消息處理失敗是分布式系統中的常見問題,Spring Cloud Stream提供了對死信隊列(DLQ)的支持 ,允許應用將處理失敗的消息發送到特定隊列,以便后續分析或重試。

死信隊列的配置包括:

  • spring.cloud.stream.bindings.*.consumer.max-attempts:指定消息處理的最大重試次數。
  • spring.cloud.stream.bindings.*.consumer RepublishMessageRecoverer:配置消息重試失敗后的恢復策略,如發送到死信隊列 。
5.6 批量消費

在處理高吞吐量消息時,批量消費可以顯著提高處理效率。Spring Cloud Stream支持批量消費模式,允許消費者一次性處理多條消息。

批量消費的配置包括:

  • spring.cloud.stream.bindings.*.consumer.batch-mode=true:啟用批量消費模式 。
  • spring.cloud.stream.bindings.*.consumer.batch-size=100:指定批量消費的消息數量 。

六、與同類產品的對比

6.1 與傳統消息系統對比

傳統消息系統(如直接使用RabbitMQ或Kafka客戶端)需要開發者手動處理消息中間件的細節,連接管理、交換機/主題創建、隊列綁定等。這些硬編碼的配置使得系統難以適應中間件的變化。

特性Spring Cloud Stream傳統消息系統
中間件耦合低(通過Binder抽象)高(硬編碼API)
配置復雜度簡單(聲明式配置)復雜(手動配置)
分區支持統一API中間件特定API
消息轉換內置支持需手動實現
跨中間件遷移簡單困難
6.2 與Kafka Streams對比

Kafka Streams是Kafka生態中的流處理庫,它提供了強大的流處理能力,但僅限于Kafka環境。與Kafka Streams相比,Spring Cloud Stream更專注于消息通信的抽象,支持多種消息中間件,更適合需要靈活切換中間件的場景。

特性Spring Cloud StreamKafka Streams
中間件支持多種(Kafka、RabbitMQ等)僅Kafka
編程模型注解式/函數式流處理API(KStream、KTable)
中間件耦合高(深度集成Kafka)
適用場景通用消息通信Kafka特定流處理
部署靈活性中(依賴Kafka環境)
6.3 與AWS Kinesis對比

AWS Kinesis是AWS云平臺上的流數據處理服務,它提供了強大的流處理能力,但僅限于AWS環境。Spring Cloud Stream通過AWS Kinesis Binder提供了對Kinesis的支持,但相比直接使用Kinesis SDK,Spring Cloud Stream提供了更統一的API和配置方式。

特性Spring Cloud Stream + KinesisAWS Kinesis SDK
云平臺支持AWS、Azure、Google等僅AWS
中間件抽象
配置方式聲明式(YAML/Properties)程序化配置
與其他Spring組件集成完美支持需額外適配
代碼可移植性低(AWS特定)

七、使用方法與最佳實踐

7.1 依賴配置

Spring Cloud Stream的依賴配置相對簡單,主要通過添加對應的消息中間件Binder實現。以下是基于Spring Boot 3.5.3和Spring Cloud 2025.0.0的依賴配置示例:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.5.3</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2025.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- Spring Cloud Stream核心依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream</artifactId></dependency><!-- Kafka Binder依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId></dependency><!-- 或者RabbitMQ Binder依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency>
</dependencies>
7.2 函數式編程實現

函數式編程模型是Spring Cloud Stream 3.x版本中的推薦方式,它提供了更簡潔的API。以下是一個使用函數式模型的消息生產者和消費者示例:

// 生產者
@Service
public class OrderProducer {@Beanpublic Supplier<Order> createOrder() {return () -> {Order order = new Order();order.setOrderId UUID.randomUUID().toString());order.set productId "P123";order.set quantity 10;log.info("發送訂單: {}", order.getOrderId());return order;};}
}// 消費者
@Service
public class InventoryConsumer {@Beanpublic Consumer<Order> updateInventory() {return order -> {log.info("接收訂單: {}", order.getOrderId());// 更新庫存邏輯};}
}// 主類
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

application.yml中配置:

spring:cloud:stream:function:definition: createOrder;updateInventory.bindings:createOrder-out-0:destination: order-topicupdateInventory-in-0:destination: order-topicgroup: inventory-group
7.3 注解式模型實現

注解式模型是Spring Cloud Stream的傳統方式,它提供了更細粒度的控制。以下是一個使用注解式模型的消息生產者和消費者示例:

// 定義綁定接口
public interface OrderBinding {String ORDER = "order";@Output(ORDER)MessageChannel orderChannel();
}// 生產者
@RestController
public class OrderController {@Autowiredprivate OrderBinding orderBinding;@PostMapping("/orders")public String createOrder(@RequestBody Order order) {// 發送消息orderBinding.orderChannel().send(MessageBuilder.withPayload(order).setHeader("partitionKey", order的產品ID).build());return "訂單創建成功";}
}// 消費者
@Service
public class InventoryService {@EnableBinding(OrderBinding.class)public class InventoryConsumer {@StreamListener(OrderBinding.ORDER)public void handleOrder(Order order) {// 更新庫存邏輯}}
}// 主類
@SpringBootApplication
public class InventoryServiceApplication {public static void main(String[] args) {SpringApplication.run(InventoryServiceApplication.class, args);}
}

application.yml中配置:

spring:cloud:stream:.bindings:order:destination: order-topicgroup: inventory-group.kafka:binder:brokers: localhost:9092defaultBrokerPort: 9092
7.4 動態綁定

動態綁定允許應用在運行時切換消息通道的綁定目標,這對于需要靈活路由消息的場景非常有用。以下是一個動態綁定的示例:

@RestController
public class DynamicDestinationController {@Autowiredprivate StreamBridge streamBridge;@PostMapping("/send")public String sendDynamicMessage(@RequestParam String message,@RequestHeader("dest") String destination) {// 動態發送消息streamBridge.send(destination + "-out-0",MessageBuilder.withPayload(message).build());return "消息發送成功";}
}

application.yml中配置:

spring:cloud:stream:dynamicDestinations: dynamic1,dynamic2,dynamic3.bindings:dynamic1-out-0:destination: dynamic1-topicdynamic2-out-0:destination: dynamic2-topicdynamic3-out-0:destination: dynamic3-topic
7.5 批量消費

批量消費可以顯著提高高吞吐量場景下的處理效率。以下是一個啟用批量消費的示例:

@Service
public class BatchConsumer {@Beanpublic Consumer<List<Order>> batchHandleOrder() {return orders -> {log.info("接收批量訂單: {}條", orders.size());// 批量處理訂單邏輯};}
}

application.yml中配置:

spring:cloud:stream:.bindings:batchHandleOrder-in-0:destination: order-topicconsumer:batch-mode: truebatch-size: 100
7.6 死信隊列配置

死信隊列(DLQ)是處理消息處理失敗的重要機制 。以下是一個配置死信隊列的示例:

spring:cloud:stream:.bindings:input:destination: order-topicgroup: inventory-groupconsumer:max-attempts: 3republish-to-dlq: truedlq-name: order-dlq-topic.kafka:binder:default-retryable: true

當消息處理失敗超過max-attempts次數時,消息會被自動發送到指定的死信隊列。

7.7 最佳實踐

在使用Spring Cloud Stream時,以下是一些最佳實踐

  1. 版本兼容性:確保Spring Boot和Spring Cloud版本的兼容性。例如,Spring Boot 3.5.3對應Spring Cloud 2025.0.0。

  2. 分區策略:合理選擇分區鍵,確保同一數據由同一消費者實例處理。例如,可以使用partitionKeyExpression: payload的產品ID將同一產品的訂單路由到同一分區。

  3. 消息頭處理:充分利用消息頭傳遞元數據,如時間戳、優先級等。例如,可以使用setHeader("x-delay", 5000)實現消息的延遲發送 。

  4. 重試機制:合理配置重試次數和退避策略,避免消息處理失敗導致系統不穩定。例如,可以使用back-off-initial-interval: 1000back-off-max-interval: 10000配置重試間隔 。

  5. 死信隊列監控:定期監控死信隊列中的消息,分析處理失敗原因,及時修復問題。

  6. 資源管理:在高吞吐量場景中,合理配置消費者數量和分區數量,確保系統資源的充分利用。

八、實際應用場景

8.1 事件驅動微服務

在事件驅動架構中,Spring Cloud Stream是構建微服務間通信的理想選擇。訂單服務在創建訂單后,可以發布一個OrderCreated事件,庫存服務、物流服務和通知服務等消費者可以監聽并處理這一事件,實現服務間的松耦合通信。

8.2 實時數據處理

Spring Cloud Stream適合實時數據處理場景,如日志分析、實時監控和交易處理等。通過結合函數式編程模型和批量消費功能,可以高效處理大量實時數據流。

8.3 微服務配置更新

Spring Cloud Bus可以與Spring Cloud Stream結合使用,實現微服務配置的動態更新。通過發布一個Refresh事件,可以通知所有訂閱該事件的服務重新加載配置,無需重啟整個系統。

8.4 服務間異步通信

在需要異步通信的場景中,Spring Cloud Stream提供了一種簡潔的解決方案 。例如,支付服務在處理支付請求后,可以異步通知訂單服務更新訂單狀態,避免同步調用帶來的延遲和性能問題。

九、未來發展趨勢

9.1 云原生支持

隨著云原生技術的發展,Spring Cloud Stream正在加強對其的支持。Spring Cloud Azure提供了對Azure Event Hubs和Service Bus的支持,而Spring Cloud Alibaba則提供了對阿里云消息服務的支持。這些云原生綁定器使開發者能夠在云環境中更輕松地使用Spring Cloud Stream。

9.2 與Kubernetes集成

Kubernetes已成為微服務部署的主流平臺 ,Spring Cloud Stream正在加強與Kubernetes的集成。例如,通過kafka-clientskafka行政等依賴,可以更好地管理Kafka集群在Kubernetes環境中的部署和擴展。

9.3 響應式編程支持

響應式編程(如Project Reactor)在處理高并發和異步操作方面具有顯著優勢,Spring Cloud Stream正在加強對其的支持。例如,通過FluxMono等響應式類型,可以更高效地處理消息流,并實現背壓(Backpressure)管理。

9.4 與Spring Cloud Function集成

Spring Cloud Function是Spring Cloud生態系統中的一個新興項目,它提供了一套統一的函數式API,可以與Spring Cloud Stream無縫集成。這種集成將進一步簡化消息驅動應用的開發,并提高代碼的可重用性。

9.5 與AI和機器學習結合

隨著AI和機器學習技術的發展,Spring Cloud Stream正在探索與這些技術的結合。通過將流處理與機器學習模型結合,可以實現更智能的消息處理和分析。這種結合將為微服務架構帶來更強大的數據處理能力。

十、總結與建議

Spring Cloud Stream是一個強大的框架,為微服務架構提供了統一的消息驅動通信模型 。它通過抽象化消息中間件的實現細節,簡化了消息處理的開發過程,使開發者能夠專注于業務邏輯。

在實際應用中,建議根據項目需求選擇合適的編程模型(函數式或注解式)和消息中間件。對于簡單場景,函數式模型提供了更簡潔的API;對于需要細粒度控制的場景,注解式模型提供了更多靈活性。同時,合理配置分區策略、消息頭和重試機制,可以提高系統的性能和可靠性。

隨著云原生和響應式編程的發展,Spring Cloud Stream將繼續演進,為微服務架構提供更強大的數據處理能力。開發者應該關注其最新版本和云原生綁定器的更新,以便更好地利用這些新技術。

Spring Cloud Stream是構建消息驅動微服務的理想選擇,它通過簡化消息中間件的集成和使用,提高了開發效率和系統可維護性。通過合理應用其特性,開發者可以構建更加靈活、高效和可靠的微服務架構。


?參考資料:
  • Spring Cloud Stream 文檔

?本博客專注于分享開源技術、微服務架構、職場晉升以及個人生活隨筆,這里有:

📌 技術決策深度文(從選型到落地的全鏈路分析)

💭 開發者成長思考(職業規劃/團隊管理/認知升級)

🎯 行業趨勢觀察(AI對開發的影響/云原生下一站)

關注我,每周日與你聊“技術內外的那些事”,讓你的代碼之外,更有“技術眼光”。

日更專刊:

🥇 《Thinking in Java》 🌀 java、spring、微服務的序列晉升之路!
🏆 《Technology and Architecture》 🌀 大數據相關技術原理與架構,幫你構建完整知識體系!

關于博主:

🌟博主GitHub

🌞博主知識星球


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

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

相關文章

內網后滲透攻擊--linux系統(權限維持)

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目)

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) code review! 參考筆記: 1.C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) 2.C++筆記之信號量、互斥量與PV操作 參考鏈接 1.嵌入式基礎知識-信號量,PV原語與前趨圖 2.信號量、PV操作及軟考高級試題解析…

布隆過濾器:快速判斷某個元素是否存在

特點&#xff1a;高效、空間占用小、允許一定誤判 布隆過濾器在 Redis 里的實現機制&#xff0c;核心就是&#xff1a;用一個大位圖&#xff08;bitmap&#xff09;來表示集合 位圖長度 m 初始值都是 0 插入元素時通過 k 個不同的哈希函數&#xff0c;對元素做哈希 每個哈希結…

C# 修改基類List中某一元素的子類類型

描述&#xff1a;基類&#xff1a;BaseClass子類1&#xff1a;A子類2&#xff1a;B然后我有一個List<BaseClass>類型的鏈表:list&#xff0c;我先往list中添加了兩個元素&#xff1a;第一個元素為A類型&#xff0c;第二個元素為B類型&#xff0c;然后我想改變第一個元素類…

基于STM32智能陽臺監控系統

基于STM32智能陽臺監控系統&#xff08;程序&#xff0b;原理圖元件清單&#xff09;功能介紹具體功能&#xff1a;1.采用STM32作為主控芯片實現檢測和控制&#xff1b;2.通過光敏電阻采集光線&#xff0c;將當前光線值在LCD1602顯示&#xff0c;低于50%控制LED亮&#xff0c;高…

動態維護有效區間:滑動窗口

右指針不斷移動獲取解&#xff0c;左指針不斷移動縮小解范圍 左指針的意義非常重要&#xff0c;相當于一個標兵&#xff0c;不斷與這個標兵進行比較&#xff0c;如果符合要求&#xff0c;這左指針進行移動&#xff0c;并進行操作&#xff0c;如果不符合要求&#xff0c;則左指針…

嵌入式學習---(單片機)

1.UART的概念通用異步收發器&#xff0c;2個串口&#xff08;1個串口被用于ISP下載程序&#xff0c;1個串口被用于和主機之間的通信&#xff09;&#xff0c;RXD(接收信號線) TXD(發送信號線)2、單工、半雙工、全雙工概念對比維度單工&#xff08;Simplex&#xff09;半雙工&am…

基于單片機的寵物屋智能系統設計與實現(論文+源碼)

1設計思路本設計基于單片機的寵物屋智能系統核心是實現對寵物生活環境及狀態的智能管理。系統以單片機為中樞&#xff0c;連接紅外測溫傳感器&#xff0c;可實時精準捕捉寵物體溫變化&#xff0c;以便及時發現健康異常&#xff1b;水位檢測傳感器時刻監測飲用水余量&#xff0c…

【面試】Java基礎面試題

1. Java 基本數據類型有哪些&#xff1f;場景&#xff1a;面試官問「String 是不是基本類型&#xff1f;」答案要點&#xff1a;8 種基本類型&#xff1a;byte, short, int, long, float, double, char, boolean。String 是引用類型。追問鏈條&#xff1a;問&#xff1a;為什么…

PHP云課堂在線網課系統 多功能網校系統 在線教育系統源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 云課堂&#xff0c;依托騰訊云基礎服務架構&#xff0c;采用C擴展框架Phalcon開發&#xff0c; 系統功能 實現了點播、直播、專欄、會員、積分、秒殺、微聊等。 友情提示&#xff1a;…

GEM5學習(4): 運行全系統模式的ARM系統

詳細說明可以見官網 gem5: Extending gem5 for ARM 下載鏡像 mkdir -p cpu_tests/benchmarks/bin/arm cd cpu_tests/benchmarks/bin/arm wget dist.gem5.org/dist/v22-0/test-progs/cpu-tests/bin/arm/Bubblesort wget dist.gem5.org/dist/v22-0/test-progs/cpu-tests/bin/arm…

快捷:常見ocr學術數據集預處理版本匯總(適配mmocr)

快捷&#xff1a;常見ocr學術數據集預處理版本匯總&#xff08;適配mmocr&#xff09;快捷&#xff1a;常見ocr學術數據集預處理版本匯總&#xff08;適配mmocr&#xff09;狀態指標驗證快捷&#xff1a;常見ocr學術數據集預處理版本匯總&#xff08;適配mmocr&#xff09; 狀…

從抽象到實現:Elasticsearch數據類型及其底層Lucene數據結構的深度解析

第一部分&#xff1a;Lucene基礎&#xff1a;核心索引結構Elasticsearch的強大功能根植于其核心——Apache Lucene&#xff0c;一個高性能、功能完備的搜索引擎庫 1。要深入理解Elasticsearch如何處理各種數據類型&#xff0c;首先必須剖析構成Lucene索引的三個基本數據結構&am…

Claude Code核心功能操作指南

&#xff08;一&#xff09;核心交互面板&#xff1a;認識操作界面 登錄后進入 Claude Code 主界面&#xff0c;核心區域分為三部分&#xff0c;各模塊功能清晰&#xff1a;可以通過 注冊免費體驗。左側導航欄&#xff1a;包含 “新建任務”“歷史記錄”“收藏夾”“幫助中心”…

數據倉庫進化:Agent驅動數智化新范式

目錄 回顧&#xff1a;從 "人為中心" 的數倉&#xff0c;到大數據與云數倉的進化 AI Agent 成為數據的 "新用戶" Agentic Data Stack 如何打破低效與內耗 企業數智化的新范式 案例與趨勢展望 所有軟件都會被 Agent 改寫一遍 經過半個世紀的數據倉庫發…

什么是shellcode

好的&#xff0c;我們來詳細地解釋一下什么是 Shellcode。核心定義Shellcode 是一段精煉的、用作有效載荷&#xff08;Payload&#xff09; 的機器代碼。它之所以叫這個名字&#xff0c;是因為最初這類代碼的唯一目的就是啟動一個命令行 Shell&#xff08;例如 /bin/sh&#xf…

線性代數 | 行圖像 / 列圖像

注&#xff1a;本文為 “線性代數 | 行圖像 / 列圖像” 相關合輯。 圖片清晰度受引文原圖所限。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 MIT 線性代數筆記一 行圖像和列圖像 線性代數行圖像與列圖像解析 herosunly 已于 2022-01-25 15:34:26 …

Batch Normalization:深度學習中的“加速器”與“穩定器”

在深度學習的世界里&#xff0c;神經網絡的訓練常常充滿了挑戰。從復雜的梯度問題到漫長的收斂過程&#xff0c;每一個環節都可能成為阻礙我們前進的絆腳石。而今天&#xff0c;我們要深入探討的 BatchNormalizationBatch NormalizationBatchNormalization&#xff08;批量歸一…

軟考備考①

一、數值及其轉換和數據的表示1、數值及其轉換①任意進制到十進制以二進制為例&#xff0c;以小數點做分割&#xff0c;小數點以左從二的零次方開始&#xff0c;小數點以右從二的負一次方開始。②十進制到任意進制利用短除法③二進制到十六進制分為小數點前和小數點后&#xff…

小程序緩存數據字典

import { getDict } from /api/profile;const CACHE_KEY DICT_CACHE;let dictCache new Map();// 初始化時加載緩存const loadCache () > {const cache uni.getStorageSync(CACHE_KEY);if (cache) {dictCache new Map(JSON.parse(cache));}};// 保存緩存到Storageconst…