Cliente AMQP Delphi | Componentes AMQP 1.0 & 0.9.1 | eSeGeCe

Cliente AMQP Delphi — Componentes AMQP 1.0 e 0.9.1

Dois componentes cliente AMQP nativos para Delphi e C++Builder: TsgcWSPClient_AMQP fala AMQP 0.9.1 com o RabbitMQ, com exchanges, filas, bindings e confirmações de consumo, e TsgcWSPClient_AMQP1 fala OASIS AMQP 1.0 com Azure Service Bus, Apache Qpid e qualquer broker compatível, sobre um transporte WebSocket ou TCP puro.

As duas versões do AMQP, uma biblioteca

AMQP 0.9.1 e AMQP 1.0 compartilham o nome, mas são protocolos de fio diferentes. O sgcWebSockets implementa cada um nativamente, então você escolhe o componente que combina com seu broker.

Um cliente AMQP Delphi conecta sua aplicação VCL ou FMX a brokers de mensageria corporativos. O AMQP 0.9.1 é a versão amplamente implantada usada pelo RabbitMQ: você declara exchanges e filas, faz o binding com routing keys, publica com basic.publish e consome com basic.consume, com transações e confirms por cima. O AMQP 1.0 é o padrão OASIS usado por Azure Service Bus e Apache Qpid: um protocolo simétrico de links construído sobre sessões, sender links e receiver links, com helpers de token Claims-Based-Security para a autenticação SAS e OAuth do Azure Service Bus.

Ambos os componentes se acoplam a um TsgcWebSocketClient pela propriedade Client e rodam sobre um transporte WebSocket ou TCP puro, então o mesmo código alcança um broker nas portas AMQP padrão ou tunela pela porta 443 através de infraestrutura só-HTTP.

AMQP 0.9.1

TsgcWSPClient_AMQP: exchanges, filas, bindings, transações

AMQP 1.0

TsgcWSPClient_AMQP1: sessões, sender e receiver links, tokens CBS

Transportes

Transporte WebSocket ou TCP puro, TLS opcional em ambos

Plataformas

Windows, macOS, Linux, iOS, Android. Do Delphi 7 ao Delphi 13

A superfície completa do cliente AMQP

Cada operação do protocolo é um método, cada notificação do broker é um evento.

Exchanges & filas (0.9.1)

DeclareExchange, DeclareQueue e BindQueue constroem a topologia de roteamento do RabbitMQ a partir do código: roteamento direct, fanout e topic com escopo por canal via OpenChannel.

Publicar & consumir (0.9.1)

PublishMessage envia para uma exchange com uma routing key; Consume assina uma fila e as entregas chegam pelo evento OnAMQPBasicDeliver.

CreateSession abre uma sessão AMQP 1.0, depois CreateSenderLink e CreateReceiverLink se anexam a um endereço de nó. As transferências entrantes chegam por OnAMQPMessage.

Azure Service Bus (1.0)

Helpers de Claims-Based-Security encapsulam o fluxo de tokens SAS / OAuth do Azure Service Bus, então autenticar contra um namespace vira configuração de propriedades em vez de uma troca CBS construída à mão.

Feedback de entrega

OnAMQPMessageSent e OnAMQPMessageSentAck informam quando uma transferência saiu do cliente e quando o broker a deu como settled.

Autenticação SASL

Os desafios de autenticação aparecem pelos eventos OnAMQPSASLAuthentication (1.0) e OnAMQPAuthentication / OnAMQPChallenge (0.9.1).

HeartBeat

O cliente 0.9.1 publica uma propriedade HeartBeat para que conexões ociosas fiquem vivas através de proxies e timeouts do broker.

Eventos de ciclo de vida

OnAMQPConnect, OnAMQPDisconnect, OnAMQPClose e OnAMQPException mantêm a aplicação informada do estado do protocolo.

Edição

Os dois clientes AMQP estão incluídos em todas as edições do sgcWebSockets, da Standard à Enterprise e All-Access, e na biblioteca .NET.

Publique e consuma em poucas linhas

Emparelhe o componente AMQP com um TsgcWebSocketClient, conecte, depois declare / anexe e pronto.

uses
  sgcWebSocket, sgcWebSocket_Protocol_AMQP_Client, sgcAMQP_Classes;

var
  WSClient: TsgcWebSocketClient;
  AMQP: TsgcWSPClient_AMQP;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'broker.example.com';
  WSClient.Port := 15674;
  WSClient.Options.Parameters := '/ws';

  AMQP := TsgcWSPClient_AMQP.Create(nil);
  AMQP.Client := WSClient;

  AMQP.OnAMQPConnect      := AMQPConnect;
  AMQP.OnAMQPBasicDeliver := AMQPBasicDeliver;

  WSClient.Active := True;
