sgcMQ 기능 매트릭스
7개 클라이언트 컴포넌트와 각 컴포넌트가 구현하는 사양을 기준으로 정리한 sgcMQ의 모든 기능입니다. 모든 기능이 Delphi와 C++ Builder에서 동일하게 동작하며, 모든 라이선스에 전체 소스 코드가 제공됩니다. 컴포넌트를 클릭하면 사용법과 예제가 담긴 전용 페이지로 이동합니다.
7개 클라이언트 컴포넌트와 각 컴포넌트가 구현하는 사양을 기준으로 정리한 sgcMQ의 모든 기능입니다. 모든 기능이 Delphi와 C++ Builder에서 동일하게 동작하며, 모든 라이선스에 전체 소스 코드가 제공됩니다. 컴포넌트를 클릭하면 사용법과 예제가 담긴 전용 페이지로 이동합니다.
sgcMQ는 자체 완결형 제품입니다. sgcWebSockets Core 런타임이 함께 포함되어 제공되므로 애드온이 아니며, 별도로 구매해야 할 기본 라이선스가 없습니다.
전송: 일반 TCP와 TLS. sgcMQ는 일반 TCP와 TLS로 연결합니다. MQTT over WebSocket이나 AMQP over WebSocket처럼 프로토콜을 WebSocket 위에서 실행해야 한다면 WebSocket 클라이언트를 제공하는 sgcWebSockets 패키지가 필요합니다.
아래 표의 모든 기능은 sgcMQ에 기본으로 포함된 원시 TCP 캐리어 TsgcTCPClient를 통해 사용합니다.
SGC MQ 팔레트 페이지에 등록되는 4개 프로토콜 계열입니다.
| 컴포넌트 | 클래스 | 계열 | 설명 |
|---|---|---|---|
| MQTT Client | TsgcWSPClient_MQTT | MQTT | MQTT 3.1.1 및 5.0 발행/구독: QoS 0/1/2, 보존 메시지, Last Will and Testament, 세션, MQTT 5 속성. |
| AMQP 0.9.1 Client | TsgcWSPClient_AMQP | AMQP | 채널, 익스체인지, 큐와 바인딩, 컨슈머, 확인 응답, prefetch QoS, 트랜잭션. |
| AMQP 1.0 Client | TsgcWSPClient_AMQP1 | AMQP | 세션, 송신 및 수신 링크, 크레딧 기반 흐름 제어, SASL 인증, Azure CBS 토큰 헬퍼. |
| Kafka Client | TsgcWSPClient_Kafka | Kafka | acks와 gzip을 지원하는 프로듀서, 리밸런스와 오프셋 커밋을 지원하는 컨슈머 그룹, 토픽 관리. |
| STOMP Client | TsgcWSPClient_STOMP | STOMP | STOMP 1.0/1.1/1.2 프레임: SEND, SUBSCRIBE, ACK, NACK, 수신 확인, 하트비트, 트랜잭션. |
| STOMP RabbitMQ Client | TsgcWSPClient_STOMP_RabbitMQ | STOMP | RabbitMQ에 맞춘 STOMP: 큐, 토픽, 익스체인지, 외부 큐, 임시 큐 헬퍼를 TCP 또는 TLS로 제공합니다. |
| STOMP ActiveMQ Client | TsgcWSPClient_STOMP_ActiveMQ | STOMP | Apache ActiveMQ에 맞춘 STOMP로, 큐와 토픽 헬퍼에 더해 ActiveMQ_Options 속성을 제공합니다. |
IoT의 발행/구독 프로토콜로, 서비스 품질 관련 동작을 감추지 않고 그대로 노출합니다.
| 기능 | 3.1.1 | 5.0 | 비고 |
|---|---|---|---|
| 프로토콜 버전 선택 | ✓ | ✓ | MQTTVersion에 mqtt311 또는 mqtt5를 지정합니다. |
| QoS 0, 1, 2 | ✓ | ✓ | QoS 2 교환 과정은 감춰지지 않고 OnMQTTPubRec, OnMQTTPubRel, OnMQTTPubComp로 노출됩니다. |
| 보존 메시지 | ✓ | ✓ | retain 플래그는 Publish의 네 번째 인자입니다. |
| Last Will and Testament | ✓ | ✓ | LastWillTestament가 토픽, 메시지, QoS, retain을 담습니다. |
| 와일드카드 구독 | ✓ | ✓ | 한 단계는 +, 그 아래 전체 트리는 #. |
| 세션 | ✓ | ✓ | OnMQTTConnect의 Session 인자가 브로커의 세션 재개 여부를 알려 줍니다. |
| 발행 후 대기 | ✓ | ✓ | PublishAndWait는 브로커가 패킷을 확인할 때까지 블로킹합니다. |
| 스트림 발행 | ✓ | ✓ | Publish에는 바이너리 페이로드를 위한 TStream 오버로드가 있습니다. |
| 이유 코드와 이름 | — | ✓ | MQTT 5는 CONNACK와 DISCONNECT에서 숫자 이유 코드와 그 이름을 반환합니다. |
| CONNECT 속성 | — | ✓ | ConnectProperties로 세션 만료, 수신 최대치, 최대 패킷 크기, 토픽 별칭 최대치를 설정합니다. |
| 토픽 별칭 | — | ✓ | 긴 토픽 이름 대신 짧은 정수가 전송되며, 수신 패킷에서는 자동으로 해석됩니다. |
| 사용자 속성 | — | ✓ | 임의의 키/값 쌍이 CONNECT, PUBLISH, SUBSCRIBE, DISCONNECT와 함께 전달됩니다. |
| 공유 구독 | — | ✓ | $share/<group>/<topic>을 구독하면 여러 클라이언트에 전달이 분산됩니다. |
| 확장 인증 | — | ✓ | 챌린지/응답 방식을 위해 Auth와 OnMQTTAuth로 AUTH 패킷을 주고받습니다. |
| Keep-alive | ✓ | ✓ | HeartBeat가 PINGREQ를 보내고, 응답 시 OnMQTTPing이 발생합니다. |
이름만 같을 뿐 서로 다른 두 프로토콜이므로, sgcMQ는 하나의 API로 둘을 억지로 묶지 않고 각각 별도의 컴포넌트를 제공합니다.
| 기능 | AMQP 0.9.1 | AMQP 1.0 | 비고 |
|---|---|---|---|
| 컴포넌트 | TsgcWSPClient_AMQP | TsgcWSPClient_AMQP1 | 와이어 형식도, 객체 모델도, 컴포넌트도 다릅니다. |
| 다중화 단위 | 채널 | 세션 | OpenChannel과 CreateSession. |
| 토폴로지 선언 | DeclareExchange, DeclareQueue, BindQueue | — | AMQP 1.0은 노드를 선언하지 않고 브로커의 노드를 주소로 지정합니다. |
| 송신 | PublishMessage(channel, exchange, routingKey, body) | SendMessage(session, link, text) | 0.9.1은 라우팅 키, 1.0은 대상 주소를 사용합니다. |
| 수신 | Consume 후 OnAMQPBasicDeliver | CreateReceiverLink 후 OnAMQPMessage | 연결이 확립되면 둘 다 푸시 방식입니다. |
| 확인 응답 | AckMessage / RejectMessage | OnAMQPMessageSentAck | 0.9.1은 delivery tag를 확인하고, 1.0은 delivery를 정산합니다. |
| 흐름 제어 | SetQoS prefetch, EnableChannel / DisableChannel | 크레딧 기반(CreditSize, WindowSize) | 빠른 생산자가 느린 소비자를 압도하지 않도록 막아 줍니다. |
| 트랜잭션 | SelectTransaction, CommitTransaction, RollbackTransaction | — | 0.9.1의 tx 클래스를 채널 단위로 노출합니다. |
| 큐 관리 | PurgeQueue, DeleteQueue, DeleteExchange, UnBindQueue | CloseLink, CloseSession | 각각 브로커 응답을 기다리는 블로킹 ...Ex 변형이 있습니다. |
| 재전송 | Recover / RecoverAsync | — | 확인되지 않은 메시지를 다시 전달하도록 브로커에 요청합니다. |
| 인증 | OnAMQPAuthentication, OnAMQPChallenge | Authentication.AuthType, OnAMQPSASLAuthentication | 1.0은 SASL ANONYMOUS, PLAIN, EXTERNAL을 제공합니다. |
| 클라우드 헬퍼 | — | CreateCBSLink, PutCBSToken, CreateAzureCbsSasToken, CreateAzureCbsJWT | Azure Service Bus와 Event Hubs를 위한 Claims-Based Security. |
| 연결 유지 확인 | HeartBeat | Ping, AMQPOptions.IdleTimeout | 연결 시 브로커와 협상됩니다. |
| 연결 튜닝 | AMQPOptions.VirtualHost, MaxChannels, MaxFrameSize, Locale | AMQPOptions.ContainerId, ChannelMax, MaxFrameSize, MaxLinksPerSession | 연결 시작 핸드셰이크에서 전송되어 브로커와 협상됩니다. |
| Prefetch | SetQoS(channel, prefetchSize, prefetchCount, global) | AMQPOptions.CreditSize | 브로커가 확인되지 않은 메시지를 몇 개까지 전달해 둘 수 있는지 정합니다. |
| 프레임 검사 | — | OnAMQPBeforeReadFrame, OnAMQPBeforeWriteFrame | 처리되거나 전송되기 전의 원시 프레임을 확인하거나 수정할 수 있습니다. |
바이너리 Kafka 프로토콜을 Object Pascal로 구현했으며, 앞단의 REST 프록시도 아래의 librdkafka도 필요하지 않습니다.
| 기능 | API | 비고 |
|---|---|---|
| 레코드 생산 | Produce(topic, value, key, partition) | 키와 파티션은 선택 사항입니다. ProduceBytes는 둘 다 TBytes로 받습니다. |
| 배치 생산 | ProduceMessages(topic, partition, messages) | 배치 전체에 대한 브로커의 produce 응답을 반환합니다. |
| 전달 보장 | KafkaOptions.Producer.Acks | kafkaAcksNone, kafkaAcksLeader, kafkaAcksAll. |
| 압축 | KafkaOptions.Producer.Compression | kafkaCompressionNone 또는 kafkaCompressionGzip. |
| 소비 | Subscribe([topics]) 후 Poll(timeoutMs) | Poll은 TsgcKafkaMessages 목록을 반환하며, 레코드마다 OnKafkaMessage도 발생시킵니다. |
| 컨슈머 그룹 | KafkaOptions.Consumer.GroupId | 코디네이터 검색, 조인, 동기화, 하트비트가 자동으로 처리됩니다. OnKafkaRebalance가 할당 변경을 알려 줍니다. |
| 오프셋 정책 | KafkaOptions.Consumer.OffsetReset | 커밋된 오프셋이 없을 때 kafkaOffsetEarliest 또는 kafkaOffsetLatest를 사용합니다. |
| 오프셋 커밋 | CommitSync, CommitOffset(topic, partition, offset) | 또는 Consumer.AutoCommit과 AutoCommitIntervalMs를 설정합니다. |
| 파티션 직접 읽기 | FetchMessages(topic, partition, offset, maxBytes) | 컨슈머 그룹을 완전히 우회합니다. |
| 오프셋 조회 | GetEarliestOffset, GetLatestOffset, GetCommittedOffset | 토픽과 파티션 단위로 조회합니다. |
| Fetch 튜닝 | Consumer.MinBytes, MaxBytes, MaxPartitionBytes, MaxWaitMs | 지연 시간과 배치 크기를 조절합니다. |
| 토픽 관리 | CreateTopic, DeleteTopic, GetMetadata | 생성 시 파티션 수와 복제 계수를 지정합니다. |
| 그룹 관리 | ListGroups, DescribeGroups | 자체 도구에서 컨슈머 그룹을 조회할 수 있습니다. |
| 브로커 기능 확인 | GetApiVersions | 브로커가 지원하는 프로토콜 API 버전을 조회합니다. |
| SASL | kafkaSaslNone, kafkaSaslPlain | SASL/PLAIN 사용자 이름과 비밀번호 인증. |
범용 클라이언트 하나와, RabbitMQ 및 ActiveMQ의 목적지 규칙을 이름 있는 메서드로 바꿔 주는 브로커 전용 파생 컴포넌트 2종입니다.
| 기능 | STOMP | RabbitMQ | ActiveMQ | 비고 |
|---|---|---|---|---|
| 프레임 전송 | Send | PublishEx | PublishEx | 목적지, 본문, 콘텐츠 형식과 선택적 트랜잭션. |
| 구독 | Subscribe(id, destination) | SubscribeEx | SubscribeEx | 파생 컴포넌트는 durable, exclusive, ack 모드 인자를 추가로 제공합니다. |
| 큐 헬퍼 | — | SubscribeQueue, PublishQueue, UnSubscribeQueue | SubscribeQueue, PublishQueue, UnSubscribeQueue | /queue/ 목적지 접두사를 감싼 것입니다. |
| 토픽 헬퍼 | — | SubscribeTopic, PublishTopic, UnSubscribeTopic | SubscribeTopic, PublishTopic, UnSubscribeTopic | /topic/ 목적지 접두사를 감싼 것입니다. |
| 익스체인지 헬퍼 | — | SubscribeExchange, PublishExchange | — | 라우팅 패턴을 사용하는 RabbitMQ의 /exchange/ 목적지. |
| 외부 큐 | — | SubscribeQueueOutside, PublishQueueOutside | — | 다른 곳에서 선언된 큐를 위한 RabbitMQ의 /amq/queue/. |
| 임시 응답 큐 | — | SubscribeTemporaryQueue, PublishTemporaryQueue | — | RabbitMQ의 /temp-queue/ 요청/응답 패턴. |
| 확인 응답 | ACK / NACK | ✓ | ✓ | 구독마다 ack 모드를 선택합니다(ackAuto 등). |
| 트랜잭션 | BeginTransaction, CommitTransaction, AbortTransaction | ✓ | ✓ | 여러 SEND와 ACK 프레임을 하나의 원자적 단위로 묶습니다. |
| 수신 확인 | OnSTOMPReceipt | OnRabbitMQReceipt | OnActiveMQReceipt | 브로커가 처리한 프레임을 확인해 줍니다. |
| 메시지 이벤트 | OnSTOMPMessage | OnRabbitMQMessage | OnActiveMQMessage | 목적지, 본문, 프레임 헤더를 전달합니다. |
| 하트비트 | HeartBeat, Ping | ✓ | ✓ | CONNECT 프레임에서 양방향으로 협상됩니다. |
| 버전 협상 | Versions.V1_0, V1_1, V1_2 | ✓ | ✓ | 허용할 버전을 알리면 브로커가 하나를 선택합니다. |
| 가상 호스트 | Options.VirtualHost | ✓ | ✓ | CONNECT의 host 헤더로 전송됩니다. |
| 브로커 확장 | — | — | ActiveMQ_Options | ActiveMQ 전용 헤더를 published 속성으로 노출합니다. |
모든 프로토콜 컴포넌트는 Client 속성을 통해 TsgcTCPClient에 연결됩니다. 이 캐리어 하나로 프로토콜 코드를 바꾸지 않고 일반 TCP와 TLS를 모두 사용할 수 있습니다.
| 항목 | 내용 |
|---|---|
| 일반 TCP | TsgcTCPClient를 Client에 할당하면 프로토콜이 소켓 위에서 곧바로, 브로커의 기본 포트로 동작합니다. |
| WebSocket | sgcMQ에는 포함되지 않습니다. MQTT over WebSocket이나 Web-STOMP 같은 WebSocket 캐리어에는 sgcWebSockets에 포함된 WebSocket 클라이언트가 필요합니다. |
| TLS | 캐리어의 TLSOptions를 사용하며, TLSOptions.IOHandler로 크로스플랫폼 빌드에는 OpenSSL을, Windows에서는 SChannel을 선택합니다. |
| 클라이언트 인증서 | 동일한 TLSOptions를 통한 상호 TLS로, PEM 파일, PKCS#12 번들 또는 Windows 인증서 저장소를 사용합니다. |
| 프록시 | 캐리어가 HTTP CONNECT 프록시를 지원하므로 사내 프록시 뒤에 있는 브로커에도 접근할 수 있습니다. |
| 재연결 | 캐리어의 WatchDog이 연결이 끊긴 뒤 재연결하며, 간격과 시도 횟수를 설정할 수 있습니다. |
| IPv6 | 캐리어가 지원하므로 IPv6 브로커 주소에 별도 설정이 필요 없습니다. |
| 스레딩 | 읽기는 전용 스레드에서 실행됩니다. VCL 및 FMX 코드에서는 캐리어의 알림 설정으로 이벤트를 메인 스레드로 전달하세요. |
공개된 프로토콜을, 지원하는 모든 컴파일러에서 동일한 소스로 사용합니다.
| 항목 | 내용 |
|---|---|
| MQTT | OASIS MQTT 3.1.1 및 MQTT 5.0. |
| AMQP 0.9.1 | AMQP 0-9-1 사양: 채널, 익스체인지, 큐, 바인딩과 basic 클래스. |
| AMQP 1.0 | OASIS AMQP 1.0으로, ISO/IEC 19464로도 발행되었습니다. |
| Kafka | TCP 위의 Apache Kafka 와이어 프로토콜로, v2 레코드 배치 형식을 포함합니다. |
| STOMP | STOMP 1.0, 1.1, 1.2. |
| WebSocket | 포함되지 않습니다. WebSocket 캐리어에는 WebSocket 클라이언트를 제공하는 sgcWebSockets가 필요합니다. |
| TLS | OpenSSL을 통한 TLS 1.2 및 TLS 1.3, 또는 Windows SChannel. |
| 컴파일러 | Delphi 및 C++ Builder 7부터 13까지. |
| 플랫폼 | Win32, Win64, Linux64, macOS, iOS, Android. |
| 라이선스 | 단독 제품입니다. sgcWebSockets Core 런타임이 함께 포함되며 전체 소스 코드가 제공됩니다. |