PHP ile Service Bus ve abonelikleri kullanma

Bu makalede, farklı konu başlıklarını ve Service Bus nasıl kullanabileceğiniz gösterir. Örnekler PHP'de yazılır ve PHP için Azure SDK'sı kullanır. Ele alan senaryolar şunlardır:

  • Konu başlıkları ve abonelikler oluşturma
  • Abonelik filtreleri oluşturma
  • Konuya ileti gönderme
  • Abonelikten ileti alma
  • Konu başlıklarını ve abonelikleri silme

Önemli

Şubat 2021'den itibaren PHP için Azure SDK'sı kullanımdan bırakma aşamasına girdi ve artık Microsoft tarafından resmi olarak desteklenmiyor. Daha fazla bilgi için bkz. GitHub. Bu makale yakında kaldıracağız.

Önkoşullar

  1. Azure aboneliği. Bu makaledeki adımları tamamlamak için bir Azure hesabına ihtiyacınız vardır. Visual Studio veya MSDN abone avantajlarınızı etkinleştirebilirsiniz veya ücretsiz bir hesap için kaydolabilirsiniz.

  2. Hızlı Başlangıç: Azure portal kullanarak bir Service Bus ad alanı oluşturmak ve bağlantı dizesini almak için Service Bus konu başlığı ve abonelikleri oluşturun.

    Not

    Bu makalede PHP kullanarak bir konu başlığı ve konu aboneliği oluşturabilirsiniz.

PHP uygulaması oluşturma

Azure Blob hizmetine erişen bir PHP uygulaması oluşturmanın tek gereksinimi, kodunuzun içinde PHP için Azure SDK'daki sınıflara başvuru yapmaktır. Herhangi bir geliştirme aracı kullanarak uygulama oluşturabilir veya Not Defteri.

Not

PHP yüklemenizde OpenSSL uzantısının da yüklü ve etkin olması gerekir.

Bu makalede, bir PHP uygulamasında yerel olarak veya bir Azure web rolü, çalışan rolü veya web sitesi içinde çalışan kodda çağrılabilir hizmet özelliklerini nasıl kullanabileceğiniz açıklanmaktadır.

Azure istemci kitaplıklarını edinin

Composer aracılığıyla yükleme

  1. Projenizin kökünde composer.json adlı bir dosya oluşturun ve buna aşağıdaki kodu ekleyin:

    {
      "require": {
        "microsoft/windowsazure": "*"
      }
    }
    
  2. Proje kök dosyanıza [composer.phar][composer-phar] indirin.

  3. Bir komut istemi açın ve proje kök dizinde aşağıdaki komutu yürütün

    php composer.phar install
    

Service Bus'yi kullanmak için Service Bus

Api'leri Service Bus için:

  1. require_once deyimini kullanarak otomatik require_once bakın.
  2. Kullanabileceğiniz tüm sınıflara bakın.

Aşağıdaki örnekte, otomatik yükleyici dosyasının nasıl dahil olduğu ve ServiceBusService sınıfına nasıl başvur olduğu gösterir.

Not

Bu örnekte (ve bu makaledeki diğer örneklerde) Azure için PHP İstemci Kitaplıklarını Composer. Kitaplıkları el ile veya BIR PEAR paketi olarak yüklemiş olursanız WindowsAzure.php otomatik yükleyici dosyasına başvurmalısınız.

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

Aşağıdaki örneklerde, deyimi her zaman gösterilir, ancak yalnızca örneğin yürütmek require_once için gerekli olan sınıflara başvurur.

Bir Service Bus ayarlama

Bir istemciyi Service Bus için önce şu biçimde geçerli bir bağlantı dizeniz olmalıdır:

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

Burada Endpoint genellikle https://[yourNamespace].servicebus.windows.net biçimindedir.

Herhangi bir Azure hizmet istemcisi oluşturmak için sınıfını kullan ServicesBuilder gerekir. Seçenekleriniz şunlardır:

  • Bağlantı dizesini doğrudan bu dizeye geçin.
  • Bağlantı dizesi için birden çok dış kaynağı kontrol etmek üzere CloudConfigurationManager'ı (CCM) kullanın:
    • Varsayılan olarak, tek bir dış kaynak (ortam değişkenleri) için destekle birlikte gelir.
    • ConnectionStringSource sınıfını genişleterek yeni kaynaklar ekleyebilirsiniz.

Burada özetlenen örnekler için bağlantı dizesi doğrudan geçirilir.

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;

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

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

Konu başlığı oluşturma

Sınıf aracılığıyla konularla ilgili Service Bus işlemleri ServiceBusRestProxy gerçekleştirebilirsiniz. Bir ServiceBusRestProxy nesne, onu ServicesBuilder::createServiceBusService yönetmek için belirteç izinlerini kapsüller uygun bir bağlantı dizesiyle fabrika yöntemi aracılığıyla oluşturulur.

Aşağıdaki örnekte, ad alanı içinde adlı bir konu oluşturmak için bir ServiceBusRestProxy ServiceBusRestProxy->createTopic ve çağrısının nasıl örneği mytopic MySBNamespace oluşturulacaktır:

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 />";
}

