jak používat Service Bus témata a odběry pomocí PHP
v tomto článku se dozvíte, jak používat Service Bus témata a odběry. Ukázky jsou napsané v PHP a používají sadu Azure SDK pro php. Mezi zahrnuté scénáře patří:
- Vytváření témat a předplatných
- Vytváření filtrů předplatného
- Odesílání zpráv do tématu
- Příjem zpráv z předplatného
- Odstraňování témat a předplatných
Důležité
Od února 2021 předchází sada Azure SDK pro PHP fázi odchodu a společnost Microsoft je již oficiálně nepodporuje. Další informace najdete v tomto oznámení o github. Tento článek bude brzy vyřazen.
Požadavky
Předplatné Azure. K dokončení kroků v tomto článku potřebujete účet Azure. můžete aktivovat výhody pro předplatitele Visual Studio nebo MSDN nebo si zaregistrovat bezplatný účet.
postupujte podle kroků v rychlém startu: použijte Azure Portal k vytvoření Service Bus tématu a odběry tématu k vytvoření oboru názvů Service Bus a získání připojovacího řetězce.
Poznámka
V tomto článku vytvoříte téma a předplatné k tématu pomocí php .
Vytvoření aplikace PHP
Jediným požadavkem pro vytvoření aplikace PHP, která přistupuje k Blob service Azure, 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 libovolné vývojové nástroje nebo Poznámkový blok.
Poznámka
Vaše instalace PHP musí také mít nainstalované a povolené rozšíření OpenSSL .
Tento článek popisuje, jak používat funkce služby, které lze volat v rámci aplikace PHP místně, nebo v kódu spuštěném v rámci webové role Azure, role pracovního procesu nebo webu.
Získání klientských knihoven Azure
Instalace prostřednictvím Composer
V kořenovém adresáři projektu vytvořte soubor s názvem skladatel. JSON a přidejte do něj následující kód:
{ "require": { "microsoft/windowsazure": "*" } }V kořenovém adresáři projektu stáhněte [skladatele. phar] [skladatele-phar] .
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
použití rozhraní Service Bus api:
- Odkazování na soubor automatického zavaděče pomocí příkazu require_once .
- Odkázat na libovolné třídy, které můžete použít.
Následující příklad ukazuje, jak zahrnout soubor automatického zavaděče a odkazovat na třídu ServiceBusService .
Poznámka
V tomto příkladu (a dalších příkladech v tomto článku) se předpokládá, že máte nainstalované klientské knihovny PHP pro Azure přes Composer. Pokud jste knihovny nainstalovali ručně nebo jako balíček pro HRUŠKy, musíte se odkázat na soubor automatického zavaděče windowsazure. php .
require_once 'vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;
V následujících příkladech require_once je příkaz vždy zobrazen, ale jsou odkazovány pouze třídy, které jsou nezbytné pro spuštění příkladu.
nastavení Service Busho připojení
chcete-li vytvořit instanci klienta Service Bus, 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 formát https://[yourNamespace].servicebus.windows.net .
Chcete-li vytvořit libovolného klienta služby Azure, musíte použít ServicesBuilder třídu. Další možnosti:
- Předání připojovacího řetězce přímo do něj.
- Použijte CloudConfigurationManager (ccm) pro kontrolu několika externích zdrojů pro připojovací řetězec:
- Ve výchozím nastavení se dodává s podporou pro jednu externí proměnnou zdrojového prostředí.
- Nové zdroje můžete přidat rozšířením třídy
ConnectionStringSource.
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í tématu
můžete provádět operace správy pro Service Bus témata prostřednictvím ServiceBusRestProxy třídy. ServiceBusRestProxyObjekt je vytvořen pomocí ServicesBuilder::createServiceBusService metody Factory s příslušným připojovacím řetězcem, který zapouzdřuje oprávnění tokenu pro jeho správu.
Následující příklad ukazuje, jak vytvořit instanci ServiceBusRestProxy a volání ServiceBusRestProxy->createTopic pro vytvoření tématu s názvem mytopic v rámci MySBNamespace oboru názvů:
require_once 'vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\TopicInfo;
// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);
try {
// Create topic.
$topicInfo = new TopicInfo("mytopic");
$serviceBusRestProxy->createTopic($topicInfo);
}
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
Můžete použít listTopics metodu pro ServiceBusRestProxy objekty a ověřit, zda téma se zadaným názvem již existuje v oboru názvů služby.
Vytvoření předplatného
Odběry témat jsou také vytvořeny s ServiceBusRestProxy->createSubscription metodou. Odběry mají názvy a můžou mít volitelné filtry, které omezují výběr zpráv odesílaných do virtuální fronty odběru.
Vytvoření odběru s výchozím filtrem (MatchAll).
Pokud při vytvoření nového předplatného není zadaný žádný filtr, použije se filtr MatchAll (výchozí). Když se použije filtr MatchAll , všechny zprávy publikované v tématu se umístí do virtuální fronty odběru. Následující příklad vytvoří odběr s názvem mysubscription a použije výchozí filtr MatchAll .
require_once 'vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\SubscriptionInfo;
// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);
try {
// Create subscription.
$subscriptionInfo = new SubscriptionInfo("mysubscription");
$serviceBusRestProxy->createSubscription("mytopic", $subscriptionInfo);
}
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 />";
}
Vytvoření odběru s filtry
Můžete taky vytvořit filtry, které vám umožní zprávy odeslané do tématu zobrazit v konkrétním odběru tématu. Nejpružnější typ filtru podporovaný předplatnými je SqlFilter, které implementuje podmnožinu SQL92. Filtry SQL pracují s vlastnostmi zpráv publikované do tématu. Další informace o SqlFilters naleznete v tématu vlastnost SqlFilter. syntaxi.
Poznámka
Každé pravidlo v předplatném zpracovává příchozí zprávy nezávisle a přidává jejich výsledné zprávy do předplatného. Kromě toho má každé nové předplatné výchozí objekt Rule s filtrem, který přidává všechny zprávy z tématu do předplatného. Chcete-li dostávat pouze zprávy, které odpovídají vašemu filtru, je nutné odebrat výchozí pravidlo. Výchozí pravidlo můžete odebrat pomocí ServiceBusRestProxy->deleteRule metody.
Následující příklad vytvoří odběr s názvem HighMessages SqlFilter , který vybere pouze zprávy, které mají vlastní MessageNumber vlastnost větší než 3. Informace o přidávání vlastních vlastností do zpráv naleznete v tématu odeslání zpráv do tématu .
$subscriptionInfo = new SubscriptionInfo("HighMessages");
$serviceBusRestProxy->createSubscription("mytopic", $subscriptionInfo);
$serviceBusRestProxy->deleteRule("mytopic", "HighMessages", '$Default');
$ruleInfo = new RuleInfo("HighMessagesRule");
$ruleInfo->withSqlFilter("MessageNumber > 3");
$ruleResult = $serviceBusRestProxy->createRule("mytopic", "HighMessages", $ruleInfo);
Tento kód vyžaduje použití dalšího oboru názvů: WindowsAzure\ServiceBus\Models\SubscriptionInfo .
Podobně následující příklad vytvoří odběr s názvem LowMessages s SqlFilter tím, že vybere pouze zprávy, které mají MessageNumber vlastnost menší nebo rovna 3.
$subscriptionInfo = new SubscriptionInfo("LowMessages");
$serviceBusRestProxy->createSubscription("mytopic", $subscriptionInfo);
$serviceBusRestProxy->deleteRule("mytopic", "LowMessages", '$Default');
$ruleInfo = new RuleInfo("LowMessagesRule");
$ruleInfo->withSqlFilter("MessageNumber <= 3");
$ruleResult = $serviceBusRestProxy->createRule("mytopic", "LowMessages", $ruleInfo);
Když se teď zpráva pošle do mytopic tématu, je vždycky Doručená příjemcům, kteří se přihlásili k mysubscription předplatnému, a selektivně doručovat příjemcům HighMessages a LowMessages předplatným (v závislosti na obsahu zprávy).
Odeslání zprávy do tématu
chcete-li odeslat zprávu do Service Bus téma, vaše aplikace volá ServiceBusRestProxy->sendTopicMessage metodu. Následující kód ukazuje, jak odeslat zprávu do tématu, které bylo mytopic dříve vytvořeno v rámci MySBNamespace oboru názvů 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->sendTopicMessage("mytopic", $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 témat Service Bus jsou instance třídy BrokeredMessage. Objekty BrokeredMessage mají sadu standardních vlastností a metod, jakož i vlastnosti, které lze použít pro uložení vlastních vlastností specifických pro aplikace. Následující příklad ukazuje, jak odeslat pět testovacích zpráv do mytopic dříve vytvořeného tématu. setPropertyMetoda se používá k přidání vlastní vlastnosti ( MessageNumber ) ke každé zprávě. MessageNumberHodnota vlastnosti se u každé zprávy liší (tuto hodnotu můžete použít k určení, které odběry obdrží, jak je znázorněno v části vytvoření předplatného ):
for($i = 0; $i < 5; $i++){
// Create message.
$message = new BrokeredMessage();
$message->setBody("my message ".$i);
// Set custom property.
$message->setProperty("MessageNumber", $i);
// Send message.
$serviceBusRestProxy->sendTopicMessage("mytopic", $message);
}
Service Bus témata podporují maximální velikost zprávy 256 KB na úrovni Standard a 100 MB v 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 v tématu není omezený, ale celková velikost zpráv držených v tématu omezená je. Tento horní limit velikosti tématu je 5 GB. další informace o kvótách najdete v tématu Service Bus kvóty.
Přijímání zpráv z předplatného
Nejlepším způsobem, jak přijímat zprávy z předplatného, je použití ServiceBusRestProxy->receiveSubscriptionMessage metody. Zprávy mohou být přijímány 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 – tzn. když Service Bus přijme požadavek na čtení zprávy v odběru, označí zprávu jako spotřebovávanou a vrátí ji do aplikace. ReceiveAndDelete * režim je nejjednodušší model a funguje nejlépe ve scénářích, ve kterých aplikace může tolerovat nezpracovávání zprávy, když dojde k selhání. 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. vzhledem k tomu, že Service Bus označila zprávu jako spotřebovaná, pak když se aplikace znovu spustí a začne znovu přijímat zprávy, vynechala zprávu, která byla spotřebována před selháním.
Ve výchozím režimu PeekLock se příjem zprávy stane dvě operace fáze, která umožňuje podporovat aplikace, které nemůžou tolerovat chybějící zprávy. Když Service Bus přijme požadavek, najde zprávu, která je na řadě ke spotřebování, uzamkne ji proti spotřebování jinými spotřebiteli a vrátí ji do aplikace. Poté, co aplikace dokončí zpracování zprávy (nebo je uloží spolehlivě pro budoucí zpracování), dokončí druhou fázi procesu příjmu tím, že se přijatá zpráva pošle do ServiceBusRestProxy->deleteMessage . když Service Bus uvidí deleteMessage volání, označí zprávu jako spotřebou a 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 receive mode to PeekLock (default is ReceiveAndDelete)
$options = new ReceiveMessageOptions();
$options->setPeekLock();
// Get message.
$message = $serviceBusRestProxy->receiveSubscriptionMessage("mytopic", "mysubscription", $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 "Deleting message...<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 />";
}
Postupy: Zpracování chybových u aplikací 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 ). 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 automaticky ji a znovu ji zpřístupní.
V případě, že aplikace po zpracování zprávy dojde k chybě, ale před vydáním požadavku, zpráva se do aplikace znovu doručí při deleteMessage restartování. Tento typ zpracování 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 stejná zpráva může doručit znovu. Pokud scénář nemůže tolerovat duplicitní zpracování, měli by vývojáři aplikací přidat do aplikací další logiku pro zpracování duplicitního doručování zpráv. Často se toho dosahuje pomocí metody zprávy, která při pokusech o doručení zůstává getMessageId konstantní.
Odstranění témat a odběrů
Pokud chcete odstranit téma nebo odběr, použijte metody ServiceBusRestProxy->deleteTopic ServiceBusRestProxy->deleteSubscripton nebo . Pokud se odstraní téma, odstraní se i všechny odběry registrované k tomuto tématu.
Následující příklad ukazuje, jak odstranit téma s názvem a mytopic jeho registrovanými odběry.
require_once 'vendor/autoload.php';
use WindowsAzure\ServiceBus\ServiceBusService;
use WindowsAzure\ServiceBus\ServiceBusSettings;
use WindowsAzure\Common\ServiceException;
// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);
try {
// Delete topic.
$serviceBusRestProxy->deleteTopic("mytopic");
}
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 />";
}
Pomocí metody deleteSubscription můžete odběr odstranit nezávisle:
$serviceBusRestProxy->deleteSubscription("mytopic", "mysubscription");
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
Další informace najdete v tématu Fronty, témata a odběry.