Azure Queue Storage 是 Azure Storage 的其中一項服務,顧名思義,它就是一個 Message Queue 的服務,適合拿來實作非同步作業,而且相較於我們自己架設 Message Queue 服務,使用 Azure Queue Storage 的成本相當低廉,最便宜的定價是每 GB/月 $0.045 鎂。
建立儲存體帳戶
我們需要先建立一個儲存體帳戶,建立的步驟就請參考之前文章中「建立儲存體帳戶」的部分,這邊就不再贅述。
建立佇列
我們進入到儲存體帳戶的管理介面,切換到「佇列
」頁面,點擊「+佇列
」,輸入「佇列名稱
」,最後按「確定
」就能建立一個佇列。
起手式
接下來我打算用 C# 來撰寫傳送及接收訊息的程式,首先安裝 Azure.Storage.Queues
套件,再來到儲存體帳戶的管理介面,進入存取金鑰頁面,複製其中一組連線字串備用,這個在之前的文章也有說明。
我們利用連線字串跟佇列名稱產生 QueueClient
,後續的操作全都得仰賴 QueueClient。
private static async Task Main(string[] args)
{
var queueClient = new QueueClient(ConnectionString, "myqueue");
// ...
}
傳送訊息
QueueClient 產生好之後,就可以開始傳送訊息了,訊息的型別可以是 string
或 BinaryData
,訊息的大小上限是 64KB
。
private static async Task Main(string[] args)
{
// ...
// Send string message
var response = await queueClient.SendMessageAsync("my string message");
// Send binary message
response = await queueClient.SendMessageAsync(new BinaryData(Encoding.UTF8.GetBytes("my binary message")));
// ...
}
在傳送訊息的多載方法中,有兩個參數要特別說明一下:
1. visibilityTimeout
從佇列接收訊息之後,訊息不會被刪除,而是會被隱藏,預設會隱藏 30 秒,之後訊息如果沒有被刪除,就又會出現在佇列中,visibilityTimeout 參數則可以修改隱藏的時長。
2. timeToLive
訊息在佇列裡面如果沒有被刪除,預設會存活 7 天,timeToLive 參數可以調整存活時間,如果輸入 -1 秒,則永久存活。
接收訊息
Azure Queue Storage 不同於一些 Message Queue 服務是 Pub/Sub
模式,它是屬於 Push/Pull
,接收訊息有兩個方法 ReceiveMessage() / ReceiveMessageAsync()
及 ReceiveMessages() / ReceiveMessagesAsync()
,前者是一次接收一個訊息,後者則允許一次接收多個訊息,就看我們的需求,挑選其中一個來使用。
private static async Task Main(string[] args)
{
// ...
var response = await queueClient.ReceiveMessageAsync();
var messageText = response.Value.MessageText;
// ...
}
刪除訊息
接收下來的訊息,非必要的話,我們應該將它從佇列中刪除,刪除的方法是 DeleteMessage() / DeleteMessageAsync()
,必要的參數有兩個,分別是 messageId
及 popReceipt
,在接收的訊息中找得到。
private static async Task Main(string[] args)
{
// ...
var response = await queueClient.ReceiveMessageAsync();
await queueClient.DeleteMessageAsync(response.Value.MessageId, response.Value.PopReceipt);
// ...
}
更新訊息
Azure Queue Storage 允許我們可以修改訊息的內容,這個可以用在哪裡?如果我們處理訊息的程序有多個,我們可以將處理的結果、狀態,更新到訊息內容裡面去,方便追蹤進度,更新訊息內容的 API 是 UpdateMessage() / UpdateMessageAsync()
。
private static async Task Main(string[] args)
{
// ...
var response = await queueClient.ReceiveMessageAsync();
await queueClient.UpdateMessageAsync(
response.Value.MessageId,
response.Value.PopReceipt,
$"{response.Value.MessageText}\r\nStep1 Done.");
// ...
}
這個時代的 IT 人員,已經無法忽視雲端服務的存在,很多服務信用卡一刷就可以直接租來用,除了方便之外,甚至比我們自己架還要划算,以上,Azure Queue Storage 就推薦給有 Message Queue 需求的朋友使用,希望這篇文章有幫到忙。