Not

Belirtilen ad alanına sahip bir konunun bir hizmet ad alanı içinde zaten var listTopics ServiceBusRestProxy olup oluğunu kontrol etmek için nesneler üzerinde yöntemini kullanabilirsiniz.

Abonelik oluşturma

Konu abonelikleri yöntemiyle de ServiceBusRestProxy->createSubscription oluşturulur. Abonelikler adlandırılır ve aboneliğin sanal kuyruğuna gönderilen ileti kümesini sınırlayan isteğe bağlı bir filtre içerebilir.

Varsayılan (MatchAll) filtreyle abonelik oluşturma

Yeni bir abonelik oluşturulduğunda filtre belirtilmezse MatchAll filtresi (varsayılan) kullanılır. MatchAll filtresi kullanılırken, konu başlığında yayımlanan tüm iletiler aboneliğin sanal kuyruğuna yerleştirilir. Aşağıdaki örnek adlı bir abonelik oluşturur mysubscription ve varsayılan MatchAll filtresini kullanır.

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 />";
}

Filtre içeren abonelik oluşturma

Bir konu başlığına gönderilen iletilerden hangilerinin belirli bir konu başlığı aboneliğinde görüneceğini belirlemenize olanak sağlayan filtreler de ayarlayabilirsiniz. Abonelikler tarafından desteklenen en esnek filtre türü, SQL92'nin bir alt kümesini uygulayan SqlFilter'dır. SQL filtreleri, konu başlığında yayımlanan iletilerin özelliklerinde çalışır. SqlFilters hakkında daha fazla bilgi için bkz. SqlFilter.SqlExpression Özelliği.

Not

Bir abonelikte yer alan her kural, gelen iletileri bağımsız olarak işerek sonuç iletilerini aboneliğe ekler. Ayrıca, her yeni abonelikte, konu başlığından aboneliğe tüm iletileri ekleyen bir filtreye sahip varsayılan bir Kural nesnesi vardır. Yalnızca filtrenize uyan iletileri almak için varsayılan kuralı kaldırmanız gerekir. yöntemini kullanarak varsayılan kuralı ServiceBusRestProxy->deleteRule kaldırebilirsiniz.

Aşağıdaki örnek, yalnızca 3'den büyük özel özelliğe sahip iletileri seçen HighMessages bir SqlFilter ile MessageNumber adlı bir abonelik oluşturur. İletilere özel özellikler ekleme hakkında bilgi için bkz. Bir konuya ileti gönderme.

$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);

Bu kod için ek bir ad alanı gerekir: WindowsAzure\ServiceBus\Models\SubscriptionInfo .

Benzer şekilde, aşağıdaki örnekte yalnızca 3'e eşit veya daha küçük bir özelliği olan iletileri seçen ile LowMessages SqlFilter adlı bir abonelik MessageNumber oluşturur.

$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);

Artık konu başlığına bir ileti gönderilmesi, aboneliğe abone olan alıcılara ve seçmeli olarak ve aboneliklerine abone olan alıcılara (ileti içeriğine bağlı olarak) teslim mytopic mysubscription HighMessages LowMessages edilir.

Konu başlığına ileti gönderme

Bir konu başlığına ileti Service Bus için, uygulama yöntemi ServiceBusRestProxy->sendTopicMessage çağrılır. Aşağıdaki kod, daha önce hizmet ad alanı içinde mytopic oluşturulan konuya ileti göndermeyi MySBNamespace gösterir.

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 />";
}

Service Bus konu başlıklarına gönderilen iletiler, BrokeredMessage sınıfının örnekleridir. BrokeredMessage nesnelerinin bir dizi standart özellik ve yönteminin yanı sıra uygulamaya özgü özel özellikleri tutmak için kullanılmaktadır. Aşağıdaki örnekte, daha önce oluşturulan konu başlığına beş test mytopic iletisinin nasıl gönder belirtildiğini gösterir. yöntemi, setProperty her iletiye özel bir özellik ( MessageNumber ) eklemek için kullanılır. Özellik değeri her iletiye göre değişir (Abonelik oluşturma bölümünde gösterildiği gibi, bu değeri hangi aboneliklerin bu değeri MessageNumber alacaklarını belirlemek için kullanabilirsiniz):

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 konu başlıkları, Standart katmanda en fazla 256 KB ve standart katmanda 100 MB ileti Premium destekler. Standart ve özel uygulama özelliklerini içeren üst bilginin maksimum dosya boyutu 64 KB olabilir. Konu başlığında tutulan ileti sayısına ilişkin bir sınır yoktur ancak konu başlığı tarafından tutulan iletilerin toplam boyutu için uç sınır vardır. Konu boyutu üst sınırı 5 GB'tır. Kotalar hakkında daha fazla bilgi için bkz. Service Bus kotaları.

Abonelikten ileti alma

