9.1.領域驅動設計

目錄

一、領域驅動設計核心哲學

  1. 戰略設計與戰術設計的分野 ? 戰略設計:限界上下文(Bounded Context)與上下文映射(Context Mapping) ? 戰術設計:實體、值對象、聚合根、領域服務的構建原則

  2. 統一語言(Ubiquitous Language)實踐 ? 領域專家與開發團隊的協作范式(Event Storming工作坊設計) ? 代碼與文檔的同步策略(Swagger + DDD Glossary)

二、領域模型設計與實現

  1. 領域模型構建方法論 ? 四色建模法:時標對象(Moment-Interval)、角色(Role)、描述(Description)、參與方(Party) ? 事件風暴(Event Storming):從業務事件到領域模型的推導流程

  2. 戰術模式落地 ? 聚合根設計:一致性邊界與并發控制(樂觀鎖/悲觀鎖策略) ? 領域事件:事件溯源(Event Sourcing)與消息中間件(Kafka/RocketMQ集成) ? 防腐層(Anti-Corruption Layer):遺留系統適配與第三方服務隔離

三、大廠領域驅動架構實戰

  1. 阿里電商商品中心案例 ? 挑戰:億級SKU的復雜屬性管理與搜索優化 ? 方案: ? 商品核心域與供應鏈支撐域的限界上下文拆分 ? 基于領域事件的商品狀態同步(Binlog + Canal實時監聽)

  2. 騰訊金融支付清結算系統 ? 挑戰:多幣種混合結算的復雜規則與審計合規 ? 方案: ? 值對象模式實現貨幣計算(BigDecimal精度控制 + 匯率服務防腐層) ? 聚合根事務一致性保障(Saga模式 + 分布式事務框架Seata)

  3. 美團外賣訂單履約系統 ? 挑戰:高峰期每秒10萬訂單的領域狀態機管理 ? 方案: ? 訂單聚合根的并發控制(Redis分布式鎖 + 數據庫行鎖混合策略) ? 領域事件驅動履約流程(訂單創建 → 支付 → 派單 → 配送的狀態遷移)

四、DDD與現代化架構融合

  1. 微服務架構下的DDD落地 ? 限界上下文與服務邊界的映射關系 ? 一上下文一服務 vs 一上下文多服務(基于團隊與業務復雜度權衡) ? 領域模型與REST/GraphQL API的設計協同 ? API資源模型到領域模型的轉換策略(HATEOAS與領域動作的映射)

  2. 云原生與DDD的協同演進 ? Sidecar模式承載防腐層邏輯:Envoy WASM實現協議轉換與數據清洗 ? Serverless領域函數設計:AWS Lambda實現無狀態領域服務(如風控規則引擎)

  3. 中臺化架構的DDD適配 ? 業務中臺的核心域抽象:用戶中心、商品中心、交易中心的領域服務下沉 ? 數據中臺的領域模型擴展:基于領域事件的實時數倉構建(Flink + Hudi)

五、工具鏈與效能提升

  1. DDD全生命周期工具 ? 設計工具:Visual Paradigm領域建模、Miro在線事件風暴 ? 代碼生成:IDEA插件(如DDD Plugin)自動生成聚合根/倉儲代碼 ? 測試驗證:Cucumber + SpecFlow實現領域場景BDD測試

  2. 框架與中間件集成 ? DDD框架選型:COLA架構 vs Axon Framework vs 自研框架 ? 領域事件總線:Spring Cloud Stream與RocketMQ/Redis Stream集成



一、領域驅動設計核心哲學


1. 戰略設計與戰術設計的分野

戰略設計:限界上下文與上下文映射

限界上下文(Bounded Context) 是領域驅動設計的核心戰略模式,用于界定領域模型的邊界。每個限界上下文對應一個獨立的業務子域,擁有專屬的領域模型和統一語言。

示例:電商系統上下文劃分 ? 商品上下文:管理SKU、庫存、類目屬性。 ? 訂單上下文:處理下單、支付、履約流程。 ? 用戶上下文:負責注冊、登錄、權限管理。

上下文映射(Context Mapping) 定義不同上下文間的交互方式,常見模式包括: ? 合作關系(Partnership):兩個上下文緊密協作,共享部分模型(如訂單與物流)。 ? 防腐層(Anti-Corruption Layer):隔離外部系統或遺留代碼,避免污染核心域(如集成第三方支付)。


