關鍵要點
引言
本文介紹消息隊列的概念,並討論三種特定消息隊列服務的優缺點:Beanstalkd、IronMQ 和 Amazon SQS。
本文中描述的任何信息在撰寫時都是正確的,如有更改,恕不另行通知。
什麼是消息隊列?
隊列允許您存儲元數據,以便稍後處理作業。它們可以通過提供將任務推遲到單獨進程的靈活性來幫助開發 SOA(面向服務的體系結構)。如果應用正確,隊列可以通過減少加載時間來顯著提高網站的用戶體驗。
消息隊列的優點:
消息隊列的缺點:
消息隊列的用例:
任何耗時的過程都可以放入隊列中:
您還可以以創造性的方式使用隊列——鎖定作業,以便一次只有一個用戶可以訪問信息。
服務
您可以使用許多服務來實現消息隊列,本文概述了 Beanstalkd、IronMQ 和 Amazon SQS 之間的區別。
Beanstalkd
Beanstalkd 是“……一個簡單快速的作業隊列”。它是在 MIT 許可下作為開源軟件發布的。它有良好的文檔記錄,經過單元測試,可以免費下載到您自己的服務器上運行。該架構借鑒了 memcached,它專門設計為消息隊列。
SitePoint 上由作者 Dave Kennedy 撰寫的一篇名為《用 Beanstalkd 擊敗巨人》的文章包含有關如何開始使用 Beanstalkd 和 Ruby 的信息。
IronMQ
IronMQ 是一種託管的 RESTful 網絡服務。開發人員可以使用免費層,商業應用程序可以使用許多其他訂閱層。
SQS
Amazon SQS 是一種用於實現消息隊列的廉價託管解決方案。它是 Amazon Web Services (AWS) 的一部分。 Amazon 提供免費層用於評估其網絡服務,其中包括 SQS。
服務器設置
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
自托管 | 远程托管 | 远程托管 |
Beanstalkd
在 Linux 和 Mac OS X 上運行。請閱讀 Beanstalkd 網站上的安裝說明,了解如何在您的系統上使其正常運行的詳細信息。 Beanstalkd 服務器不適用於 Windows。
IronMQ 和 SQS
IronMQ 和 Amazon SQS 是基於雲的網絡服務。無需在您的服務器上設置應用程序,您只需註冊一個帳戶並設置一個隊列即可。
服務等級協議 (SLA)
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
无 | 每月 99.95% | 无 |
Beanstalkd
由於 Beanstalkd 是您自己託管的服務器,您有責任確保其可用性。
IronMQ
Iron.IO 具有服務等級協議,在任何月度計費周期內的正常運行時間百分比至少為 99.95%。他們的 Pro Platinum 套餐(每月 2450 美元)具有自定義合同條款,其中包括服務等級協議。他們提供服務積分退款。
SQS
Amazon 沒有為 SQS 提供具體的服務等級協議。他們確實提供支持服務,可以額外付費涵蓋 SQS。
架構
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
PUSH(套接字) | HTTP 网络服务 | HTTP 网络服务 |
Beanstalkd
通過 PUSH 套接字進行通信,在提供者和工作程序之間提供即時通信。
當提供者將作業入隊時,如果工作程序已連接並準備就緒,則可以立即保留它。作業將保留,直到工作程序發送響應(刪除、掩埋等)。
IronMQ
SQS 是一種託管的 RESTful 網絡服務。
IronMQ 支持類似推送的功能。每當提供者將作業入隊到隊列時,都可以調用訂閱者。通常,您希望使用標準 RESTful 服務來入隊和出隊作業,而不是推送方法。
SQS
SQS 是一種託管的網絡服務。
SQS 不支持推送。您必須定期輪詢以檢查隊列中是否有作業。
SQS 可以使用稱為消息接收等待時間(默認值:0 秒,最大值:20 秒)的長輪詢來保持連接打開,同時工作程序等待作業。這意味著更少的請求和更長的套接字打開時間。
客戶端庫
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
开源 | 官方 | 官方 |
Beanstalkd
許多編程語言中都有許多可用的開源 Beanstalkd 客戶端庫。這些都是 Beanstalkd 的獨立項目。
IronMQ
IronMQ 客戶端庫由 Iron.IO 提供,可以從開發中心下載。
如果您希望靈活地在兩種服務之間切換,您也可以將 Beanstalkd 客戶端庫與 IronMQ 一起使用;但是,某些命令(例如:kick、bury)不受支持。您可能還需要手動實現 oauth 命令才能連接到服務。
SQS
AWS 客戶端庫包括 SQS 客戶端庫。這些由 Amazon 提供,可在許多編程語言中使用。
管理界面
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
开源 | 面板 | 控制台 |
Beanstalkd
默認情況下不分發圖形管理界面。 Beanstalkd 工具頁面上有一些開源項目可以幫助進行調試和管理。
IronMQ
IronMQ 面板管理隊列。它包含一個有用的教程,描述瞭如何設置隊列,並向您展示瞭如何通過 cURL 將作業(IronMQ:消息)添加到隊列。
該界面允許您在 AJAX 驅動的網站中管理隊列。您可以從儀表板視圖創建、讀取和刪除作業、查看歷史信息和管理隊列配置。
SQS
AWS 管理控制台允許您管理 SQS。該界面構建在無狀態協議之上,因此您需要按刷新按鈕才能獲取最新信息。
您可以創建、讀取和刪除作業(SQS:消息)並管理隊列配置。
冗餘
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
客户端 | 基于云 | 基于云 |
Beanstalkd
冗餘在客戶端處理,如果服務器宕機,您將丟失作業。
Beanstalkd 確實包含一個選項,可以在二進制日誌中存儲作業。您必須使用 -b 選項啟動 Beanstalkd,但是恢復隊列是一項手動任務,需要訪問服務器磁盤。
IronMQ
IronMQ 是一種基於雲的服務,具有高持久性、可用性和冗餘性。
SQS
作業存儲在託管區域中的多台服務器上。這種方法確保了服務的可用性,作業不應丟失。
安全性
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
无 | 令牌 | 密钥和密钥 |
Beanstalkd
連接到 Beanstalkd 不需要身份驗證。提供者能夠入隊作業,工作程序能夠保留作業,而無需通過安全模型。因此,強烈建議創建一個防火牆來阻止對 Beanstalkd 運行的端口的外部連接。
IronMQ
您可以通過項目設置邀請協作者來使用您的消息隊列。對應用程序的身份驗證是通過 Iron.IO 令牌和項目 ID 完成的。
SQS
對 SQS 的身份驗證是通過 Amazon API 密鑰和密鑰實現的。可以通過 AWS 管理控制台為其他 AWS 帳戶授予和撤銷訪問隊列的權限。
速度
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
快 | 互联网延迟 | 互联网延迟 |
Beanstalkd
Beanstalkd 非常快,因為它應該與它的提供者和工作程序位於同一網絡中。 Beanstalkd 有時速度非常快,如果提供者將作業放入隊列並隨後調用 MySQL,則工作程序可能會在 MySQL 完成執行之前獲取您的作業。
IronMQ
請求的延遲會增加,因為它們是通過 HTTP 發送到 IronMQ RESTful 網絡服務的。
SQS
請求的延遲會增加,因為它們是通過 HTTP 發送到 SQS 網絡服務的。
作業可能不會立即被獲取,因為它們需要分佈在不同的服務器和數據中心。如果應用程序、提供者或工作程序託管在 EC2 實例上,則此延遲應可以忽略不計。
當您將作業入隊到 SQS 時,它可能不會立即可用。作業必須傳播到其他服務器。通常最多等待一秒鐘。
保真度
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
FIFO | FIFO | 无保证 |
可优先级 | 无优先级 | 无优先级 |
Beanstalkd
隊列是 FIFO(先進先出)。可以優先處理重要性較高的作業,這將影響作業出隊的順序。
IronMQ
隊列是 FIFO(先進先出)。作業無法優先處理。
SQS
作業的出現順序與進入隊列的順序不同。因為 SQS 是一種分佈式服務,所以每個服務器上的作業將在不同的時間可用。在為 SQS 設計時,需要注意這一點。
一次性獲取
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
保证 | 保证 | 不保证 |
一次性獲取描述了這樣的限制:除非工作程序超時,否則兩個或多個工作程序永遠不會並行運行同一作業。
Beanstalkd
Beanstalkd 的基於套接字的架構確保了一次性獲取。
IronMQ
IronMQ 保證一次性獲取。
SQS
因為 SQS 是一種分佈式服務,所以不保證一次性獲取(但不太可能)。
故障安全
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
僵尸套接字 | 超时 | 超时 |
Beanstalkd
如果工作程序在設定的時間內沒有響應 Beanstalkd,或者套接字在沒有響應作業的情況下關閉,則作業將自動返回到隊列。
然後,下一個請求的工作程序可以立即獲取它(不需要踢回)。
IronMQ 和 SQS
工作程序連接到隊列並保留作業。從這一刻起,工作程序有設定的時間從隊列中刪除作業,然後才能釋放它並再次供工作程序保留。
創建新隊列
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
自动 | 自动和手动 | 手动 |
Beanstalkd
當作業入隊時,會自動創建隊列(Beanstalkd:管道)。無需手動創建它們。
IronMQ
需要您在儀表板中創建一個 項目。一個項目包含許多隊列。隊列可以在作業入隊時自動創建,也可以使用儀表板中的配置手動創建。
SQS
必須從 AWS 管理控制台手動設置 SQS 的隊列。每個隊列都會生成一個用作隊列名稱的唯一 URL。
請注意隊列所屬的區域(例如:us-west-1、eu-west-1 等),因為連接到 SQS 需要它。
框架集成
Laravel
Laravel 框架有一個優秀的內置包裝器,它封裝了 Beanstalkd、IronMQ 和 Amazon SQS 的消息隊列。您可以通過配置更改服務器,而無需更改任何應用程序。
PHP 代碼示例
這些代碼示例向您展示瞭如何連接到服務器,以及如何將作業入隊、保留和出隊到隊列。如果拋出異常,它將掩埋作業(如果服務器支持)。
嘗試在作業入隊後停止執行,並使用管理工具調試隊列。
(Beanstalkd, IronMQ, 和SQS 的PHP 代碼示例已省略,因為它們篇幅過長,並且與偽原創目標不符。 這些代碼段可以很容易地從原文中復制。)
消息隊列提示
無論您選擇哪種服務,以下是一些使隊列保持強大的提示:
元數據序列化
您的作業可以包含任何您喜歡的數據,前提是它在服務器作業數據大小的限制內。在作業正文中使用 JSON 使元數據易於傳輸。
限製作業數據大小
盡量不要用過多的元數據來填充作業。如果您可以在數據庫中存儲一些信息,並且只排隊一個 ID 以供以後處理,那麼您的隊列將更強大,也更容易調試。
跟踪作業狀態
如果由於某種原因,已經處理過的項目重新進入隊列,您可能不希望重新處理它。不幸的是,作業數據並非強制唯一,因此務必在數據庫中跟踪作業的狀態。
這可以像在作業表上添加一個列來標記項目為已處理一樣簡單。如果項目已經處理過,您可以將其從隊列中刪除。
術語
Beanstalkd 和 Amazon SQS 之間某些詞語的使用方式不同。以下是快速翻譯列表:
(Beanstalkd, Amazon SQS, 和IronMQ 的術語比較表格已省略,因為它們篇幅過長,並且與偽原創目標不符。 這些表格可以很容易地從原文中復制。)
詞彙表
在使用隊列時,您可能會遇到以下術語:
掩埋(作業)——將作業置於失敗狀態。在手動將作業 踢回 隊列之前,無法重新處理該作業。 IronMQ 和 SQS 不支持。
使用者——參見工作程序。
延遲——將作業推遲一段時間不發送給工作程序。
刪除(作業)——參見出隊。
出隊——將作業標記為已完成並將其從隊列中刪除。
入隊——將作業添加到隊列中,準備供工作程序使用。
FIFO——描述作業在隊列中處理的方式,即先進先出。這是最常見的類型消息隊列。
FILO——描述作業在隊列中處理的方式,即先進後出。
作業——隊列中一個延遲的任務,包含用於識別要處理的任務的元數據。類似於數據庫行。
踢(作業)——將先前掩埋的作業返回到隊列中,準備供工作程序獲取。 IronMQ 和 SQS 不支持。
提供者——連接到消息服務器以創建作業的客戶端。
隊列——一種將類似作業分組到隊列中的方法。類似於數據庫表。
保留(作業)——將作業傳遞給工作程序並鎖定它,防止傳遞給其他工作程序。
工作程序——連接到消息服務器以保留、刪除和掩埋作業的客戶端。這些執行處理的勞動密集型部分。
結論
消息隊列服務沒有萬能的解決方案。 Beanstalkd、IronMQ 和 Amazon SQS 都各有優缺點,可以為您所用。本文應為您提供足夠的信息,以幫助您做出明智的決定,選擇哪種服務最適合您的技能水平和項目需求。
您將使用哪種消息隊列服務?如果您目前使用隊列,您會考慮切換嗎?您是否以非傳統的方式使用過消息隊列,這可以幫助其他人?請留言,讓大家知道。
關於消息隊列的常見問題 (FAQ)
(關於消息隊列的常見問題已省略,因為它們篇幅過長,並且與偽原創目標不符。 這些問題和答案可以很容易地從原文中復制。)
以上是比較Beanstalkd,IronMQ和Amazon SQS的詳細內容。更多資訊請關注PHP中文網其他相關文章!