Obsługa Azure Storage Queue w Go

Prosty przykład jak użyć kolejek w Azure Storage za pomocą Go. Akurat potrzebuję tego w jednym prywatnym projekcie i nie mogłem znaleźć żadnego przykładu i dokumentacji, więc postanowiłem podzielić się kawałkiem kodu i komentarzy dla potomności :-)

Ważne! W momencie pisania obsługa kolejek w Storage jest dostępna tylko w Azure SDK for Go, ale zostanie to usunięte jak tylko zostanie ukończone SDK dedykowane do obsługi storage - Azure Blob Storage Library for Go

Zaczynamy od importu sdk dla storage.

import (
	"github.com/Azure/azure-sdk-for-go/storage"
)

Przygotowanie zmiennych dostępowych do konta (nazwa i klucz). Może być ze zmiennych środowiskowych

accountName, accountKey := os.Getenv("ACCOUNT_NAME"), os.Getenv("ACCOUNT_KEY")

lub na “chama” ;)

accountName := "<nazwa konta Storage>"
accountKey := "<klucz do konta Storage>"

Przygotowanie zmiennej z nazwę kolejki.

queueName := "inq"

Tworzymy klienta storage korzystając z NewBasicClient

client, err := storage.NewBasicClient(accountName, accountKey)

Tworzymy dostęp do usługi kolejki korzystając z GetQueueService, a następnie referencję do kolejki, z której chcemy skorzystać.

bsq := client.GetQueueService()
queue := bsq.GetQueueReference(queueName)

Warto tez sprawdzić, czy kolejka istnieje. Słuzy do tego Exists. W SDK dla C# jest to lepiej rozwiązane - jest funkcja CreateIfNotExists i nie trzeba bawić się w sprawdzanie.

queueExists, err := queue.Exists()

if err != nil {
	log.Fatal(err)
}

fmt.Printf("queue %s exists: %t\n", queueName, queueExists)

i jeśli nie istnieje to stworzenie za pomocą Create.

err := queue.Create(nil)

Tworzenie wiadomości odbywa się za pomocą struktury storage.Message. Dwie istotne właściwości to podanie zmiennej z kolejka do Queue oraz samej zawartości wiadomość do Text.

message := storage.Message{Queue: queue, Text: "Zawartość wiadomości"}

Wysłanie realizujemy funkcją Put na wiadomości.

err = message.Put(nil)

Pobranie wiadomości z kolejki realizujemy funkcja GetMessages. Zwraca on tablice wiadomości. Domyślnie jest pobierana jedna wiadomość.

messages, err := queue.GetMessages(nil)
if err != nil {
	log.Fatal(err)
}

Najprościej wiadomości przetworzyć za pomocą range.

if messages != nil {
	for _, element := range messages {
        fmt.Printf("message ID: %v message text: %v\n", element.ID, element.Text)
	}
}

Jeśli potrzebujmy pobrać więcej wiadomości lub chcemy zwiększyć czas ukrycia wiadomość na kolejce po pobraniu to GetMessages pozwala na parametryzację za pomocą struktury storage.GetMessagesOptions.

messagesOptions := &storage.GetMessagesOptions{NumOfMessages: 10, VisibilityTimeout: 60}
messages, err = queue.GetMessages(messagesOptions)
if err != nil {
	log.Fatal(err)
}

Po przetworzeniu usuwanie wiadomość realizujemy za pomocą Delete.

err = message.Delete(nil)

Na koniec kasowanie kolejki. Również Delete, tylko na kolejce.

err = queue.Delete(nil)

Cały kod