end;

procedure TForm1.AMQPConnect(Sender: TObject);
begin
  AMQP.OpenChannel('ch1');
  AMQP.DeclareExchange('ch1', 'orders', 'direct');
  AMQP.DeclareQueue('ch1', 'orders_in');
  AMQP.BindQueue('ch1', 'orders_in', 'orders', 'create');
  AMQP.Consume('ch1', 'orders_in');

  // Publish a message
  AMQP.PublishMessage('ch1', 'orders', 'create', '{"id":42}');
end;
uses
  sgcWebSocket, sgcWebSocket_Protocol_AMQP1_Client, sgcAMQP1_Classes;

var
  WSClient: TsgcWebSocketClient;
  AMQP1: TsgcWSPClient_AMQP1;
  oSession: TsgcAMQP1Session;
  oSender:  TsgcAMQP1SenderLink;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'broker.example.com';
  WSClient.Port := 5673;

  AMQP1 := TsgcWSPClient_AMQP1.Create(nil);
  AMQP1.Client := WSClient;

  AMQP1.OnAMQPConnect      := AMQPConnect;
  AMQP1.OnAMQPMessage      := AMQPMessage;
  AMQP1.OnAMQPSessionOpen  := AMQPSessionOpen;
  AMQP1.OnAMQPLinkOpen     := AMQPLinkOpen;

  WSClient.Active := True;

  oSession := AMQP1.CreateSession;
  oSender  := AMQP1.CreateSenderLink(oSession, '/queue/orders');
  // Receivers handle pushed deliveries through OnAMQPMessage
  AMQP1.CreateReceiverLink(oSession, '/queue/orders');
end;
#include "sgcWebSocket.hpp"
#include "sgcWebSocket_Protocol_AMQP_Client.hpp"

TsgcWebSocketClient* WSClient = new TsgcWebSocketClient(NULL);
WSClient->Host = "broker.example.com";
WSClient->Port = 15674;
WSClient->Options->Parameters = "/ws";

TsgcWSPClient_AMQP* AMQP = new TsgcWSPClient_AMQP(NULL);
AMQP->Client = WSClient;
AMQP->OnAMQPConnect = AMQPConnect;
AMQP->OnAMQPBasicDeliver = AMQPBasicDeliver;

WSClient->Active = true;

// In the OnAMQPConnect handler:
AMQP->OpenChannel("ch1");
AMQP->DeclareExchange("ch1", "orders", "direct");
AMQP->DeclareQueue("ch1", "orders_in");
AMQP->BindQueue("ch1", "orders_in", "orders", "create");
AMQP->Consume("ch1", "orders_in");
AMQP->PublishMessage("ch1", "orders", "create", "{\"id\":42}");

AMQP 0.9.1 ou AMQP 1.0

Escolha pelo broker, não pelo número da versão. Se o outro lado é o RabbitMQ, use o componente AMQP 0.9.1: ele mapeia um-para-um o modelo do RabbitMQ de exchanges, filas e bindings. Se o outro lado é Azure Service Bus, Apache Qpid ou outro broker que anuncia o padrão OASIS, use o componente AMQP 1.0 e seu modelo de sessões / links.

Os dois vêm no mesmo pacote, então ambientes mistos funcionam bem: uma aplicação pode manter uma conexão 0.9.1 com o RabbitMQ e uma conexão 1.0 com o Azure Service Bus lado a lado, cada uma no seu próprio transporte TsgcWebSocketClient.

Mais sobre AMQP no sgcWebSockets

Página do protocolo AMQP 0.9.1

Referência completa do TsgcWSPClient_AMQP: propriedades, métodos, eventos e o projeto demo.

Página do protocolo AMQP 1.0

Referência completa do TsgcWSPClient_AMQP1: sessões, links e autenticação CBS.

Picker de tempo real

Quando escolher AMQP em vez de MQTT, WebSocket, SSE ou HTTP/2 push.

Blog: Exchanges e filas

O modelo de roteamento do AMQP 0.9.1 explicado com código Delphi.

Blog: Publicando mensagens

Padrões de publicação e opções de entrega a partir do cliente Delphi.

Blog: Auth CBS no Azure Service Bus

Tokens Claims-Based-Security contra o Azure Service Bus sobre AMQP 1.0.

Best value: All-AccessEvery eSeGeCe product, Premium Support included, from €1,059/year.
See All-Access pricing

Conecte ao seu broker hoje

Baixe o trial. Os projetos demo de AMQP 0.9.1 e AMQP 1.0 compilam prontos para uso.