Jak používat fronty Service Bus s PHP

V tomto článku se dozvíte, jak vytvářet aplikace PHP pro odesílání zpráv do fronty Service Bus zprávy.

Důležité

Od února 2021 se sada Azure SDK pro PHP zahájila do fáze vyřazení a Microsoft už ho oficiálně nepodporuje. Další informace najdete v tomto oznámení na GitHub. Tento článek bude brzy vyřazen.

Požadavky

  1. Předplatné Azure. K dokončení tohoto kurzu potřebujete mít účet Azure. Můžete si aktivovat výhody předplatitele MSDN nebo si zaregistrovat bezplatný účet.
  2. Pokud nemáte frontu, se kterou můžete pracovat, postupujte podle kroků v článku Vytvoření fronty pomocí Azure Portal k vytvoření fronty Service Bus fronty.
    1. Přečtěte si rychlý přehled Service Bus front.

    2. Vytvořte obor názvů Service Bus .

    3. Získejte připojovací řetězec.

      Poznámka

      Frontu vytvoříte v oboru názvů Service Bus pomocí PHP v tomto článku.

  3. Azure SDK pro PHP

Vytvoření aplikace PHP

Jediným požadavkem pro vytvoření aplikace PHP, která přistupuje ke službě Azure Blob service, je odkazování na třídy v sadě Azure SDK pro PHP z vašeho kódu. K vytvoření aplikace můžete použít jakékoli vývojové nástroje nebo Poznámkový blok.

Poznámka

Instalace PHP také musí mít nainstalované a povolené rozšíření OpenSSL.

V této příručce budete používat funkce služby, které je možné volat z aplikace PHP místně nebo v kódu spuštěném v rámci webové role, role pracovního procesu nebo webu Azure.

Získání klientských knihoven Azure

Instalace prostřednictvím skladatele

  1. V kořenovém adresáři projektu vytvořte soubor s názvem composer.js a přidejte do něj následující kód:

    {
      "require": {
        "microsoft/windowsazure": "*"
      }
    }
    
  2. Stáhněte si skladatel. phar do kořenového adresáře projektu.

  3. Otevřete příkazový řádek a v kořenovém adresáři projektu spusťte následující příkaz.

    php composer.phar install
    

Konfigurace aplikace pro použití Service Bus

Pokud chcete použít Service Bus fronty rozhraní API, proveďte následující:

  1. Odkažte na soubor automatického zavaděče pomocí require_once .
  2. Odkazovat na všechny třídy, které můžete použít.

Následující příklad ukazuje, jak zahrnout soubor automatického načítání a odkazovat na ServicesBuilder třídu .

Poznámka

Tento příklad (a další příklady v tomto článku) předpokládá, že jste nainstalovali klientské knihovny PHP pro Azure prostřednictvím Composer. Pokud jste knihovny nainstalovali ručně nebo jako balíček PEAR, musíte odkazovat na soubor WindowsAzure.php autoloader.

require_once 'vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;

V následujících příkladech se vždy zobrazí příkaz , ale odkazují se pouze na třídy potřebné ke spuštění require_once příkladu.

Nastavení Service Bus připojení

Pokud chcete vytvořit Service Bus klienta, musíte nejprve mít platný připojovací řetězec v tomto formátu:

Endpoint=[yourEndpoint];SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[Primary Key]

Kde Endpoint je obvykle ve formátu [yourNamespace].servicebus.windows.net .

Pokud chcete vytvořit libovolného klienta služby Azure, musíte použít ServicesBuilder třídu . Další možnosti:

  • Předejte do něj připojovací řetězec přímo.
  • Použijte CloudConfigurationManager (CCM) ke kontrole připojovacího řetězce ve více externích zdrojích:
    • Ve výchozím nastavení obsahuje podporu jednoho externího zdroje – proměnných prostředí.
    • Rozšířením třídy můžete přidat nové ConnectionStringSource zdroje.

Ve zde uvedených příkladech se připojovací řetězec předává přímo.

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;

$connectionString = "Endpoint=[yourEndpoint];SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[Primary Key]";

$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

Vytvoření fronty

Operace správy pro fronty Service Bus prostřednictvím ServiceBusRestProxy třídy . Objekt je vytvořen pomocí metody factory s odpovídajícím připojovacím řetězcem, který zapouzdřuje ServiceBusRestProxy ServicesBuilder::createServiceBusService oprávnění tokenu pro jeho správu.

Následující příklad ukazuje, jak vytvořit instanci a volání pro vytvoření fronty s názvem v rámci ServiceBusRestProxy ServiceBusRestProxy->createQueue oboru názvů myqueue MySBNamespace služby:

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\QueueInfo;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    $queueInfo = new QueueInfo("myqueue");

    // Create queue.
    $serviceBusRestProxy->createQueue($queueInfo);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Poznámka

Pomocí metody u objektů můžete zkontrolovat, jestli fronta se zadaným názvem již v rámci oboru listQueues ServiceBusRestProxy názvů existuje.

Zasílání zpráv do fronty