戰術設計:實體、值對象、聚合根的構建原則

? 實體(Entity):具有唯一標識的對象(如訂單ID)。

public class Order { ?private String orderId; ?// 唯一標識 ?private OrderStatus status; ?// 業務行為方法 ?public void cancel() { ?this.status = OrderStatus.CANCELLED; ?} ?
} ?

? 值對象(Value Object):無唯一標識,通過屬性定義(如地址)。

public class Address { ?private String province; ?private String city; ?// 值對象相等性由屬性決定 ?@Override ?public boolean equals(Object obj) { ... } ?
} ?

? 聚合根(Aggregate Root):一致性邊界的管理者(如訂單聚合根控制訂單項變更)。

public class OrderAggregate { ?private Order order; ?private List<OrderItem> items; ?// 保證業務規則:訂單總金額≥0 ?public void addItem(OrderItem item) { ?if (this.calculateTotal() + item.getPrice() < 0) { ?throw new IllegalStateException("Invalid total amount"); ?} ?this.items.add(item); ?} ?
} ?

2. 統一語言(Ubiquitous Language)實踐

領域專家與開發團隊的協作范式

通過 Event Storming 工作坊 對齊業務與技術的理解:

  1. 事件風暴流程: ? 識別領域事件:如“訂單已創建”、“支付已成功”。 ? 標注命令與角色:誰(用戶/系統)觸發了什么操作。 ? 劃分限界上下文:確定事件歸屬的領域邊界。

  2. 產出物: ? 事件流圖(貼在墻上的便簽矩陣)。 ? 核心領域模型初稿。

代碼與文檔的同步策略

? Swagger 文檔:API 設計需反映領域動作(如 /orders/{id}/cancel)。 ? DDD Glossary:維護術語表,確保業務詞匯在代碼中一致。

| 術語 ? ? ? ? | 定義 ? ? ? ? ? ? ? ? ? ? ? ?  | 代碼對應類 ? ? ? | ?
|--------------|-----------------------------|------------------| ?
| 訂單 ? ? ? ? | 用戶購買商品的交易憑證 ? ? ? ? | OrderAggregate ? | ?
| 庫存保留 ? ? | 預占商品庫存以確保可售性 ? ? ?  | InventoryService | ?

二、領域模型設計與實現


1. 領域模型構建方法論

四色建模法:時標對象、角色、描述、參與方

? 時標對象(Moment-Interval):記錄業務關鍵時間點或時段(如訂單創建時間)。 ? 角色(Role):對象在特定場景下的職責(如用戶作為“買家”角色)。 ? 描述(Description):對象的靜態屬性(如商品規格參數)。 ? 參與方(Party/Place/Thing):參與業務的主體(如用戶、倉庫、物流公司)。

示例:電商訂單四色模型

classDiagram ?class Order { ?<<Moment>> ?String orderId ?Date createTime ?void cancel() ?} ?class User { ?<<Party>> ?String userId ?String role ?} ?Order --> User : placed by ?

事件風暴(Event Storming)推導領域模型

從業務事件到代碼模型的轉化流程:

  1. 事件抽取:梳理業務流程中的領域事件(如 OrderPlacedPaymentCompleted)。

  2. 命令識別:確定觸發事件的操作(如 PlaceOrderCommand)。

  3. 聚合根設計:將事件和命令歸屬到聚合根(如 OrderAggregate 處理訂單狀態變更)。


2. 戰術模式落地

聚合根設計:一致性邊界與并發控制

? 一致性規則:聚合根負責維護內部對象的狀態一致性。

public class OrderAggregate { ?private List<OrderItem> items; ?// 添加商品時校驗庫存 ?public void addItem(Product product, int quantity) { ?if (!product.isAvailable(quantity)) { ?throw new InsufficientStockException(); ?} ?items.add(new OrderItem(product, quantity)); ?} ?
} ?

? 并發控制策略: ? 樂觀鎖:通過版本號(@Version)避免更新沖突。 ? 悲觀鎖:數據庫 SELECT FOR UPDATE 鎖定聚合根。

領域事件:事件溯源與消息中間件集成

? 事件溯源(Event Sourcing):通過事件序列重建聚合根狀態。

