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)