Udostępnij za pośrednictwem


          

PHP na Windows Azure - Mechanizmy przechowywania danych - kolejki Udostępnij na: Facebook

Autor: Maciej Wilgucki

Opublikowano: 2011-04-12

Pobierz i uruchom

Poprzedni artykuł rozpoczął praktyczną część serii, pozwalającą na zapoznanie się z Azure Storage. Dowiedzieliśmy się wówczs, jak korzystać z blobów. Dzisiaj poznamy kolejki oraz dowiemy się, do czego możemy je stosować.

Implementacja

Aplikacja uruchomiana w ramach Windows Azure może się składać z wielu luźno związanych ze sobą elementów. Elementami tymi są role, które działają niezależnie od siebie, niemniej muszą być siebie „świadome" oraz w jakiś sposób się ze sobą komunikować. W tym właśnie celu powstały kolejki. Pozwalają one na wymianę wiadomości między rolami, przy czym jedna wiadomość nie może mieć więcej niż 8KB.

Każda wiadomość składa się z następujących elementów:

  • MessageID – unikatowy identyfikator wiadomości,
  • InsertionTime – kiedy wiadomość została dodana do kolejki,
  • ExpirationTime – kiedy wiadomość stanie się nieaktualna (i tym samym usunięta z kolejki),
  • PopReceipt – ciąg znaków, który w połączeniu z MessageID jednoznacznie identyfikuje wiadomość,
  • TimeNextVisible – czas, po którym obsługiwana wiadomość wraca do kolejki,
  • DequeueCount – licznik określający ile razy dana wiadomość została pobrana z kolejki,
  • MessageText – treść wiadomości.

Pracę zacznijmy od utworzenia kolejki:

 

$host = Microsoft_WindowsAzure_Storage::URL_DEV_QUEUE;
$accountName = Microsoft_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT;
$accountKey = Microsoft_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY;

require_once 'Microsoft/WindowsAzure/Storage/Queue.php';
$queueStorageClient = new Microsoft_WindowsAzure_Storage_Queue(
    $host, 
    $accountName, 
    $accountKey
);
$queueStorageClient->createQueueIfNotExists('kolejka');

Do tak przygotowanej kolejki można dodać wiadomość:

   $queueStorageClient->putMessage('kolejka', 'tresc wiadomosci', 120);

Kolejnymi argumentami funkcji są:

  • nazwa kolejki,
  • treść wiadomości,
  • TTL – czas (w sekundach), przez jaki wiadomość pozostanie w kolejce (domyślnie jest to siedem dni – maksymalny czas przechowywania wiadomości. Po tym czasie wiadomość zostanie automatycznie usunięta).

Wiadomości z kolejki można pobierać na dwa sposoby.

Pierwszy z nich pobiera wiadomość (wiadomości) z kolejki i oznacza jako niewidoczną, aby nikt inny nie mógł tej wiadomości pobrać:

   $queueStorageClient->getMessages('kolejka', 10, 60);

Pierwszym argumentem jest nazwa kolejki, z której wiadomości będą pobierane, drugim ilość wiadomości do pobrania (domyślnie jedna), ostatnim czas (w sekundach), przez jaki wiadomość pozostanie niewidoczna. Tak pobrane wiadomości można w dowolny sposób obsłużyć, a następnie usunąć z kolejki:

$messages = $queueStorageClient->getMessages('kolejka', 10, 60);
foreach($messages as $message) {
    // obsluzenie wiadomosci
    // ...
    $queueStorageClient->deleteMessage('kolejka', $message);
}

Warto widzieć, iż wiadomość może zostać usunięta tylko i wyłącznie przez rolę, która jako ostatnia pobrała wiadomość. Jeśli z jakiegoś powodu wiadomość będzie obsługiwana dłużej niż ustawiony czas obsługi, wówczas ponownie pojawi się ona w kolejce jako nieobsłużona i będzie można ją ponownie pobrać. Co więcej, wartość PopReceipt ulegnie zmianie, uniemożliwiając tym samym usunięcie wiadomości przez instancję roli, która nie zdążyła jej obsłużyć na czas.

Drugim sposobem na sprawdzenie zawartości kolejki, jest jej podglądanie. Podglądanie nie oznacza wiadomości jako przeczytanych, a tym samym nie ingeruje w proces ich obsługi. Wiadomości pobrane w ten sposób nie mogą zostać również usunięte:

   $messages = $queueStorageClient->peekMessages('kolejka', 10);

Ponieważ podglądanie wiadomości nie zmienia ich statusu, nie mamy możliwości ustawienia czasu, przez jaki wiadomość pozostanie niewidoczna.

Praktyczne zastosowanie

Kolejki są bardzo pomocne w przypadku aplikacji, w których pewne operacje mogą negatywnie wpłynąć na wydajność. W takim przypadku długotrwałe operacje wydziela się do osobnej roli (najczęściej jest to rola worker). Jako przykład niech posłuży tutaj aplikacja pozwalająca na konwertowanie plików wideo. Rola web, będąca aplikacją internetową, pozwala użytkownikowi na dodanie pliku wideo oraz na wybór formatu, do jakiego plik ma zostać przekonwertowany. Po przekazaniu pliku, rola web dodaje do kolejki wiadomość z informacją o nowym pliku wideo oraz formacie, do jakiego należy go przekonwertować. Rola worker odbiera wiadomość i rozpoczyna pracę z plikiem. W tym czasie użytkownik może korzystać z aplikacji, która nie jest zablokowana długotrwałą operacją. Po zakończeniu konwersji pliku rola worker wysyła za pomoca kolejki wiadomość z informacją o zakończeniu pracy.