Wyzwalacz kolejki

Ukończone

Kolejka komunikatów to składnik oprogramowania służący do obsługi komunikatów między procesami, wątkami lub aplikacjami. Kolejka może przechowywać komunikat, a pracownicy mogą pobierać komunikat w odpowiednim momencie.

W chmurze kolejki komunikatów mogą generować zdarzenia z ładunkiem. Usługa taka jak Azure Functions może nasłuchiwać takiego komunikatu i uruchamiać kod po opublikowaniu komunikatu.

Praca z kolejkami komunikatów

Aby funkcja Azure mogła pobrać wiadomość z kolejki wiadomości, potrzebuje wyzwalacza i prawdopodobnie powiązania.

Funkcja platformy Azure musi nasłuchiwać określonej kolejki, aby jej kod był wyzwalany po opublikowaniu nowego komunikatu w tej kolejce. Aby skonfigurować wyzwalacz, należy podać odpowiednie poświadczenia, aby kod wyzwalacza wiedział, jak nawiązać połączenie z kolejką komunikatów. Należy utworzyć wpis w pliku function.json dla funkcji, która nasłuchuje kolejki. W elemecie bindings określ te właściwości we wpisie:

Własność Wartość
name Nazwa, do której można odwoływać się w kodzie
type queueTrigger
direction in
queueName Jak nazywa się kolejka
connection Zmienna konfiguracji w local.settings.json

Przykładowy wpis można zdefiniować w następujący sposób:

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

Jeśli ta kolejka znajduje się na koncie magazynu, wartość AzureWebJobsStorage jest wartością ciągu połączenia.

Nie musisz mieć powiązania podczas pobierania komunikatu z kolejki. Jeśli jednak chcesz zapisać coś do kolejki, potrzebujesz powiązania wyjściowego. Dzięki takiemu powiązaniu uzyskujesz odwołanie do zamierzonej kolejki.

Uwaga

Obecnie tylko powiązania wyjściowe są obsługiwane w przypadku kolejek.

Rozwijaj lokalnie

Jako deweloper potrzebujesz krótkich cykli opinii. Chcesz również mieć pewność, że środowisko deweloperskie jest jak najbliżej środowiska produkcyjnego. Sposobem osiągnięcia obu tych celów jest użycie emulatora kolejki.

Emulator kolejki umożliwia symulowanie rzeczywistych komunikatów kolejki, na które będzie reagować funkcja platformy Azure. Aby użyć emulatora:

  1. Zainstaluj emulator. Wyszukaj aplikację Azurite w programie Visual Studio Code lub pobierz rozszerzenie Azurite.

  2. Aby użyć funkcji emulatora, uruchom ją, wybierając pozycję Azure: Uruchom usługę kolejkową na palecie poleceń.

    Uruchomienie tego polecenia uruchamia nasłuchujący proces o nazwie Azure Storage Explorer, który może zostać wykorzystany przez inną aplikację. Eksplorator usługi Storage to aplikacja kliencka, która umożliwia przeglądanie zasobów w chmurze i korzystanie z funkcji emulatora.

  3. Pobierz Eksplorator usługi Azure Storage. Następnie otwórz aplikację i zobaczysz następujące wskazanie, że emulator działa:

    Zrzut ekranu przedstawiający emulator w Azure Storage Explorer.

  4. Utwórz kolejkę w emulatorze. Ta kolejka będzie używana podczas konfigurowania punktu końcowego funkcji. Klikając prawym przyciskiem myszy element kolejki, możesz utworzyć nową kolejkę.

  5. Aby upewnić się, że aplikacja usługi Functions używa emulatora, należy poprawnie ustawić parametry połączenia. Otwórz .

    Uwaga

    Pamiętaj, aby ustawić tę właściwość inaczej, gdy przechodzisz do chmury. Powinna wskazywać rzeczywisty zasób na platformie Azure w środowisku produkcyjnym.

Zbuduj funkcję

Teraz masz skonfigurowany lokalny emulator i znajduje się na nim kolejka. Projekt został również skonfigurowany tak, aby wskazywał emulator lokalny. Teraz musisz utworzyć funkcję obsługującą wyzwalacz kolejki.

