Cliente AMQP Delphi | Componentes AMQP 1.0 y 0.9.1 | eSeGeCe

Cliente AMQP para Delphi — Componentes AMQP 1.0 y 0.9.1

Dos componentes cliente AMQP nativos para Delphi y C++Builder: TsgcWSPClient_AMQP habla AMQP 0.9.1 con RabbitMQ mediante exchanges, colas, bindings y confirmaciones de consumidor, y TsgcWSPClient_AMQP1 habla OASIS AMQP 1.0 con Azure Service Bus, Apache Qpid y cualquier broker conforme, sobre un transporte WebSocket o TCP puro.

Las dos versiones de AMQP, una sola biblioteca

AMQP 0.9.1 y AMQP 1.0 comparten nombre, pero son protocolos distintos a nivel de wire. sgcWebSockets implementa cada uno de forma nativa, así que escoges el componente que encaja con tu broker.

Un cliente AMQP para Delphi conecta tu aplicación VCL o FMX con brokers de mensajería empresariales. AMQP 0.9.1 es la versión ampliamente desplegada que usa RabbitMQ: declaras exchanges y colas, las enlazas con routing keys, publicas con basic.publish y consumes con basic.consume, con transacciones y confirms por encima. AMQP 1.0 es el estándar OASIS que usan Azure Service Bus y Apache Qpid: un protocolo simétrico de enlaces construido sobre sesiones, sender links y receiver links, con helpers de tokens Claims-Based-Security para la autenticación SAS y OAuth de Azure Service Bus.

Ambos componentes se acoplan a un TsgcWebSocketClient a través de su propiedad Client y funcionan sobre un transporte WebSocket o TCP puro, de modo que el mismo código llega a un broker por los puertos AMQP estándar o se tuneliza por el puerto 443 a través de infraestructuras sólo-HTTP.

AMQP 0.9.1

TsgcWSPClient_AMQP: exchanges, colas, bindings, transacciones

AMQP 1.0

TsgcWSPClient_AMQP1: sesiones, sender y receiver links, tokens CBS

Transportes

Transporte WebSocket o TCP puro, TLS opcional en ambos

Plataformas

Windows, macOS, Linux, iOS, Android. De Delphi 7 a Delphi 13

Toda la superficie del cliente AMQP

Cada operación del protocolo es un método y cada notificación del broker, un evento.

Exchanges y colas (0.9.1)

DeclareExchange, DeclareQueue y BindQueue construyen la topología de enrutado de RabbitMQ desde código: enrutado direct, fanout y topic con ámbito por canal vía OpenChannel.

Publicar y consumir (0.9.1)

PublishMessage envía a un exchange con una routing key; Consume suscribe una cola y las entregas llegan a través de OnAMQPBasicDeliver.

CreateSession abre una sesión AMQP 1.0; después CreateSenderLink y CreateReceiverLink se adjuntan a una dirección de nodo. Las transferencias entrantes llegan por OnAMQPMessage.

Azure Service Bus (1.0)

Los helpers Claims-Based-Security envuelven el flujo de tokens SAS / OAuth de Azure Service Bus, así que autenticarse contra un namespace es configurar propiedades en lugar de montar a mano el intercambio CBS.

Confirmación de entrega

OnAMQPMessageSent y OnAMQPMessageSentAck informan de cuándo una transferencia salió del cliente y cuándo el broker la dio por asentada.

Autenticación SASL

Los retos de autenticación afloran a través de OnAMQPSASLAuthentication (1.0) y OnAMQPAuthentication / OnAMQPChallenge (0.9.1).

HeartBeat

El cliente 0.9.1 publica una propiedad HeartBeat para que las conexiones inactivas sigan vivas a través de proxies y timeouts del broker.

Eventos de ciclo de vida

OnAMQPConnect, OnAMQPDisconnect, OnAMQPClose y OnAMQPException mantienen a la aplicación informada del estado del protocolo.

Edición

Ambos clientes AMQP se incluyen en todas las ediciones de sgcWebSockets, desde Standard hasta Enterprise y All-Access, y en la biblioteca .NET.

Publica y consume en unas pocas líneas

Empareja el componente AMQP con un TsgcWebSocketClient, conecta y después declara / adjunta y listo.

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 o AMQP 1.0

Elige según el broker, no según el número de versión. Si el otro extremo es RabbitMQ, usa el componente AMQP 0.9.1: mapea uno a uno con el modelo RabbitMQ de exchanges, colas y bindings. Si el otro extremo es Azure Service Bus, Apache Qpid u otro broker que anuncia el estándar OASIS, usa el componente AMQP 1.0 y su modelo de sesiones / links.

Ambos vienen en el mismo paquete, así que los entornos mixtos no son problema: una aplicación puede mantener a la vez una conexión 0.9.1 con RabbitMQ y una conexión 1.0 con Azure Service Bus, cada una sobre su propio transporte TsgcWebSocketClient.

Más sobre AMQP en sgcWebSockets

Página del protocolo AMQP 0.9.1

Referencia completa de TsgcWSPClient_AMQP: propiedades, métodos, eventos y el proyecto demo.

Página del protocolo AMQP 1.0

Referencia completa de TsgcWSPClient_AMQP1: sesiones, links y autenticación CBS.

Selector en tiempo real

Cuándo elegir AMQP frente a MQTT, WebSocket, SSE o HTTP/2 push.

Blog: Exchanges y colas

El modelo de enrutado de AMQP 0.9.1 explicado con código Delphi.

Blog: Publicar mensajes

Patrones de publicación y opciones de entrega desde el cliente Delphi.

Blog: Autenticación CBS en Azure Service Bus

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

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

Conecta con tu broker hoy mismo

Descarga la versión de prueba. Los proyectos demo de AMQP 0.9.1 y AMQP 1.0 compilan sin tocar nada.