[食譜好菜] 要弄一個 Message Queue 服務不必大費周章,Azure Queue Storage 拿起來就用。

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 產生好之後,就可以開始傳送訊息了,訊息的型別可以是 stringBinaryData,訊息的大小上限是 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(),必要的參數有兩個,分別是 messageIdpopReceipt,在接收的訊息中找得到。

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 需求的朋友使用,希望這篇文章有幫到忙。

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學