2025年3月21日 星期五

3. 系統架構:設計一個可擴展、高效能的系統架構,以滿足您的 Laravel 10 爬蟲 API 服務

系統架構:

  • 架構圖:
程式碼片段
graph LR
    A[使用者] --> B(負載平衡器);
    B --> C{API 伺服器群組};
    C --> D[Redis 隊列];
    D --> E{隊列工作者群組};
    E --> F[資料庫];
    C --> F;
    F --> G[檔案儲存 (S3)];
  • 組件解釋:
    • 使用者:
      • 發送 API 請求的客戶端。
    • 負載平衡器:
      • 將 API 請求分配到 API 伺服器群組中的多個伺服器,實現負載平衡和高可用性。
    • API 伺服器群組:
      • 運行 Laravel 10 API 服務的多個伺服器實例,處理 API 請求。
    • Redis 隊列:
      • 儲存爬取任務的隊列,用於非同步處理。
    • 隊列工作者群組:
      • 運行隊列工作者的多個伺服器實例,從隊列中取出任務並執行。
    • 資料庫:
      • 儲存爬取任務、爬取結果和元數據的資料庫(例如:MySQL)。
    • 檔案儲存 (S3):
      • 儲存爬取的圖像和影片檔案(例如:AWS S3)。

基礎設施:

  • 可擴展性:
    • 使用負載平衡器將 API 請求分散到多個伺服器。
    • 使用隊列和隊列工作者非同步處理爬取任務。
    • 使用自動擴展組(Auto Scaling Groups)根據負載動態調整伺服器數量。
  • 雲服務:
    • 使用雲端服務提供商(例如:AWS、Google Cloud、Azure)的服務。
    • 使用負載平衡器(例如:AWS ELB)。
    • 使用 Redis 隊列(例如:AWS ElastiCache for Redis)。
    • 使用資料庫服務(例如:AWS RDS)。
    • 使用物件儲存服務(例如: AWS S3)。
  • 數據效率:
    • 使用資料庫索引優化查詢效能。
    • 使用快取(例如:Redis 快取)減少資料庫訪問。
    • 使用檔案儲存服務(例如:AWS S3)高效儲存和檢索多媒體檔案。

應用架構:

  • 編程語言和框架:
    • 使用 PHP 作為編程語言。
    • 使用 Laravel 10 作為 Web 框架。
  • 請求管理:
    • 使用負載平衡器將 API 請求分配到多個 API 伺服器。
    • 使用隊列和隊列工作者非同步處理爬取任務。
  • 性能優化:
    • 使用 Laravel Telescope 監控 API 效能和錯誤。
    • 使用快取(例如:Redis 快取)減少資料庫訪問。
    • 使用CDN快取靜態檔案,例如圖片、影片。
    • 優化資料庫查詢。
    • 隊列工作者的優化,根據資源使用率調整隊列工作者數量,以及工作者伺服器資源。

實施建議:

  • 使用 Docker 容器化應用程式,方便部署和擴展。
  • 使用 Kubernetes 或其他容器編排工具管理容器化應用程式。
  • 使用CI/CD工具,自動化部屬流程。
  • 監控系統的健康狀況和效能指標,並設定警報。
  • 定期進行效能測試和優化。

透過以上架構設計和實施建議,您可以構建一個可擴展、高效能的 Laravel 10 爬蟲 API 服務。


在這個 Laravel 10 爬蟲 API 服務中,隊列 (Queue) 的起點主要在 CrawlController.php 控制器中。以下我將詳細說明隊列的起點和運作方式:

1. 控制器中的隊列觸發:

  • CrawlController.php 控制器中,crawlSingle()crawlWebsite() 方法負責接收來自 API 端點的爬取請求。
  • 在這兩個方法中,當請求通過驗證並成功創建 CrawlTask 模型實例後,會使用以下程式碼將爬取任務放入隊列:
