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