Abonelikten ileti almanın en iyi yolu yöntem ServiceBusRestProxy->receiveSubscriptionMessage kullanmakdır. İletiler iki farklı modda alınabiliyor: ReceiveAndDelete ve PeekLock. PeekLock varsayılan değerdir.

ReceiveAndDelete modunu kullanırken alma işlemi tek aşamalıdır. Service Bus abonelikte bir iletiye yönelik okuma isteği aldığında, iletiyi kullanılıyor olarak işaretler ve uygulamaya döndürür. ReceiveAndDelete * modu en basit modeldir ve bir uygulamanın hata oluştuğunda bir iletiyi işlemeyi tolere edilemeyen senaryolar için en iyi şekilde çalışır. Bu durumu daha iyi anlamak için müşterinin bir alma isteği bildirdiğini ve bu isteğin işlenmeden çöktüğünü varsayın. Bu Service Bus iletiyi tüketiliyor olarak işaretledikten sonra uygulama yeniden başlatıldığında ve iletileri yeniden tüketmaya başladığında, kilitlenmeden önce tüketilen iletiyi atlar.

Varsayılan PeekLock modunda, bir ileti almak iki aşamalı bir işlem haline gelir ve bu da eksik iletileri tolere edilemez uygulamaları desteklemeyi mümkün hale gelir. Service Bus bir istek aldığında bir sonraki kullanılacak iletiyi bulur, diğer tüketicilerin bu iletiyi almasını engellemek için kilitler ve ardından uygulamaya döndürür. Uygulama iletiyi işlemeyi tamamlandıktan (veya gelecekteki işleme için güvenilir bir şekilde depolandıktan) sonra, alınan iletiyi 'ye aktararak alma işleminin ikinci aşamasını ServiceBusRestProxy->deleteMessage tamamlar. Çağrıyı deleteMessage Service Bus, iletiyi tüketiliyor olarak işaretler ve kuyruktan kaldırır.

Aşağıdaki örnekte PeekLock modu (varsayılan mod) kullanılarak iletiyi alma ve işleme işlemi gösterir.

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 />";
}

Nasıl: Uygulama kilitlenmelerini ve okunamaz iletileri işleme

Service Bus, uygulamanızda gerçekleşen hataları veya ileti işlenirken oluşan zorlukları rahat bir şekilde ortadan kaldırmanıza yardımcı olmak için işlevsellik sağlar. Alıcı uygulama herhangi bir nedenle iletiyi işleyenene kadar, alınan iletide unlockMessage yöntemini çağırabilirsiniz (yöntemi deleteMessage yerine). Bu Service Bus kuyruk içindeki iletinin kilidini açmanızı ve aynı uygulama veya başka bir tüketen uygulama tarafından tekrar alına iletiyi kullanılabilir hale göndermenizi sağlar.

Kuyrukta kilitlenmiş bir iletiyle ilişkilendirilmiş bir zaman aşımı da vardır ve uygulama kilit zaman aşımı dolmadan önce iletiyi işleyemezse (örneğin, uygulama kilitlenirse), Service Bus otomatik olarak iletinin kilidini açabilir ve yeniden alınamaz hale döndürür.

Uygulamanın iletiyi işledikten sonra ancak istek göndermeden önce kilitlenmesi durumunda, ileti yeniden başlatıldığında uygulamaya deleteMessage yeniden teslim olur. Bu işleme türü genellikle en az bir kez işleme olarak çağrılır; Diğer bir ifadeyle, her ileti en az bir kez işlenir, ancak bazı durumlarda aynı ileti yeniden teslim edile bir ileti olabilir. Senaryo yinelenen işlemeyi tolere edeyenese, uygulama geliştiricileri yinelenen ileti teslimi için uygulamalara ek mantık eklemeli. Genellikle ileti yöntemi kullanılarak getMessageId elde edilir ve bu yöntem teslim denemeleri arasında sabit kalır.

Konu başlıklarını ve abonelikleri silme

Bir konuyu veya aboneliği silmek için ServiceBusRestProxy->deleteTopic sırasıyla veya ServiceBusRestProxy->deleteSubscripton yöntemlerini kullanın. Bir konu başlığı silindiğinde bu konu başlığıyla kaydedilen tüm abonelikler de silinir.

Aşağıdaki örnek, adlı bir konunun ve kayıtlı aboneliklerin mytopic nasıl silineceklerini gösterir.

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 />";
}

yöntemini kullanarak deleteSubscription aboneliği bağımsız olarak silebilirsiniz:

$serviceBusRestProxy->deleteSubscription("mytopic", "mysubscription");

Not

Service Bus Explorer Service Bus kaynakları yönetebilirsiniz. Service Bus Gezgini, kullanıcıların bir ad alanına Service Bus ve mesajlaşma varlıklarını kolay bir şekilde yönetmelerini sağlar. Araç, içeri/dışarı aktarma işlevi veya konu, kuyruk, abonelik, geçiş hizmetleri, bildirim hub'ları ve olay hub'larını test etme özelliği gibi gelişmiş özellikler sağlar.

Sonraki adımlar

Daha fazla bilgi için bkz. Kuyruklar, konular ve abonelikler.