← 返回博客列表
通用演算法

CICD Pipeline 相依性排序問題 - 拓撲排序演算法深度解析 | OAVOService 面試助攻

2026-01-10

問題背景

在現代軟體開發的 CI/CD 流水線中,不同的資源和服務之間存在複雜的相依關係。當系統從零開始部署時,我們需要確定正確的部署順序,確保所有相依項都在被相依者之前完成部署。

OAVOService 面試助攻團隊 在多年的大廠面試輔導中發現,相依排序問題是系統設計面試的高頻考點,特別是在 Google、Amazon、Meta 等公司的基礎架構職位面試中。

問題描述

Problem 1 — CICD Pipeline Dependency Ordering

給定一個 CI/CD 流水線系統,包含多個不同的環境和資源。當生產環境為空時,需要確定資源的正確部署順序。

輸入格式:

範例:

輸入: [[A, B], [C, A], [D, C]]
輸出: [B, A, C, D] 或其他有效的拓撲序列

演算法核心 - 拓撲排序

這題本質上是 拓撲排序(Topological Sort) 問題,考察對以下概念的理解:

解法一:Kahn演算法(BFS)

from collections import deque, defaultdict

def deploy_order_kahn(dependencies):
    """
    使用Kahn演算法進行拓撲排序
    時間複雜度: O(V + E)
    空間複雜度: O(V + E)
    """
    # 構建圖和入度表
    graph = defaultdict(list)
    indegree = defaultdict(int)
    nodes = set()
    
    for a, b in dependencies:
        graph[b].append(a)  # b -> a
        indegree[a] += 1
        nodes.add(a)
        nodes.add(b)
        if b not in indegree:
            indegree[b] = 0
    
    # 找到所有入度為0的節點
    queue = deque([node for node in nodes if indegree[node] == 0])
    result = []
    
    while queue:
        current = queue.popleft()
        result.append(current)
        
        # 減少相鄰節點的入度
        for neighbor in graph[current]:
            indegree[neighbor] -= 1
            if indegree[neighbor] == 0:
                queue.append(neighbor)
    
    # 檢查是否存在循環相依
    if len(result) != len(nodes):
        raise ValueError("檢測到循環相依!")
    
    return result

解法二:DFS後序遍歷

def deploy_order_dfs(dependencies):
    """
    使用DFS後序遍歷進行拓撲排序
    """
    graph = defaultdict(list)
    nodes = set()
    
    for a, b in dependencies:
        graph[b].append(a)
        nodes.add(a)
        nodes.add(b)
    
    visited = set()
    visiting = set()
    result = []
    
    def dfs(node):
        if node in visiting:
            raise ValueError("檢測到循環相依!")
        if node in visited:
            return
        
        visiting.add(node)
        for neighbor in graph[node]:
            dfs(neighbor)
        visiting.remove(node)
        visited.add(node)
        result.append(node)
    
    for node in nodes:
        if node not in visited:
            dfs(node)
    
    return result

生產環境優化

1. 並行部署優化

def parallel_deploy_plan(dependencies):
    """
    生成支援並行部署的層級計劃
    """
    order = deploy_order_kahn(dependencies)
    levels = []
    current_level = []
    
    # 按相依深度分層
    for resource in order:
        if can_deploy_parallel(resource, current_level, dependencies):
            current_level.append(resource)
        else:
            if current_level:
                levels.append(current_level)
            current_level = [resource]
    
    if current_level:
        levels.append(current_level)
    
    return levels

2. 錯誤復原機制

def deploy_with_rollback(dependencies, deploy_func):
    """
    支援回滾的部署流程
    """
    order = deploy_order_kahn(dependencies)
    deployed = []
    
    try:
        for resource in order:
            deploy_func(resource)
            deployed.append(resource)
    except Exception as e:
        # 按逆序回滾已部署的資源
        for resource in reversed(deployed):
            rollback_resource(resource)
        raise e
    
    return deployed

OAVOService 面試技巧

常見面試陷阱

  1. 忘記檢查循環相依 - 面試官會特意給出有環的測試用例
  2. 只考慮單一解 - 拓撲排序可能有多個有效結果
  3. 忽略並行優化 - 生產系統需要考慮並行部署

擴展討論點

複雜度分析


OAVOService 專業面試助攻服務 - 我們長期陪同學員實戰各類大廠 OA 與面試,包括 Google、Amazon、Meta、Citadel、SIG 等頂級公司。提供即時面試輔助、遠端協助與節奏把控,確保關鍵時刻不掉鏈子。

如果你正在準備技術面試,可以了解我們的 客製化面試助攻方案 —— 從演算法程式設計到系統設計,全程護航助你成功上岸。

標籤: 拓撲排序, CI/CD, 系統設計, 相依管理, 面試演算法, OAVOService