Desde sgcWebSockets 2024.2.0 AMQP 1.0.0 es compatible.
AMQP (Advanced Message Queuing Protocol) 1.0.0 es un protocolo de mensajería diseñado para comunicación fiable y asíncrona entre sistemas distribuidos. Facilita el intercambio de mensajes entre aplicaciones o componentes de forma desacoplada, permitiéndoles comunicarse sin dependencias directas.
En conjunto, AMQP 1.0.0 ofrece una forma estandarizada e interoperable para que distintos componentes y sistemas software se comuniquen de manera débilmente acoplada, lo que lo hace adecuado para diversas aplicaciones distribuidas y de nivel empresarial.
Características de AMQP
- Comunicación orientada a mensajes: AMQP 1.0.0 se centra en el concepto de mensajes. Los mensajes pueden transportar datos, instrucciones o comandos y son las unidades fundamentales de comunicación.
- Message Brokers: El protocolo opera con un modelo de mensajería con broker. Los brokers, que pueden ser servidores o entidades intermediarias, gestionan el enrutamiento y la entrega de mensajes entre productores y consumidores.
- Colas y Exchanges: Las colas son entidades de almacenamiento dentro del broker donde los mensajes se guardan temporalmente. Los exchanges definen las reglas para enrutar mensajes desde los productores hacia las colas según criterios como el contenido del mensaje o las routing keys.
- Addresses y Links: Las addresses identifican destinos de mensajes dentro de la infraestructura de mensajería. Los links son canales de comunicación entre un emisor (productor) y un receptor (consumidor) asociados a una address concreta.
- Sesiones y Conexiones: Las sesiones representan un canal lógico para la comunicación, permitiendo múltiples flujos de mensajes dentro de una única conexión. Las conexiones gestionan el enlace global entre las aplicaciones cliente y el broker.
- Seguridad: AMQP 1.0.0 soporta varios mecanismos de seguridad, incluyendo autenticación y autorización, para asegurar la comunicación entre clientes y brokers.
- Agnóstico de transporte: El protocolo está diseñado para ser agnóstico de transporte, lo que significa que puede operar sobre distintos transportes de red como TCP, TLS o WebSockets, ofreciendo flexibilidad de despliegue.
- Control de flujo: AMQP 1.0.0 incluye mecanismos de control de flujo, permitiendo a los consumidores indicar su capacidad de manejar mensajes entrantes a un determinado ritmo. Esto evita sobrecargarlos con un gran volumen de mensajes.
- Gestión de errores: El protocolo especifica mecanismos para gestionar errores, incluyendo acknowledgement y rechazo de mensajes, garantizando robustez y fiabilidad en la entrega.
- Autenticación SASL: Se usa Simple Authentication and Security Layer (SASL) para autenticar y asegurar las conexiones entre clientes y brokers.
Configuración
El cliente AMQP 1.0.0 tiene la propiedad AMQPOptions donde puedes configurar la conexión.
- ChannelMax: El valor channel-max es el número de canal más alto que puede usarse en la conexión. Este
valor más uno es el número máximo de sesiones que pueden estar activas simultáneamente en la
conexión. - ContainerId: (opcional) es el nombre del contenedor de origen, identifica de forma única la conexión en el servidor.
- CreditSize: tamaño por defecto del credit flow.
- IdleTimeout: El timeout lo activa un peer local cuando no se reciben frames
tras superarse un valor umbral. El idle timeout se mide en milisegundos y comienza desde
el momento en que se recibe el último frame. - MaxFrameSize: el tamaño máximo de frame aceptado.
- MaxLinksPerSession: el número máximo de links por sesión.
- WindowSize: el tamaño de ventana por defecto.
La autenticación AMQP debe configurarse en la propiedad Authentication.
- AuthType: tipo de autenticación
- amqp1authNone: no configurada.
- amqp1authSASLAnonymous: autenticación anónima
- amqp1authSASLPlain: autenticación usuario/contraseña. Este tipo de autenticación requiere rellenar las siguientes propiedades:
- Username
- Password
- amqp1authSASLExternal: autenticación externa
Conexión
La conexión comienza con el cliente (normalmente una aplicación o servicio de mensajería) iniciando una conexión TCP con el servidor (el message broker). El cliente se conecta al puerto del servidor, normalmente 5672 para conexiones sin TLS y 5671 para conexiones aseguradas con TLS. Una vez establecida la conexión TCP, cliente y servidor negocian la versión de protocolo AMQP que usarán. AMQP 1.0.0 admite varias versiones, y durante la negociación ambas partes acuerdan usar la versión 1.0.0.
Tras la negociación del protocolo, el cliente puede necesitar autenticarse en el servidor, dependiendo de su configuración. Los mecanismos de autenticación pueden incluir mecanismos SASL (Simple Authentication and Security Layer) como PLAIN, EXTERNAL u otros soportados por el servidor.
Ejemplo: conectar a un servidor AMQP escuchando en el puerto seguro 5671 y usando credenciales SASL
// Creating AMQP client oAMQP := TsgcWSPClient_AMQP1.Create(nil); // Setting AMQP authentication options oAMQP.AMQPOptions.Authentication.AuthType := amqp1authSASLPlain; oAMQP.AMQPOptions.Authentication.Username := 'sgc'; oAMQP.AMQPOptions.Authentication.Password := 'sgc'; // Creating WebSocket client oClient := TsgcWebSocketClient.Create(nil); // Setting WebSocket specifications oClient.Specifications.RFC6455 := False; // Setting WebSocket client properties oClient.Host := 'www.esegece.com'; oClient.Port := 5671; oClient.TLS := True; // Assigning WebSocket client to AMQP client oAMQP.Client := oClient; // Activating WebSocket client oClient.Active := True;
Sesiones
Una vez autenticado, el cliente abre una sesión AMQP. Una sesión es un contexto lógico para la comunicación entre cliente y servidor. Las sesiones se usan para agrupar operaciones de mensajería relacionadas. Usa el método CreateSession para crear una nueva sesión; el método permite establecer el nombre de la sesión o dejarlo vacío y el componente asignará uno automáticamente.
Si la sesión se ha creado correctamente, se disparará el evento OnAMQPSessionOpen con los detalles de la sesión.
AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session;
const aBegin: TsgcAMQP1FrameBegin);
begin
ShowMessage('#session-open: ' + aSession.Id);
end;
Links
Dentro de una sesión, el cliente crea links para comunicarse con entidades específicas como colas, topics u otros recursos proporcionados por el servidor. Los links son canales de comunicación bidireccionales usados para enviar y recibir mensajes.
El componente puede actuar como nodo emisor y receptor. Permite crear cualquier cantidad de links por sesión, hasta el límite establecido en la propiedad MaxLinksPerSession.
Sender Links
Para crear un nuevo sender link, usa el método CreateSenderLink y pasa el nombre de la sesión y opcionalmente el nombre del sender link. Si el link se crea correctamente, se dispara el evento OnAMQPLinkOpen.
AMQP1.CreateSenderLink('MySession', 'MySenderLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject;
const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
ShowMessage('#link-open: ' + aLink.Name);
end;
Receiver Links
Para crear un nuevo receiver link, usa el método CreateReceiverLink y pasa el nombre de la sesión y opcionalmente el nombre del receiver link. Si el link se crea correctamente, se dispara el evento OnAMQPLinkOpen.
AMQP1.CreateReceiverLink('MySession', 'MyReceiverLink');
procedure procedure TfrmClientAMQP1.AMQP1AMQPLinkOpen(Sender: TObject;
const aSession: TsgcAMQP1Session; const aLink: TsgcAMQP1Link; const aAttach: TsgcAMQP1FrameAttach);
begin
ShowMessage('#link-open: ' + aLink.Name);
end;
Enviar mensajes
Con la sesión establecida y los links creados, el cliente puede empezar a realizar operaciones de mensajes, como enviar mensajes a un destino. Usa el método SendMessage para enviar un mensaje a través de un sender link.
AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message');
Leer mensajes
Por defecto, los Receiver Links se crean en modo automático, lo que significa que cada vez que llega un nuevo mensaje, se entrega al cliente.
Si los Receiver Links se han creado en modo manual, usa el método síncrono GetMessage para obtener y esperar hasta que llegue un nuevo mensaje.
Tanto en modo automático como manual, cada vez que llega un nuevo mensaje se dispara el evento OnAMQPMessage.
procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end;
Documentación
Cliente AMQP1 para Delphi
Más información sobre el cliente AMQP 1.0.0 para Delphi / CBuilder https://www.esegece.com/help/sgcWebSockets/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htmDescargar demo
Descarga la demo del cliente AMQP 1.0.0 compilada para Windows usando la librería sgcWebSockets.
