建立健全、可擴展的應用程式通常意味著處理需要多個伺服器或執行緒才能有效處理的任務。無論是處理映像、發送電子郵件或執行資料量大的計算,將這些任務卸載到任務佇列都是最佳實踐。對於我的人工智慧資訊圖表產生器 Text2Infographic 來說,挑戰很明顯:我需要有效率地處理大量同時提交的作業,同時保持流暢的使用者體驗。這促使我採用了Celery(一個強大的分散式任務隊列)和Supervisord(一個流程管理系統),所有這些都使用以下功能無縫部署在AWS Elastic Beanstalk 上.ebextensions.
這是我如何在 Elastic Beanstalk 上使用 Supervisord 設定 Celery Worker 的逐步指南。但首先,讓我們解開此設定的關鍵元件以及它們為何至關重要。
其核心,Celery 是一個分散式任務佇列系統,可讓您將耗時的任務卸載到單獨的進程或伺服器。它廣泛用於 Python 應用程式以非同步或按計劃執行後台作業。對於 Text2Infographic,Celery 是處理從使用者輸入生成自訂資訊圖表的計算密集型過程的完美解決方案。
使用芹菜的一些好處:
非同步執行:任務可以在背景運行,而不阻塞主應用程式。
可擴充性:輕鬆增加更多工作人員來處理增加的負載。
可擴展性:與各種訊息代理集成,如 RabbitMQ 或 Redis。
手動管理像 Celery Worker 這樣的進程可能會變得很麻煩,特別是當您需要它們在崩潰後或部署期間自動重新啟動時。 Supervisord 是一個輕量級流程控制系統,它透過密切注意您的流程並確保它們保持正常運作來解決此問題。
使用 Supervisord,您可以:
如果 Celery 工作失敗,自動重新啟動。
使用單一設定檔簡化進程管理。
記錄進程活動以便更好地調試和監控。
AWS Elastic Beanstalk 是一項完全託管的服務,可自動執行應用程式的部署、擴充和管理。它抽象化了基礎設施管理的大部分複雜性,使開發人員能夠專注於編寫程式碼而不是配置伺服器。 Elastic Beanstalk 支援各種環境,從簡單的 Web 伺服器到更複雜的設定(如 Celery 工作線程)。
對於 Text2Infographic,Elastic Beanstalk 的可擴展性和簡單性非常寶貴。隨著使用者需求的波動,動態擴展工作實例的能力可確保即使在高峰時段也能有效率地處理作業。
.ebextensions 是 Elastic Beanstalk 的功能,可讓您在部署期間自訂環境。使用 .ebextensions 配置文件,您可以:
安裝必要的軟體和相依性。
配置 Supervisord 和 Celery 工作人員等服務。
新增環境變數並管理權限。
這樣就可以將 Celery 和 Supervisord 無縫整合到您的 Elastic Beanstalk 部署中,而無需每次部署時進行手動幹預。
Text2Infographic 旨在幫助行銷人員和內容創作者將部落格文章轉換為令人驚嘆的資訊圖表。每個資訊圖表生成請求都是計算密集型的,涉及基於人工智慧的主題研究、設計優化和採購向量圖形。為了保持無縫的使用者體驗,這些任務必須卸載給可以同時處理多個請求的後台工作人員。 Celery 的非同步任務處理和可擴展性使其成為顯而易見的選擇。
雖然 Elastic Beanstalk 可以本地管理 Web 伺服器,但它沒有對 Celery Worker 等後台進程的內建支援。輸入 Supervisord。它充當 Celery 工作進程的監督者,確保它連續運行並在失敗時自動重新啟動。這種可靠性對於不間斷地處理資訊圖表產生請求至關重要。
完成階段設定後,讓我們深入了解在 Elastic Beanstalk 上配置 Celery、Supervisord 和 eb_extensions 的技術細節,以便為您的應用程式建立可擴展且高效的任務佇列。
在本節中,我們將介紹在 Elastic Beanstalk 上使用 Supervisord 設定 Celery 所需的 .ebextensions 檔案。每個步驟都進行了詳細說明,並提供了幫助您避免常見陷阱的提示。
1。安裝 Supervisord
檔案:01_install_supervisord.config
此檔案安裝 Supervisord 並設定非 root 使用者以安全地執行進程。
commands: 01_install_pip: command: "yum install -y python3-pip" ignoreErrors: true 02_install_supervisor: command: "/usr/bin/pip3 install supervisor" 03_create_nonroot_user: command: "useradd -r -M -s /sbin/nologin nonrootuser || true" ignoreErrors: true
說明:
安裝 pip: 確保 Python 的套件管理器可用。
安裝 Supervisor: 使用 pip 安裝 Supervisord,一個輕量級且功能強大的流程管理員。
建立非 root 使用者: 新增沒有登入 shell 或主目錄的受限使用者(非 root 使用者)。以非 root 使用者身分執行進程是一種安全最佳實踐。
? 提示: 當指令在重複部署期間可能失敗時,請務必使用ignoreErrors: true。這可以確保如果使用者或套件已經存在,您的部署不會失敗。
2。清理過時的進程
檔案:02_cleanup_existing_supervisord.config
此檔案處理舊的 Supervisord 實例和可能在部署之間徘徊的套接字檔案的清理。
commands: kill_existing_supervisord: command: "pkill supervisord || true" ignoreErrors: true remove_stale_socket: command: "rm -f /tmp/supervisor.sock" ignoreErrors: true
說明:
終止現有的 Supervisord: 確保沒有雜散的 Supervisord 程序正在運作。 || true 部分確保如果找不到進程,此命令不會拋出錯誤。
刪除過時的套接字:刪除任何舊的 Supervisord 套接字文件,這可能會阻止 Supervisord 啟動。
? 提示: 在 Elastic Beanstalk 等環境中,清理套接字和進程至關重要,在這些環境中,部署有時可能會留下先前配置的殘餘。
3。使用 Supervisord 設定 Celery
檔案:03_celery_configuration.config
此檔案建立 Supervisord 設定檔並啟動 Celery 工作進程。
files: "/etc/supervisord.conf": mode: "000644" owner: root group: root content: | [unix_http_server] file=/tmp/supervisor.sock chmod=0770 chown=root:nonrootuser [supervisord] logfile=/var/log/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/tmp/supervisord.pid nodaemon=false minfds=1024 minprocs=200 user=root [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock [program:celery] command=celery -A application.celery worker --loglevel=INFO directory=/var/app/current autostart=true autorestart=true startsecs=10 stopwaitsecs=600 stdout_logfile=/var/log/celery_worker.log stderr_logfile=/var/log/celery_worker.err.log environment=PATH="/var/app/venv/staging-LQM1lest/bin:$PATH" user=nonrootuser
說明:
用於控制的 Unix 套接字: unix_http_server 部分建立一個安全套接字用於與 Supervisord 互動。
日誌記錄: 日誌儲存在 /var/log/supervisord.log 中,並採用輪換策略來防止磁碟使用量失控。
Celery 程式區塊:
指令: 使用應用程式設定執行 Celery Worker。
自動啟動和自動重新啟動: 確保 Celery 在部署時自動啟動,並在失敗時重新啟動。
日誌: 將 Celery 的輸出記錄到 /var/log/celery_worker.log 和 /var/log/celery_worker.err.log。
環境: 確保使用正確的 Python 虛擬環境。
? 提示: 使用 directory=/var/app/current 將 Supervisord 指向應用程式的部署目錄,該目錄會隨每個 Elastic Beanstalk 部署而更新。
4。啟動 Supervisord
文件:03_celery_configuration.config(續)
container_commands: 01_start_supervisor: command: "supervisord -c /etc/supervisord.conf"
說明:
容器命令: 這些命令在部署應用程式之後但在環境標記為就緒之前運行。在此啟動 Supervisord 可確保應用程式上線時您的 Celery 工作執行緒正在執行。
? 提示:Elastic Beanstalk 會依字母順序處理容器指令,因此請在指令前加上數字(如 01_)以控制執行順序。
偵錯變得輕鬆:如果某些功能不起作用,請新增臨時容器指令來列印環境變數或列出目錄內容:
commands: 01_install_pip: command: "yum install -y python3-pip" ignoreErrors: true 02_install_supervisor: command: "/usr/bin/pip3 install supervisor" 03_create_nonroot_user: command: "useradd -r -M -s /sbin/nologin nonrootuser || true" ignoreErrors: true
檢查 /var/log/eb-activity.log 中的日誌。
重複使用通用設定:將共用設定片段儲存在單獨的 YAML 檔案中,然後使用 include 指令將它們包含在多個 .ebextensions 檔案中(非官方支援)。
此設定可確保使用 Supervisord 有效管理您的 Celery 工作線程,並與您的 Elastic Beanstalk 應用程式一起擴展。無論您是處理資訊圖表生成還是任何其他後台任務,這種方法都可以提供可靠性、可擴展性和安心感。
以上是透過 .ebextensions 在彈性 beanstalk 上使用 Supervisord 設定 Celery Worker的詳細內容。更多資訊請關注PHP中文網其他相關文章!