public class OrderAggregate { ?private List<DomainEvent> changes = new ArrayList<>(); ?public void cancel() { ?apply(new OrderCancelledEvent(this.orderId)); ?} ?private void apply(DomainEvent event) { ?// 更新狀態并記錄事件 ?changes.add(event); ?} ?
} ?

? Kafka集成:發布領域事件供其他上下文訂閱。

 ?@Service ?public class OrderEventPublisher { ?@Autowired ?private KafkaTemplate<String, DomainEvent> kafkaTemplate; ?
?public void publish(OrderCancelledEvent event) { ?kafkaTemplate.send("order-events", event); ?} ?} ?
防腐層(Anti-Corruption Layer)隔離第三方服務

場景:集成外部支付系統,避免其API污染核心支付域模型。

public class PaymentAdapter {  // 轉換外部支付接口響應為內部領域模型  public PaymentResult adapt(ThirdPartyPaymentResponse response) {  return new PaymentResult(  response.getStatus().equals("SUCCESS") ? PaymentStatus.SUCCESS : PaymentStatus.FAILED,  response.getTransactionId()  );  }  
}  

總結

本節深入解析了DDD的核心哲學與戰術實踐: ? 戰略設計 通過限界上下文劃分復雜業務,戰術設計 提供可落地的代碼結構。 ? 統一語言 確保業務與技術的一致性,事件風暴 是團隊協作的關鍵工具。 ? 聚合根與領域事件 是保障一致性和擴展性的核心模式,防腐層 解決系統集成中的模型污染問題。

大廠實戰經驗: ? 阿里商品中心:通過聚合根管理十億級SKU的庫存一致性。 ? 騰訊支付系統:利用事件溯源實現分布式事務的最終一致性。 ? 美團訂單履約:通過防腐層隔離第三方物流接口,提升系統穩定性。

這些模式與案例為企業構建高內聚、低耦合的領域模型提供了完整的方法論支撐。


三、大廠領域驅動架構實戰


1. 阿里電商商品中心案例

挑戰:億級SKU的復雜屬性管理與搜索優化

? 問題核心:商品屬性動態擴展(如服裝類目的尺碼、顏色)、多維度搜索性能瓶頸。 ? 業務復雜度:SKU屬性組合爆炸(如手機型號×顏色×存儲容量)。

解決方案
  1. 限界上下文拆分: ? 商品核心域:管理基礎商品信息、類目屬性、SKU生成規則。 ? 供應鏈支撐域:處理庫存管理、供應商協同,通過防腐層隔離ERP系統。

    // 商品核心域聚合根:ProductAggregate  
    public class ProductAggregate {  private String productId;  private Map<String, Object> dynamicAttributes; // 動態屬性存儲  public void addAttribute(String key, Object value) {  dynamicAttributes.put(key, value);  }  
    }  
  2. 領域事件驅動狀態同步: ? Binlog監聽:通過Canal捕獲MySQL變更,發布商品更新事件。 ? Elasticsearch同步:消費事件更新搜索索引,實現近實時搜索(1秒內延遲)。

    # Canal客戶端監聽Binlog  
    client = CanalClient(host='mysql-master')  
    client.subscribe("mall.product")  
    for change in client.listen():  emit_event(ProductUpdatedEvent(data=change.row_data))  

2. 騰訊金融支付清結算系統

挑戰:多幣種混合結算與審計合規

? 精度問題:多幣種匯率轉換導致的小數位丟失(如0.1 USD = 0.78 HKD)。 ? 審計追蹤:需記錄每一筆結算的完整軌跡以滿足PCI-DSS標準。

解決方案
  1. 值對象模式實現貨幣計算

    @ValueObject  
    public class Money {  private final BigDecimal amount;  private final Currency currency;  public Money add(Money other) {  BigDecimal converted = exchange(other); // 調用匯率服務  return new Money(this.amount.add(converted), this.currency);  }  
    }  
  2. Saga模式保障事務一致性: ? Seata分布式事務:將結算拆分為“預扣款→匯率轉換→最終結算”三個階段。 ? 補償事務:若某階段失敗,自動觸發反向操作(如退款)。

    @GlobalTransactional  
    public void settle(Order order) {  deductFunds(order);     // 階段1:扣款  convertCurrency(order); // 階段2:匯率轉換  finalSettle(order);    // 階段3:最終結算  
    }  

3. 美團外賣訂單履約系統

挑戰:高峰每秒10萬訂單的并發控制與狀態管理

? 并發沖突:同一騎手被多個訂單分配,導致狀態覆蓋。 ? 狀態機復雜度:訂單需經歷“創建→支付→派單→配送→完成”等十多個狀態遷移。

解決方案
  1. 混合鎖策略: ? Redis分布式鎖:粗粒度鎖保障派單階段互斥。 ? 數據庫行鎖:細粒度鎖控制訂單項更新。

