佇列觸發程序

已完成

訊息佇列是一種軟體元件,可用來處理處理序、執行緒或應用程式之間的傳訊。 佇列可以儲存訊息,而「背景工作」可以在適當時候擷取訊息。

在雲端中,訊息佇列可以使用承載產生事件。 Azure Functions 等服務可以接聽這類訊息,並在發佈訊息時執行其程式碼。

使用訊息佇列

Azure 函式需要觸發程序,也可能需要繫結,才能從訊息佇列取用訊息。

Azure 函式必須接聽特定佇列,以便在該佇列上發佈新訊息時觸發其程式碼。 若要設定觸發程序,您必須提供適當的認證,讓觸發程序程式碼知道如何連線到訊息佇列。 您會針對要接聽佇列的函式,在 function.json 檔案中建立一個項目。 在 bindings 元素中,為項目指定下列屬性:

屬性
name 您可以在程式碼中參考的名稱
type queueTrigger
direction in
queueName 佇列的名稱
connection local.settings.json 中的一個設定變數

您可以定義類似如下的範例項目:

{
    "name": "myQueueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName": "messages-incoming",
    "connection": "AzureWebJobsStorage"
  }

如果此佇列位於儲存體帳戶中,則 AzureWebJobsStorage 值為連接字串的值。

從佇列取用訊息時,不一定需要繫結。 不過,如果您想要寫入至佇列,則需要輸出繫結。 透過這類繫結,您就可以取得預定佇列的參考。

注意

目前,佇列僅支援輸出繫結。

於本機開發

身為開發人員,您想要簡短的意見反應週期。 您也想要確保開發人員體驗盡可能接近實際執行環境。 為了達成這兩個目標,您可以使用佇列模擬器。

佇列模擬器可讓您模擬 Azure 函式將回應的真實佇列訊息。 若要使用模擬器:

  1. 安裝模擬器。 在 Visual Studio Code 中搜尋 Azurite下載 Azurite 延伸模組

  2. 若要使用模擬器功能,請在命令選擇區中選取 [Azure: Start Queue Service] (Azure: 啟動佇列服務) 加以啟動。

    執行此命令會啟動一個稱為 Azure 儲存體總管的接聽程式,以供其他應用程式接聽。 儲存體總管是一種用戶端應用程式,可讓您瀏覽雲端資源並使用模擬器功能。

  3. 下載 Azure 儲存體總管。 然後開啟應用程式,您將會看到模擬器正在運作的下列指示:

    顯示 Azure 儲存體總管中模擬器的螢幕擷取畫面。

  4. 在模擬器上建立佇列。 您將在設定函式端點的過程中使用此佇列。 以滑鼠右鍵按一下佇列元素,即可建立新的佇列。

  5. 為了確保您的 Functions 應用程式使用模擬器,您必須正確地設定連接字串。 開啟 local.settings.json,找到 AzureWebJobsStorage 元素,並為其指定值 "UseDevelopmentStorage=true"

    注意

    當您移至雲端時,請記得將此屬性設定為不同的值。 當其在實際執行環境中時,應指向 Azure 上的實際資源。

建置函式

您現在已設定本機模擬器,並在其上擁有佇列。 您也已將專案設定為指向本機模擬器。 現在您需要建立函式以處理佇列觸發程序。

建立函式端點

您已準備好建立可處理傳入佇列訊息的函式。 請為您的函式建立資料夾,並提供名稱 (例如 queueTrigger)。 然後建立 function.json 檔案,並提供下列內容:

{
  "bindings": [{
    "name" "queueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName" : "items",
    "connection": "AzureWebJobsStorage"
  }]
}

name 元素的值很重要,因為稍後會在程式碼中參考,以剖析從佇列傳入的資料。 其類型必須是 queueTrigger,才能讓佇列在有新訊息時觸發。

queueName 元素可唯一識別您要與其互動的佇列。 無論您在此輸入的名稱為何,都必須符合您在模擬器中對佇列的稱呼,或稍後在 Azure 中對實際佇列的稱呼。

connection 元素指向 local.settings.json 中的 AzureWebJobsStorage 元素值。

處理佇列訊息

若要處理傳入佇列訊息,您必須撰寫可剖析您所需訊息的程式碼。 屆時,您可以決定接下來要做什麼。 例如,您可能會啟動 Web 要求、將該訊息放在另一個佇列,或將訊息傳送至資料庫。

設定路由

您需要用來處理連入要求的路由。 Azure Functions 將會在根目錄處理佇列的要求。 當您依照下列方式設定路由時,您的要求會以 http://localhost:<port>/queueTrigger 叫用:

http.HandleFunc("/queueTrigger", handleQueueTrigger)

解碼要求

當佇列訊息傳送給您時,會出現此圖形:

{
  "Data": {
    "queueItem": "your message"
  },
  "Metadata": {
    "DequeueCount": 1,
    "ExpirationTime": "2019-10-16T17:58:31+00:00",
    "Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
    "InsertionTime": "2019-10-09T17:58:31+00:00",
    "NextVisibleTime": "2019-10-09T18:08:32+00:00",
    "PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
    "sys": {
      "MethodName": "QueueTrigger",
      "UtcNow": "2019-10-09T17:58:32.2205399Z",
      "RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
    }
  }
}

在解碼該連入要求的過程中,您需要協助程式結構以建立先前訊息的模型。 其看起來應該如下:

type InvokeRequest {
   Data map[string]json.RawMessage
   Metadata map[string]interface{}
}

開始撰寫程式碼,以取得連入要求並將其解碼:

func handleQueueTrigger(w http.ResponseWrite, r *http.Request) {
   var invokeRequest InvokeRequest
   d := json.NewDecoder(r.Body)
   d.Decode(&invokeRequest)
}

現在您已將要求解碼,但您需要剖析佇列訊息本身。

剖析佇列訊息

將要求解碼之後,您可以從要求的 Data 屬性擷取佇列訊息。 您也必須依在 function.json 檔案中設定的 name 屬性值參考訊息。 用於擷取訊息的程式碼是類似如下的一行程式碼:

invokeRequest.Data["queueItem"]

因為您需要能夠以純文字讀取此訊息,所以會使用 JSON 程式庫並加以剖析。 JSON 程式庫將使用 Unmarshal() 方法,其採用兩個參數:要剖析的訊息,以及用來放置已剖析訊息的變數。 因此您的程式碼必須看起來像這樣:

var parsedMessage string
json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)

此時,parsedMessage 會包含您的訊息。 如果您想要將其列印到主控台,請使用下列程式碼:

fmt.Println(parsedMessage) // your message

注意

如果您的訊息比字串更先進,則 parsedMessage 需要有符合 queueMessage 所指向圖形的結構。

觸發訊息

若要測試您的應用程式,您可以使用 Azure 儲存體總管。 在工具的右窗格上,選取 [新增訊息] 按鈕以在佇列中建立訊息。

顯示用於在佇列中新增訊息之按鈕的螢幕擷取畫面。

如果您有 Functions 應用程式,而且目前正在執行,則會觸發繫結並叫用您的程式碼。