PHP
Queue::push(new CrawlJob($crawlTask));
  • Queue::push() 方法會將 CrawlJob 實例推送到隊列中。
  • CrawlJob 是一個隊列任務 (Job),它定義了實際的爬取邏輯。
  • 因此,CrawlController 是隊列的起點,它負責將爬取任務放入隊列,等待隊列工作者 (Worker) 處理。

2. 隊列的運作方式:

  • Queue::push() 被調用時,Laravel 會根據 .env 檔案中的 QUEUE_CONNECTION 設定,將任務儲存到指定的隊列驅動程式中。
  • 在這個系統中,我們使用 Redis 作為隊列驅動程式。
  • 因此,CrawlJob 任務會被序列化並儲存到 Redis 隊列中。
  • 隊列工作者 (Worker) 是一個後台進程,它會持續監聽 Redis 隊列,並從隊列中取出任務執行。
  • 可以使用以下指令啟動隊列工作者:
Bash
php artisan queue:work redis
Bash
php artisan queue:listen redis
  • 隊列工作者會從 Redis 隊列中取出 CrawlJob 任務,並執行其 handle() 方法。
  • handle() 方法中包含了實際的爬取邏輯,包括發送 HTTP 請求、解析 HTML、儲存資料等。
  • 任務執行完成後,隊列工作者會將任務從 Redis 隊列中移除。

3. 總結:

  • 隊列的起點在 CrawlController.php 控制器中,當 API 接收到爬取請求時,控制器會將任務放入隊列。
  • 系統使用 Redis 作為隊列驅動程式,儲存和管理隊列任務。
  • 隊列工作者負責從 Redis 隊列中取出任務並執行。

因此,CrawlController 是觸發隊列任務的關鍵位置,它負責將爬取任務放入隊列,實現非同步處理。


AWS 環境設定

  1. 建立 EC2 執行個體:
    • 登入 AWS 管理控制台。
    • 選擇 EC2 服務。
    • 點選「啟動執行個體」。
    • 選擇「Ubuntu Server」作為 AMI。
    • 選擇「c5.2xlarge」或更高規格的執行個體類型。
    • 設定安全群組,開放 80、443 和 22 連接埠。
    • 建立或選擇金鑰對,下載私鑰檔案(.pem)。
    • 啟動執行個體。
  2. 建立 RDS 資料庫:
    • 在 AWS 管理控制台中,選擇 RDS 服務。
    • 點選「建立資料庫」。
    • 選擇 MySQL 或 PostgreSQL。
    • 設定資料庫執行個體規格、使用者名稱和密碼。
    • 設定安全群組,允許 EC2 執行個體連線。
    • 建立資料庫。
  3. 建立 Elastic Load Balancer (ELB):
    • 在 AWS 管理控制台中,選擇 EC2 服務。
    • 在左側選單中,選擇「負載平衡器」。
    • 點選「建立負載平衡器」。
    • 選擇「應用程式負載平衡器」。
    • 設定負載平衡器名稱、VPC 和子網路。
    • 建立目標群組,將 EC2 執行個體加入目標群組。
    • 設定健康檢查。
    • 建立負載平衡器。
  4. 建立 Auto Scaling Group (ASG):
    • 在 AWS 管理控制台中,選擇 EC2 服務。
    • 在左側選單中,選擇「自動擴展群組」。
    • 點選「建立自動擴展群組」。
    • 選擇啟動範本或啟動組態。
    • 設定最小、最大和期望容量。
    • 設定擴展策略(例如,CPU 使用率)。
    • 將 ASG 與 ELB 關聯。
    • 建立 ASG。
  5. 設定 Route 53:
    • 在 AWS 管理控制台中,選擇 Route 53 服務。
    • 建立託管區域,輸入您的網域名稱。
    • 建立 A 記錄,將網域名稱指向 ELB 的 DNS 名稱。

沒有留言:

張貼留言