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은 메시지 개념을 중심으로 설계되어 있어요. 메시지는 데이터, 명령, 지시 사항을 담을 수 있으며 통신의 기본 단위예요.
- 메시지 브로커: 이 프로토콜은 브로커 기반 메시징 모델로 동작해요. 서버나 중개 엔티티가 될 수 있는 브로커가 프로듀서와 컨슈머 사이의 메시지 라우팅과 전달을 관리해요.
- 큐와 익스체인지: 큐는 브로커 내부의 저장소로, 메시지가 일시적으로 보관되는 곳이에요. 익스체인지는 메시지 내용이나 라우팅 키 같은 기준에 따라 프로듀서로부터 큐로 메시지를 전달하는 규칙을 정의해요.
- 주소와 링크: 주소는 메시징 인프라 내에서 메시지의 목적지를 식별해요. 링크는 특정 주소와 연결된 송신자(프로듀서)와 수신자(컨슈머) 사이의 통신 채널이에요.
- 세션과 연결: 세션은 통신의 논리적 채널을 나타내며 하나의 연결 내에서 여러 메시지 스트림을 사용할 수 있게 해줘요. 연결은 클라이언트 애플리케이션과 메시지 브로커 사이의 전체 통신 링크를 관리해요.
- 보안: AMQP 1.0.0은 클라이언트와 브로커 간의 안전한 통신을 보장하기 위해 인증과 권한 부여를 포함한 다양한 보안 메커니즘을 지원해요.
- 전송 계층 독립성: 이 프로토콜은 전송 계층에 독립적으로 설계되어 TCP, TLS, WebSocket 같은 다양한 네트워크 전송 위에서 동작할 수 있어 배포 시 유연성을 제공해요.
- 흐름 제어: AMQP 1.0.0은 컨슈머가 주어진 속도로 들어오는 메시지를 처리할 수 있는 능력을 표시할 수 있도록 흐름 제어 메커니즘을 포함해요. 이를 통해 많은 메시지로 컨슈머가 과부하되는 것을 방지해요.
- 오류 처리: 메시지 확인 및 거부를 포함한 오류 처리 메커니즘을 명시하여 메시지 전달의 안정성과 신뢰성을 보장해요.
- SASL 인증: 클라이언트와 브로커 사이의 연결을 인증하고 보호하기 위해 Simple Authentication and Security Layer(SASL)를 사용해요.
설정
AMQP 1.0.0 클라이언트에는 연결을 설정할 수 있는 AMQPOptions 속성이 있어요.
- ChannelMax: channel-max 값은 연결에서 사용할 수 있는 가장 높은 채널 번호예요. 이 값에 1을 더한 값이 연결에서 동시에 활성화될 수 있는 세션의 최대 개수예요.
- ContainerId: (선택) 소스 컨테이너의 이름으로, 서버에서 연결을 고유하게 식별해요.
- CreditSize: 크레딧 흐름의 기본 크기예요.
- IdleTimeout: 임계값을 초과하는 시간 동안 프레임이 수신되지 않을 때 로컬 피어에서 발생하는 타임아웃이에요. 유휴 타임아웃은 밀리초 단위이며 마지막 프레임을 받은 시점부터 시작해요.
- MaxFrameSize: 허용되는 최대 프레임 크기예요.
- MaxLinksPerSession: 세션당 최대 링크 수예요.
- WindowSize: 기본 윈도우 크기예요.
AMQP 인증은 Authentication 속성에서 설정해야 해요.
- AuthType: 인증 유형
- amqp1authNone: 설정되지 않음.
- amqp1authSASLAnonymous: 익명 인증
- amqp1authSASLPlain: 사용자/비밀번호 인증. 이 인증 유형은 다음 속성을 채워야 해요:
- Username
- Password
- amqp1authSASLExternal: 외부 인증
연결
연결은 클라이언트(보통 메시징 애플리케이션 또는 서비스)가 서버(메시지 브로커)에 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 클라이언트 데모를 다운로드하세요.