    public void assignRider(String orderId, String riderId) {  String lockKey = "order_assign:" + orderId;  if (redisLock.tryLock(lockKey, 3)) {  try {  Order order = orderRepo.selectForUpdate(orderId); // 行鎖  order.assignRider(riderId);  } finally {  redisLock.unlock(lockKey);  }  }  
    }  
  2. 領域事件驅動狀態機: ? 狀態遷移規則:通過事件觸發狀態變更,避免硬編碼。

    public class OrderStateMachine {  @Transition(on = "PAYMENT_COMPLETED", from = "CREATED", to = "PAID")  public void onPaymentComplete(OrderEvent event) {  // 檢查業務規則:如訂單金額是否匹配  }  
    }  

四、DDD與現代化架構融合


1. 微服務架構下的DDD落地

限界上下文與服務邊界映射

? 一上下文一服務:適用于團隊獨立、業務復雜度低的場景(如用戶服務)。 ? 一上下文多服務:當上下文內存在多個子域時(如訂單服務拆分為訂單創建、訂單查詢)。

API與領域模型協同設計

? RESTful資源映射

@PostMapping("/orders/{id}/cancel")  
public ResponseEntity<Void> cancelOrder(@PathVariable String id) {  orderAppService.cancel(id); // 調用領域服務  return ResponseEntity.ok().build();  
}  

? HATEOAS超媒體驅動

{  "orderId": "123",  "status": "PAID",  "_links": {  "cancel": { "href": "/orders/123/cancel", "method": "POST" }  }  
}  

2. 云原生與DDD協同演進

Sidecar模式實現防腐層

? Envoy WASM過濾:轉換第三方協議(如SOAP→REST)。

# Envoy WASM配置  
filters:  
- name: wasm  config:  vm_config:  runtime: "envoy.wasm.runtime.v8"  code:  local:  filename: "/etc/envoy/soap_to_rest.wasm"  
Serverless領域函數

? AWS Lambda風控規則引擎

def lambda_handler(event, context):  risk_score = calculate_risk(event['user_id'])  return {"risk_level": "HIGH" if risk_score > 80 else "LOW"}  

3. 中臺化架構的DDD適配

業務中臺核心域抽象

? 用戶中心:抽象認證、權限管理為通用領域服務。 ? 商品中心:提供標準化的類目管理、SKU生成API。

數據中臺實時數倉構建

? Flink處理領域事件

DataStream<OrderEvent> stream = env.addSource(kafkaSource);  
stream.keyBy(event -> event.getUserId())  .window(TumblingEventTimeWindows.of(Time.hours(1)))  .aggregate(new OrderCountAggregate());  

五、工具鏈與效能提升


1. DDD全生命周期工具

設計工具

? Visual Paradigm建模

classDiagram  class Order {  -String orderId  -OrderStatus status  +cancel()  }  Order --> OrderItem : contains  
代碼生成

? IDEA DDD插件:自動生成聚合根、倉儲接口。

// 自動生成倉儲接口  
public interface OrderRepository extends Repository<Order, String> {  Order findByOrderId(String orderId);  
}  
BDD測試驗證

? Cucumber場景定義

Feature: Order Cancellation  Scenario: User cancels an unpaid order  Given an order with status "CREATED"  When the user cancels the order  Then the order status should be "CANCELLED"  

2. 框架與中間件集成

DDD框架選型

? COLA架構:阿里開源的輕量級DDD框架,模塊化清晰。

<!-- COLA組件依賴 -->  
<dependency>  <groupId>com.alibaba.cola</groupId>  <artifactId>cola-component-ddd</artifactId>  <version>4.3.1</version>  
</dependency>  

? Axon Framework:支持事件溯源和CQRS,適合復雜事件驅動系統。

領域事件總線集成

? Spring Cloud Stream + RocketMQ

spring:  cloud:  stream:  bindings:  orderEvent-out:  destination: order-events  content-type: application/json  rocketmq:  binder:  name-server: rocketmq-nameserver:9876  

總結

本節通過大廠實戰案例與現代化架構融合,展現了DDD在復雜業務場景下的生命力: ? 阿里商品中心:通過限界上下文拆分與事件驅動,支撐億級SKU管理。 ? 騰訊支付系統:值對象與Saga模式保障金融級精度與事務一致性。 ? 美團訂單履約:混合鎖策略與狀態機設計應對高并發挑戰。

未來方向: ? 智能化工具鏈:AI輔助領域建模(如自動識別聚合根邊界)。 ? 云原生深化:Service Mesh與Serverless進一步降低防腐層實現成本。 ? 實時化數據:Flink流處理與領域事件深度結合,驅動實時決策。

通過工具鏈與框架的持續演進,DDD將持續賦能企業構建高響應力、高可維護性的業務系統。

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

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

相關文章

CSS Layer 詳解

CSS Layer 詳解 前言 最近在整理CSS知識體系時&#xff0c;發現Layer這個特性特別有意思。它就像是給樣式規則提供了一個專屬的「VIP通道」&#xff0c;讓我們能更優雅地解決樣式沖突問題。今天我就用最通俗的語言&#xff0c;帶大家全面了解這個CSS新特性。 什么是CSS Laye…

【Dv3Admin】工具視圖配置文件解析

在開發后臺管理系統時,處理復雜的 CRUD 操作是常見的需求。Django Rest Framework(DRF)通過 ModelViewSet 提供了基礎的增刪改查功能,但在實際應用中,往往需要擴展更多的功能,如批量操作、權限控制、查詢優化等。dvadmin/utils/viewset.py 模塊通過繼承并擴展 ModelViewS…

?云原生CAE軟件

?云原生CAE軟件?是一種在設計和實現時就充分考慮了云環境特點的軟件&#xff0c;能夠充分利用云資源&#xff0c;實現高效、可擴展和靈活的仿真分析。 定義和特點 云原生CAE軟件是一種在云端構建和運行的CAE&#xff08;Computer Aided Engineering&#xff0c;計算機輔助工…

若依定制pdf生成實戰

一、介紹 使用 Java Apache POI 將文字渲染到 Word 模板是一種常見的文檔自動化技術&#xff0c;廣泛應用于批量生成或定制 Word 文檔的場景。使用aspose可以將word轉成pdf從而達到定制化pdf的目的。 參考文檔&#xff1a;java實現Word轉Pdf&#xff08;Windows、Linux通用&a…

Redis再次開源!reids8.0.0一鍵安裝腳本分享

準備工作 1. 下載 Redis 8 安裝包 # Redis 8.0.0 示例&#xff08;請替換為實際版本&#xff09; http://download.redis.io/releases/redis-8.0.0.tar.gz一、腳本內容&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*-import os import time import shutil import s…

stm32之BKP備份寄存器和RTC時鐘

目錄 1.時間戳1.1 Unix時間戳1.2 UTC/GMT1.3 時間戳轉換**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…

Android學習總結之算法篇八(二叉樹和數組)

路徑總和 import java.util.ArrayList; import java.util.List;// 定義二叉樹節點類 class TreeNode {int val;TreeNode left;TreeNode right;// 構造函數&#xff0c;用于初始化節點值TreeNode(int x) {val x;} }public class PathSumProblems {// 路徑總和 I&#xff1a;判…

Scala和Spark的介紹

Scala 1. Slaca的發展過程 由洛桑聯邦理工學院的馬丁 奧德斯在 2001 年基于 Funnel 的工作開始設計&#xff0c;設計初衷是想集成面向對象編程和函數式編程的各種特性。 Scala 是一種純粹的面向對象的語言&#xff0c;每個值都是對象。 Scala 也是一種函數式語言&#xff0…

配置Hadoop集群環境-使用腳本命令實現集群文件同步

在 Hadoop 集群環境中&#xff0c;確保各節點配置文件一致至關重要。以下是使用 rsync 結合 SSH 實現集群文件同步的腳本方案&#xff0c;支持批量同步文件到所有節點&#xff1a; 1. 前提條件 所有節點已配置 SSH 免密登錄主節點&#xff08;NameNode&#xff09;能通過主機…

Redis能保證數據不丟失嗎之RDB

有了AOF為什么還需要RDB? 上一篇我們介紹了Redis AOF持久化策略。Redis能保證數據不丟失嗎之AOF AOF雖然能實現持久化,但由于AOF恢復數據的時候是一條一條命令重新執行的,但數據量大的時候,Redis數據恢復的時間就會很久,這會導致Redis在重啟的時候,有一大段時間的不可用…

AI浪潮下的藝術突圍戰:對話《名人百科數據庫》執行主編劉鑫煒

當AI生成的畫作在國際賽事中摘冠&#xff0c;當算法推薦主導藝術傳播路徑&#xff0c;技術革命正以前所未有的速度重塑藝術生態。我們獨家專訪深耕藝術推廣領域的劉鑫煒主編&#xff0c;探討當代藝術家在智能時代的生存法則。 圖為《名人百科數據庫》執行主編劉鑫煒 技術重構創…

Python 實現失敗重試功能的幾種方法

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 方法 1:手動 `while` 循環 + 異常捕獲方法 2:使用 `tenacity` 庫(推薦)方法 3:使用 `retrying` 庫(舊版,已停止維護)方法 4:`requests` 自帶重試(適用于 HTTP 請求)方法 5:自定義裝飾器(靈活控制)方法…

2025年滲透測試面試題總結-滲透測試紅隊面試七(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 滲透測試紅隊面試七 一百八十一、Shiro漏洞類型&#xff0c;721原理&#xff0c;721利用要注意什么&am…

Unity動畫系統使用整理 --- Playable

??Playable API?? 是一個強大的工具&#xff0c;用于更靈活地控制動畫、音頻、腳本等時間軸內容的播放和混合。它提供了比傳統 Animator 更底層、更可控的方式管理時間軸行為&#xff0c;尤其適合復雜動畫邏輯或動態內容組合的場景。 優點&#xff1a; 1.Playables API 支…

基于STM32、HAL庫的BMP390L氣壓傳感器 驅動程序設計

一、簡介: BMP390L 是 Bosch Sensortec 生產的一款高精度氣壓傳感器,專為需要精確測量氣壓和海拔高度的應用場景設計。BMP390L 具有更低的功耗、更高的精度和更快的響應速度。 二、硬件接口: BMP390L 引腳STM32L4XX 引腳說明VDD3.3V電源GNDGND地SCLPB6 (I2C1 SCL)I2C 時鐘線…

Arduino快速入門

Arduino快速入門指南 一、硬件準備 選擇開發板&#xff1a; 推薦使用 Arduino UNO&#xff08;兼容性強&#xff0c;適合初學者&#xff09;&#xff0c;其他常見型號包括NANO&#xff08;體積小&#xff09;、Mega&#xff08;接口更多&#xff09;。準備基礎元件&#xff1a…

破解 Qt QProcess 在 Release 模式下的“卡死”之謎

在使用 Qt 的 QProcess 以調用外部 ffmpeg/ffprobe 進行音視頻處理時&#xff0c;常見的工作流程是&#xff1a; gatherParams&#xff1a;通過 ffprobe 同步獲取媒體文件的參數&#xff08;分辨率、采樣率、聲道數、碼率等&#xff09;。 reencode&#xff1a;逐個文件調用 f…

MySQL 中 UPDATE 結合 SELECT 和 UPDATE CASE WHEN 的示例

概述 以下是 MySQL 中 UPDATE 結合 SELECT 和 UPDATE CASE WHEN 的示例&#xff1a; 一、UPDATE 結合 SELECT&#xff08;跨表更新&#xff09; 場景&#xff1a;根據 orders 表中的訂單總金額&#xff0c;更新 users 表中用戶的 total_spent 字段。 -- 創建測試表 CREATE T…

【MCP】魔搭社區MCP服務(高德地圖、everything文件搜索)

【MCP】魔搭社區MCP服務&#xff08;高德地圖、everything文件搜索&#xff09; 1、上手使用2、環境配置&#xff08;1&#xff09;cherry-studio配置&#xff08;2&#xff09;添加魔搭大模型服務&#xff08;如果已經設置了其他大模型服務&#xff0c;可跳過&#xff09;&…

MapReduce 的工作原理

MapReduce 是一種分布式計算框架&#xff0c;用于處理和生成大規模數據集。它將任務分為兩個主要階段&#xff1a;Map 階段和 Reduce 階段。開發人員可以使用存儲在 HDFS 中的數據&#xff0c;編寫 Hadoop 的 MapReduce 任務&#xff0c;從而實現并行處理1。 MapReduce 的工作…