Message Queue will be discontinued on March 1, 2017. IBM Bluemix (Formerly SoftLayer) will discontinue support on January 31, 2017.

Fila de mensagens: explorando tópicos

Terminologia

  • Tópico -- um recurso-pai ao qual assinaturas pertencem.
  • Tags de tópicos -- uma coleção de nomes de tags individuais que podem ser úteis na classificação e no agrupamento de tópicos.
  • Campos de mensagens -- uma coleção estruturada de valor-chave que pode ser incluída em mensagens individuais. Usados para substituição de variável quando uma mensagem é enviada a assinantes.
  • Assinatura -- um mecanismo para consumir automaticamente mensagens postadas em um tópico para distribuição. Geralmente, assume o formato de um terminal HTTP ou de uma fila já criada em sua conta.
  • Terminal -- um terminal é um destino HTTP ou baseado em fila no qual mensagens serão entregues.

Criando e atualizando um tópico

Em Fila de mensagens: explorando filas, criamos uma fila usando nosso cliente do sistema de mensagens autenticado. De maneira muito semelhante, podemos criar e modificar um tópico.

$messaging = new SoftLayer_Messaging();
if (!$messaging->authenticate(QUEUE_ACCOUNT, QUEUE_USERNAME, QUEUE_API_KEY)) {
    echo "Unable to authenticate!" . PHP_EOL;
    exit;
}
$my_first_topic = $messaging->topic('my_first_topic')->create();

Novamente, semelhante à criação de fila, os tópicos requerem somente que um nome seja criado. Além de seu nome, um tópico também pode ter tags para agrupamento lógico.

$my_first_topic->setTags(array('tag1'));
$my_first_topic->update();

Um cenário de assinatura e notificação

Digamos que temos um aplicativo consideravelmente crítico para nossos negócios. Precisamos de uma maneira confiável para transmitir e registrar eventos críticos pelo sistema sem incluir infraestrutura adicional própria.

Primeiro, precisamos de uma fila de compilação geral. Isso permitirá manter um acompanhamento completo de eventos do sistema e, posteriormente, consumir mensagens desta fila para armazená-las em uma tabela de "incidentes" em nosso banco de dados.

$messaging->queue('system_events_log')->create();
$logger = new SoftLayer_Messaging_Endpoint_Queue();
$logger->setQueueName('system_events_log');
$messaging->topic('my_first_topic')->subscription()
    ->setEndpointType('queue')
    ->setEndpoint($logger)
    ->create();

Essa fila irá registrar todas as mensagens postadas neste tópico, mesmo se outros terminais potencialmente não confiáveis nunca receberem nossa mensagem.

Para notificações por e-mail sobre esses eventos, podemos incluir um terminal HTTP que se aproxima da API SendGrid. Usando substituição de variável (que veremos posteriormente), podemos modificar o assunto do e-mail rapidamente para permitir que os interesses de gravidade sejam observados em uma visão rápida.

    $sendgrid = new SoftLayer_Messaging_Endpoint_Http();
    $sendgrid->setMethod("POST");
    $sendgrid->setUrl("https://sendgrid.com/api/mail.send.json");
    $sendgrid->setHeaders(array("Content-Type" => "application/x-www-form-urlencoded"));
    $sendgrid->setBody("to=ops@example.com&from=logger@example.com&subject={severity}:Logger&text={body}&api_user=youruser&api_key=yourkey");
 
    $messaging->topic('my_first_topic')->subscription()
        ->setEndpointType('http')
        ->setEndpoint($sendgrid)
        ->create();

(É claro que você precisará ter uma conta SendGrid ativa e modificar o item acima para usar suas próprias credenciais para que funcione.) E-mail é bom, mas não verificamos e-mail o tempo todo. Para assegurar que nossa equipe de prontidão receba essas notificações com tempo suficiente para responder, podemos incluir Twilio para sistema de mensagens de texto. Usando substituição de variável novamente, podemos alinhar a gravidade com o corpo.

    $twilio = new SoftLayer_Messaging_Endpoint_Http();
    $twilio->setMethod("POST");
    $twilio->setUrl("https://youraccount:yourtoken@api.twilio.com/2010-04-01/Accounts/youraccount/SMS/Messages.json");
    $twilio->setHeaders(array("Content-Type" => "application/x-www-form-urlencoded"));
    $twilio->setBody("From=14155550000&To=12145550000&Body={severity}:{body}");
 
    $messaging->topic('my_first_topic')->subscription()
        ->setEndpointType('http')
        ->setEndpoint($twilio)
        ->create();

Publicando mensagens em um tópico

Agora que temos nosso tópico e assinaturas estabelecidos, podemos, finalmente, publicar mensagens. Publicar mensagens em um tópico é praticamente idêntico a usar uma fila.

Digamos que nosso aplicativo depende muito de uma conexão ativa com nosso banco de dados. Quando essa conectividade falha, podemos simplesmente postar uma mensagem de log "crítica" em nosso tópico. Isso, é claro, enviaria um e-mail e uma mensagem de texto para nossa equipe de operações de prontidão e faria dump da mensagem de log em uma fila para consideração posterior.

$my_first_topic->message()
    ->addField('severity', 'Critical')
    ->setBody('Database connectivity has failed!')
    ->create();

Conclusão

O poder de tópicos, assinaturas e substituição de variável fica muito a cargo de sua imaginação. A maioria dos serviços está disponível por terminais HTTP e APIs acessíveis para a Fila de mensagens da SoftLayer, é simplesmente uma questão de combiná-los de uma maneira que atenda as necessidades de seus negócios. Observe também, que a Fila de mensagens não faz nenhuma suposição sobre o que você está tentando realizar. Ao construir objetos de terminais, certifique-se de que você especifique o tipo de conteúdo correto e os campos necessários para consumir com sucesso a API ou o serviço de destino.