Tworzenie punktu końcowego funkcji

Jesteś gotowy, aby utworzyć funkcję, która może obsługiwać przychodzące komunikaty w kolejce. Utwórz folder dla funkcji i nadaj mu nazwę, na przykład queueTrigger. Następnie utwórz plik function.json i nadaj mu następującą zawartość:

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

Wartość name elementu jest ważna, ponieważ odwołujesz się do niego później w kodzie, aby przeanalizować dane przychodzące z kolejki. Musi być typu queueTrigger, aby kolejka wyzwalała je, gdy pojawi się nowa wiadomość.

Element queueName jednoznacznie identyfikuje kolejkę, z którą się komunikujesz. Niezależnie od tego, co tutaj wpiszesz, musi być zgodne z tym, jak nazywasz kolejkę w emulatorze lub jak później nazywasz swoją rzeczywistą kolejkę na platformie Azure.

Element connection wskazuje wartość AzureWebJobsStorage elementu w local.settings.json.

Obsługa komunikatu kolejki

Aby obsłużyć komunikat kolejki przychodzącej, musisz napisać kod, który może przeanalizować potrzebny komunikat. W tym momencie możesz zdecydować, co zrobić dalej. Możesz na przykład uruchomić żądanie internetowe, umieścić ten komunikat w innej kolejce lub wysłać komunikat do bazy danych.

Konfigurowanie trasy

Potrzebna jest trasa do obsługi żądań przychodzących. Usługa Azure Functions będzie obsługiwać żądania do kolejki na poziomie głównym. Po skonfigurowaniu trasy w następujący sposób żądanie zostanie wywołane jako http://localhost:<port>/queueTrigger:

http.HandleFunc("/queueTrigger", handleQueueTrigger)

Dekodowanie żądania

Po wysłaniu komunikatu kolejki do Ciebie ma następujący kształt:

{
  "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"
    }
  }
}

W ramach dekodowania żądania przychodzącego potrzebna jest struktura pomocnika, która modeluje poprzedni komunikat. Powinien on wyglądać następująco:

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

Zacznij pisać kod, aby pobrać to żądanie przychodzące i zdekodować je:

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

Teraz jesteś w momencie, w którym żądanie zostało zdekodowane, ale musisz przeanalizować sam komunikat kolejki.

Analizowanie komunikatu kolejki

Po zdekodowaniu żądania z żądania można pobrać komunikat kolejki we właściwości Data. Należy również odwołać się do komunikatu za pomocą wartości właściwości name, którą skonfigurowano w pliku function.json. Kod pobierania komunikatu to jeden wiersz podobny do następującego:

invokeRequest.Data["queueItem"]

Ponieważ musisz mieć możliwość odczytania tej wiadomości w postaci zwykłego tekstu, użyjesz biblioteki JSON i przeanalizujesz ją. Biblioteka JSON będzie używać metody Unmarshal(), która przyjmuje dwa parametry: komunikat do przeanalizowania oraz zmienną, w której zostanie umieszczony przeanalizowany komunikat. Dlatego kod musi wyglądać następująco:

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

W tym momencie parsedMessage zawiera komunikat. Jeśli chcesz wydrukować go w konsoli programu , użyj następującego kodu:

fmt.Println(parsedMessage) // your message

Uwaga

Jeśli komunikat jest bardziej zaawansowany niż ciąg, wtedy parsedMessage powinna mieć strukturę, która odpowiada temu, na co queueMessage wskazuje.

Wyzwalanie komunikatu

Aby przetestować aplikację, możesz użyć Eksplorator usługi Azure Storage. W okienku po prawej stronie narzędzia wybierz przycisk Dodaj komunikat , aby utworzyć komunikat w kolejce.

Zrzut ekranu przedstawiający przycisk dodawania komunikatu w kolejce.

Jeśli masz aplikację usługi Functions i jest ona uruchomiona w tym momencie, spowoduje to wyzwolenie powiązania i wywołanie kodu.