Pokud chcete odeslat zprávu do Service Bus fronty, volá aplikace ServiceBusRestProxy->sendQueueMessage metodu . Následující kód ukazuje, jak odeslat zprávu do fronty dříve myqueue vytvořené v rámci oboru názvů MySBNamespace služby.

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\BrokeredMessage;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    // Create message.
    $message = new BrokeredMessage();
    $message->setBody("my message");

    // Send message.
    $serviceBusRestProxy->sendQueueMessage("myqueue", $message);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Zprávy odeslané do (a přijaté z) Service Bus fronty jsou instancemi třídy BrokeredMessage. Objekty BrokeredMessage mají sadu standardních metod a vlastností, které se používají k podržení vlastních vlastností specifických pro aplikaci, a tělo libovolných dat aplikace.

Service Bus fronty podporují maximální velikost zpráv 256 kB na úrovni Standard a 100 MB na Premium vrstvě. Hlavička, která obsahuje standardní a vlastní vlastnosti aplikace, může mít velikost až 64 KB. Počet zpráv držených ve frontě není omezený, ale celková velikost zpráv držených ve frontě omezená je. Toto horní omezení velikosti fronty je 5 GB.

Příjem zpráv z fronty

Nejlepší způsob, jak přijímat zprávy z fronty, je použít ServiceBusRestProxy->receiveQueueMessage metodu . Zprávy je možné přijímat ve dvou různých režimech: ReceiveAndDelete a PeekLock. Výchozí hodnota je PeekLock.

Při použití režimu ReceiveAndDelete je přijetí jednorázová operace. To znamená, že Service Bus požadavek na čtení zprávy ve frontě, označí zprávu jako spotřebovanou a vrátí ji do aplikace. Režim ReceiveAndDelete je nejjednodušší model a funguje nejlépe ve scénářích, kde aplikace může tolerovat možnost, že v případě selhání se zpráva nezpracuje. Pro lepší vysvětlení si představte scénář, ve kterém spotřebitel vyšle požadavek na přijetí, ale než ji může zpracovat, dojde v něm k chybě a ukončí se. Protože Service Bus označí zprávu jako spotřebovanou, pak když se aplikace restartuje a začne znovu používat zprávy, vynechá zprávu, která se spotřebovává před chybou.

Ve výchozím režimu PeekLock se přijetí zprávy stane dvoustupňovou operací, která umožňuje podporovat aplikace, které nemohou tolerovat chybějící zprávy. Když Service Bus požadavek, najde další zprávu, která se má použít, uzamkne ji, aby ji ostatní spotřebiteli obdrželi, a pak ji vrátí do aplikace. Jakmile aplikace dokončí zpracování zprávy (nebo ji spolehlivě uloží pro budoucí zpracování), dokončí druhou fázi procesu příjmu předáním přijaté zprávy do ServiceBusRestProxy->deleteMessage . Když Service Bus volání , označí zprávu jako spotřebovanou a deleteMessage odebere ji z fronty.

Následující příklad ukazuje, jak přijmout a zpracovat zprávu pomocí režimu PeekLock (výchozí režim).

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\ReceiveMessageOptions;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    // Set the receive mode to PeekLock (default is ReceiveAndDelete).
    $options = new ReceiveMessageOptions();
    $options->setPeekLock();

    // Receive message.
    $message = $serviceBusRestProxy->receiveQueueMessage("myqueue", $options);
    echo "Body: ".$message->getBody()."<br />";
    echo "MessageID: ".$message->getMessageId()."<br />";

    /*---------------------------
        Process message here.
    ----------------------------*/

    // Delete message. Not necessary if peek lock is not set.
    echo "Message deleted.<br />";
    $serviceBusRestProxy->deleteMessage($message);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Zpracování pádů aplikace a nečitelných zpráv

Service Bus poskytuje funkce, které vám pomůžou se elegantně zotavit z chyb v aplikaci nebo vyřešit potíže se zpracováním zprávy. Pokud přijímací aplikace z nějakého důvodu nedokáže zprávu zpracovat, může volat metodu u přijaté zprávy unlockMessage (místo deleteMessage metody ). To způsobí, Service Bus zprávu ve frontě odemkne a znovu ji zpřístupní, ať už stejnou spotřebovávající aplikací, nebo jinou spotřebovávající aplikací.

Zpráva uzamčená ve frontě má také časový limit a pokud se aplikaci nepodaří zprávu zpracovat před vypršením časového limitu uzamčení (například pokud dojde k chybě aplikace), odemkne Service Bus zprávu automaticky a znovu ji zpřístupní k přijetí.

V případě, že aplikace po zpracování zprávy dojde k chybě, ale před vydáním požadavku, zpráva se po restartování znovu deleteMessage doručí do aplikace. To se často nazývá alespoň jedno zpracování. To znamená, že každá zpráva se zpracuje alespoň jednou, ale v určitých situacích se může doručit stejná zpráva znovu. Pokud scénář nemůže tolerovat duplicitní zpracování, doporučuje se přidat do aplikací další logiku pro zpracování duplicitních zpráv. Toho se často dosahuje pomocí metody zprávy, která zůstává konstantní getMessageId při pokusech o doručení.

Poznámka

Prostředky pro správu Service Bus můžete spravovat pomocí Service Bus Exploreru. Průzkumník Service Bus umožňuje uživatelům snadno se připojit k Service Bus oboru názvů a spravovat entity zasílání zpráv. Nástroj poskytuje pokročilé funkce, jako jsou funkce importu a exportu nebo možnost testovat téma, fronty, odběry, předávací služby, centra oznámení a centra událostí.

Další kroky

Teď, když jste se naučili základy front Service Bus, najdete další informace v tématu Fronty, témata a odběry.

Další informace najdete také ve Středisku pro vývojáře PHP.