AMQP 1.0.0 Delphi 클라이언트

· 컴포넌트

sgcWebSockets 2024.2.0부터 AMQP 1.0.0을 지원해요.

AMQP (Advanced Message Queuing Protocol) 1.0.0은 분산 시스템 간의 신뢰성 있고, 비동기적인 통신을 위해 설계된 메시징 프로토콜이에요. 애플리케이션이나 컴포넌트가 직접적인 의존성 없이 통신할 수 있도록 분리된 방식으로 메시지를 교환하게 해줘요. 

전반적으로 AMQP 1.0.0은 서로 다른 소프트웨어 컴포넌트와 시스템이 느슨하게 결합된 방식으로 통신할 수 있는 표준화되고 상호 운용 가능한 방법을 제공해요. 따라서 다양한 분산 및 엔터프라이즈급 애플리케이션에 적합해요. 

AMQP의 기능

설정

AMQP 1.0.0 클라이언트에는 연결을 설정할 수 있는 AMQPOptions 속성이 있어요.

AMQP 인증은 Authentication 속성에서 설정해야 해요.

연결

 연결은 클라이언트(보통 메시징 애플리케이션 또는 서비스)가 서버(메시지 브로커)에 TCP 연결을 시작하는 것으로 시작해요. 클라이언트는 서버의 포트에 연결하는데, 일반적으로 비TLS 연결은 5672, TLS 보안 연결은 5671을 사용해요. TCP 연결이 수립되면 클라이언트와 서버는 사용할 AMQP 프로토콜 버전을 협상해요. AMQP 1.0.0은 여러 버전을 지원하며, 협상 중에 양측은 1.0.0 버전을 사용하기로 합의해요.

프로토콜 협상 후 클라이언트는 서버 설정에 따라 자신을 서버에 인증해야 할 수 있어요. 인증 메커니즘에는 SASL(Simple Authentication and Security Layer) 메커니즘인 PLAIN, EXTERNAL 또는 서버가 지원하는 다른 메커니즘이 포함될 수 있어요.

예제: SASL 자격 증명을 사용해 보안 포트 5671에서 수신 대기 중인 AMQP 서버에 연결

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

세션

인증되면 클라이언트는 AMQP 세션을 열어요. 세션은 클라이언트와 서버 간의 통신을 위한 논리적 컨텍스트예요. 세션은 관련된 메시징 작업을 함께 그룹화하는 데 사용돼요. 새 세션을 만들려면 CreateSession 메서드를 사용하세요. 이 메서드는 세션 이름을 설정하거나 비워 두면 컴포넌트가 자동으로 할당하도록 해요.

세션이 성공적으로 생성되면 세션 세부 정보와 함께 OnAMQPSessionOpen 이벤트가 발생해요. 

AMQP1.CreateSession('MySession');
procedure AMQP1AMQPSessionOpen(Sender: TObject; const aSession: TsgcAMQP1Session; 
  const aBegin: TsgcAMQP1FrameBegin);
begin
  ShowMessage('#session-open: ' + aSession.Id);
end; 

링크

세션 내에서 클라이언트는 큐, 토픽 또는 서버가 제공하는 다른 리소스 같은 특정 엔티티와 통신하기 위해 링크를 만들어요. 링크는 메시지를 보내고 받는 데 사용되는 양방향 통신 채널이에요.

컴포넌트는 송신자 및 수신자 노드로 동작할 수 있어요. 각 세션마다 MaxLinksPerSession 속성에 설정된 한도까지 원하는 수의 링크를 만들 수 있어요. 

송신자 링크

새 송신자 링크를 만들려면 CreateSenderLink 메서드를 사용하고 세션 이름과 선택적으로 송신자 링크 이름을 전달하세요. 링크가 성공적으로 생성되면 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; 

수신자 링크

새 수신자 링크를 만들려면 CreateReceiverLink 메서드를 사용하고 세션 이름과 선택적으로 수신자 링크 이름을 전달하세요. 링크가 성공적으로 생성되면 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; 

메시지 보내기

세션이 수립되고 링크가 만들어지면 클라이언트는 목적지로 메시지를 보내는 등의 메시지 작업을 시작할 수 있어요. 송신자 링크를 사용해 메시지를 보내려면 SendMessage 메서드를 사용하세요. 

AMQP1.SendMessage('MySession', 'MySenderLink', 'My first AMQP Message'); 

메시지 읽기

기본적으로 수신자 링크는 자동 모드로 생성돼요. 즉, 새 메시지가 도착할 때마다 클라이언트에 전달돼요.

수신자 링크가 수동 모드로 생성되었다면, 동기 메서드인 GetMessage 를 사용해 새 메시지가 도착할 때까지 가져와서 기다리세요.

자동 모드와 수동 모드 모두에서 새 메시지가 도착할 때마다 OnAMQPMessage 이벤트가 발생해요. 

procedure OnAMQPMessageEvent(Sender: TObject; const aSession:
    TsgcAMQP1Session; const aLink: TsgcAMQP1ReceiverLink; const aMessage:
    TsgcAMQP1Message; var DeliveryState: TsgcAMQP1MessageDeliveryState);
begin
  ShowMessage(aMessage.ApplicationData.AMQPValue.Value);
end; 

문서

AMQP1 Delphi Client

Delphi / CBuilder AMQP 1.0.0 클라이언트에 대해 자세히 알아보기 https://www.esegece.com/help/sgcWebSockets/ko/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htm

데모 다운로드

sgcWebSockets 라이브러리를 사용해 Windows용으로 컴파일된 AMQP 1.0.0 클라이언트 데모를 다운로드하세요.