sgcMQ 기능 매트릭스: MQTT, AMQP, Kafka, STOMP | eSeGeCe

sgcMQ 기능 매트릭스

7개 클라이언트 컴포넌트와 각 컴포넌트가 구현하는 사양을 기준으로 정리한 sgcMQ의 모든 기능입니다. 모든 기능이 Delphi와 C++ Builder에서 동일하게 동작하며, 모든 라이선스에 전체 소스 코드가 제공됩니다. 컴포넌트를 클릭하면 사용법과 예제가 담긴 전용 페이지로 이동합니다.

MQTT

3.1.1과 5.0

AMQP

0.9.1과 1.0

Kafka

네이티브 와이어 프로토콜

STOMP

1.0 / 1.1 / 1.2

전송 & TLS

일반 TCP와 TLS

표준 & 플랫폼

Delphi 7부터 13까지, C++ Builder

sgcMQ는 자체 완결형 제품입니다. sgcWebSockets Core 런타임이 함께 포함되어 제공되므로 애드온이 아니며, 별도로 구매해야 할 기본 라이선스가 없습니다.

전송: 일반 TCP와 TLS. sgcMQ는 일반 TCP와 TLS로 연결합니다. MQTT over WebSocket이나 AMQP over WebSocket처럼 프로토콜을 WebSocket 위에서 실행해야 한다면 WebSocket 클라이언트를 제공하는 sgcWebSockets 패키지가 필요합니다.

아래 표의 모든 기능은 sgcMQ에 기본으로 포함된 원시 TCP 캐리어 TsgcTCPClient를 통해 사용합니다.

7개 팔레트 컴포넌트

SGC MQ 팔레트 페이지에 등록되는 4개 프로토콜 계열입니다.

컴포넌트클래스계열설명
MQTT ClientTsgcWSPClient_MQTTMQTTMQTT 3.1.1 및 5.0 발행/구독: QoS 0/1/2, 보존 메시지, Last Will and Testament, 세션, MQTT 5 속성.
AMQP 0.9.1 ClientTsgcWSPClient_AMQPAMQP채널, 익스체인지, 큐와 바인딩, 컨슈머, 확인 응답, prefetch QoS, 트랜잭션.
AMQP 1.0 ClientTsgcWSPClient_AMQP1AMQP세션, 송신 및 수신 링크, 크레딧 기반 흐름 제어, SASL 인증, Azure CBS 토큰 헬퍼.
Kafka ClientTsgcWSPClient_KafkaKafkaacks와 gzip을 지원하는 프로듀서, 리밸런스와 오프셋 커밋을 지원하는 컨슈머 그룹, 토픽 관리.
STOMP ClientTsgcWSPClient_STOMPSTOMPSTOMP 1.0/1.1/1.2 프레임: SEND, SUBSCRIBE, ACK, NACK, 수신 확인, 하트비트, 트랜잭션.
STOMP RabbitMQ ClientTsgcWSPClient_STOMP_RabbitMQSTOMPRabbitMQ에 맞춘 STOMP: 큐, 토픽, 익스체인지, 외부 큐, 임시 큐 헬퍼를 TCP 또는 TLS로 제공합니다.
STOMP ActiveMQ ClientTsgcWSPClient_STOMP_ActiveMQSTOMPApache ActiveMQ에 맞춘 STOMP로, 큐와 토픽 헬퍼에 더해 ActiveMQ_Options 속성을 제공합니다.

MQTT 3.1.1과 MQTT 5.0

IoT의 발행/구독 프로토콜로, 서비스 품질 관련 동작을 감추지 않고 그대로 노출합니다.

기능3.1.15.0비고
프로토콜 버전 선택MQTTVersionmqtt311 또는 mqtt5를 지정합니다.
QoS 0, 1, 2QoS 2 교환 과정은 감춰지지 않고 OnMQTTPubRec, OnMQTTPubRel, OnMQTTPubComp로 노출됩니다.
보존 메시지retain 플래그는 Publish의 네 번째 인자입니다.
Last Will and TestamentLastWillTestament가 토픽, 메시지, QoS, retain을 담습니다.
와일드카드 구독한 단계는 +, 그 아래 전체 트리는 #.
세션OnMQTTConnectSession 인자가 브로커의 세션 재개 여부를 알려 줍니다.
발행 후 대기PublishAndWait는 브로커가 패킷을 확인할 때까지 블로킹합니다.
스트림 발행Publish에는 바이너리 페이로드를 위한 TStream 오버로드가 있습니다.
이유 코드와 이름MQTT 5는 CONNACK와 DISCONNECT에서 숫자 이유 코드와 그 이름을 반환합니다.
CONNECT 속성ConnectProperties로 세션 만료, 수신 최대치, 최대 패킷 크기, 토픽 별칭 최대치를 설정합니다.
토픽 별칭긴 토픽 이름 대신 짧은 정수가 전송되며, 수신 패킷에서는 자동으로 해석됩니다.
사용자 속성임의의 키/값 쌍이 CONNECT, PUBLISH, SUBSCRIBE, DISCONNECT와 함께 전달됩니다.
공유 구독$share/<group>/<topic>을 구독하면 여러 클라이언트에 전달이 분산됩니다.
확장 인증챌린지/응답 방식을 위해 AuthOnMQTTAuth로 AUTH 패킷을 주고받습니다.
Keep-aliveHeartBeat가 PINGREQ를 보내고, 응답 시 OnMQTTPing이 발생합니다.

AMQP 0.9.1과 AMQP 1.0

이름만 같을 뿐 서로 다른 두 프로토콜이므로, sgcMQ는 하나의 API로 둘을 억지로 묶지 않고 각각 별도의 컴포넌트를 제공합니다.

기능AMQP 0.9.1AMQP 1.0비고
컴포넌트TsgcWSPClient_AMQPTsgcWSPClient_AMQP1와이어 형식도, 객체 모델도, 컴포넌트도 다릅니다.
다중화 단위채널세션OpenChannelCreateSession.
토폴로지 선언DeclareExchange, DeclareQueue, BindQueueAMQP 1.0은 노드를 선언하지 않고 브로커의 노드를 주소로 지정합니다.
송신PublishMessage(channel, exchange, routingKey, body)SendMessage(session, link, text)0.9.1은 라우팅 키, 1.0은 대상 주소를 사용합니다.
수신ConsumeOnAMQPBasicDeliverCreateReceiverLinkOnAMQPMessage연결이 확립되면 둘 다 푸시 방식입니다.
확인 응답AckMessage / RejectMessageOnAMQPMessageSentAck0.9.1은 delivery tag를 확인하고, 1.0은 delivery를 정산합니다.
흐름 제어SetQoS prefetch, EnableChannel / DisableChannel크레딧 기반(CreditSize, WindowSize)빠른 생산자가 느린 소비자를 압도하지 않도록 막아 줍니다.
트랜잭션SelectTransaction, CommitTransaction, RollbackTransaction0.9.1의 tx 클래스를 채널 단위로 노출합니다.
큐 관리PurgeQueue, DeleteQueue, DeleteExchange, UnBindQueueCloseLink, CloseSession각각 브로커 응답을 기다리는 블로킹 ...Ex 변형이 있습니다.
재전송Recover / RecoverAsync확인되지 않은 메시지를 다시 전달하도록 브로커에 요청합니다.
인증OnAMQPAuthentication, OnAMQPChallengeAuthentication.AuthType, OnAMQPSASLAuthentication1.0은 SASL ANONYMOUS, PLAIN, EXTERNAL을 제공합니다.
클라우드 헬퍼CreateCBSLink, PutCBSToken, CreateAzureCbsSasToken, CreateAzureCbsJWTAzure Service Bus와 Event Hubs를 위한 Claims-Based Security.
연결 유지 확인HeartBeatPing, AMQPOptions.IdleTimeout연결 시 브로커와 협상됩니다.
연결 튜닝AMQPOptions.VirtualHost, MaxChannels, MaxFrameSize, LocaleAMQPOptions.ContainerId, ChannelMax, MaxFrameSize, MaxLinksPerSession연결 시작 핸드셰이크에서 전송되어 브로커와 협상됩니다.
PrefetchSetQoS(channel, prefetchSize, prefetchCount, global)AMQPOptions.CreditSize브로커가 확인되지 않은 메시지를 몇 개까지 전달해 둘 수 있는지 정합니다.
프레임 검사OnAMQPBeforeReadFrame, OnAMQPBeforeWriteFrame처리되거나 전송되기 전의 원시 프레임을 확인하거나 수정할 수 있습니다.

Apache Kafka와 직접 통신

바이너리 Kafka 프로토콜을 Object Pascal로 구현했으며, 앞단의 REST 프록시도 아래의 librdkafka도 필요하지 않습니다.

기능API비고
레코드 생산Produce(topic, value, key, partition)키와 파티션은 선택 사항입니다. ProduceBytes는 둘 다 TBytes로 받습니다.
배치 생산ProduceMessages(topic, partition, messages)배치 전체에 대한 브로커의 produce 응답을 반환합니다.
전달 보장KafkaOptions.Producer.AckskafkaAcksNone, kafkaAcksLeader, kafkaAcksAll.
압축KafkaOptions.Producer.CompressionkafkaCompressionNone 또는 kafkaCompressionGzip.
소비Subscribe([topics])Poll(timeoutMs)PollTsgcKafkaMessages 목록을 반환하며, 레코드마다 OnKafkaMessage도 발생시킵니다.
컨슈머 그룹KafkaOptions.Consumer.GroupId코디네이터 검색, 조인, 동기화, 하트비트가 자동으로 처리됩니다. OnKafkaRebalance가 할당 변경을 알려 줍니다.
오프셋 정책KafkaOptions.Consumer.OffsetReset커밋된 오프셋이 없을 때 kafkaOffsetEarliest 또는 kafkaOffsetLatest를 사용합니다.
오프셋 커밋CommitSync, CommitOffset(topic, partition, offset)또는 Consumer.AutoCommitAutoCommitIntervalMs를 설정합니다.
파티션 직접 읽기FetchMessages(topic, partition, offset, maxBytes)컨슈머 그룹을 완전히 우회합니다.
오프셋 조회GetEarliestOffset, GetLatestOffset, GetCommittedOffset토픽과 파티션 단위로 조회합니다.
Fetch 튜닝Consumer.MinBytes, MaxBytes, MaxPartitionBytes, MaxWaitMs지연 시간과 배치 크기를 조절합니다.
토픽 관리CreateTopic, DeleteTopic, GetMetadata생성 시 파티션 수와 복제 계수를 지정합니다.
그룹 관리ListGroups, DescribeGroups자체 도구에서 컨슈머 그룹을 조회할 수 있습니다.
브로커 기능 확인GetApiVersions브로커가 지원하는 프로토콜 API 버전을 조회합니다.
SASLkafkaSaslNone, kafkaSaslPlainSASL/PLAIN 사용자 이름과 비밀번호 인증.

STOMP 1.0, 1.1, 1.2

범용 클라이언트 하나와, RabbitMQ 및 ActiveMQ의 목적지 규칙을 이름 있는 메서드로 바꿔 주는 브로커 전용 파생 컴포넌트 2종입니다.

기능STOMPRabbitMQActiveMQ비고
프레임 전송SendPublishExPublishEx목적지, 본문, 콘텐츠 형식과 선택적 트랜잭션.
구독Subscribe(id, destination)SubscribeExSubscribeEx파생 컴포넌트는 durable, exclusive, ack 모드 인자를 추가로 제공합니다.
큐 헬퍼SubscribeQueue, PublishQueue, UnSubscribeQueueSubscribeQueue, PublishQueue, UnSubscribeQueue/queue/ 목적지 접두사를 감싼 것입니다.
토픽 헬퍼SubscribeTopic, PublishTopic, UnSubscribeTopicSubscribeTopic, PublishTopic, UnSubscribeTopic/topic/ 목적지 접두사를 감싼 것입니다.
익스체인지 헬퍼SubscribeExchange, PublishExchange라우팅 패턴을 사용하는 RabbitMQ의 /exchange/ 목적지.
외부 큐SubscribeQueueOutside, PublishQueueOutside다른 곳에서 선언된 큐를 위한 RabbitMQ의 /amq/queue/.
임시 응답 큐SubscribeTemporaryQueue, PublishTemporaryQueueRabbitMQ의 /temp-queue/ 요청/응답 패턴.
확인 응답ACK / NACK구독마다 ack 모드를 선택합니다(ackAuto 등).
트랜잭션BeginTransaction, CommitTransaction, AbortTransaction여러 SEND와 ACK 프레임을 하나의 원자적 단위로 묶습니다.
수신 확인OnSTOMPReceiptOnRabbitMQReceiptOnActiveMQReceipt브로커가 처리한 프레임을 확인해 줍니다.
메시지 이벤트OnSTOMPMessageOnRabbitMQMessageOnActiveMQMessage목적지, 본문, 프레임 헤더를 전달합니다.
하트비트HeartBeat, PingCONNECT 프레임에서 양방향으로 협상됩니다.
버전 협상Versions.V1_0, V1_1, V1_2허용할 버전을 알리면 브로커가 하나를 선택합니다.
가상 호스트Options.VirtualHostCONNECT의 host 헤더로 전송됩니다.
브로커 확장ActiveMQ_OptionsActiveMQ 전용 헤더를 published 속성으로 노출합니다.

바이트가 브로커에 도달하는 방식

모든 프로토콜 컴포넌트는 Client 속성을 통해 TsgcTCPClient에 연결됩니다. 이 캐리어 하나로 프로토콜 코드를 바꾸지 않고 일반 TCP와 TLS를 모두 사용할 수 있습니다.

항목내용
일반 TCPTsgcTCPClientClient에 할당하면 프로토콜이 소켓 위에서 곧바로, 브로커의 기본 포트로 동작합니다.
WebSocketsgcMQ에는 포함되지 않습니다. 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 코드에서는 캐리어의 알림 설정으로 이벤트를 메인 스레드로 전달하세요.

사양, 컴파일러, 대상 플랫폼

공개된 프로토콜을, 지원하는 모든 컴파일러에서 동일한 소스로 사용합니다.

항목내용
MQTTOASIS MQTT 3.1.1 및 MQTT 5.0.
AMQP 0.9.1AMQP 0-9-1 사양: 채널, 익스체인지, 큐, 바인딩과 basic 클래스.
AMQP 1.0OASIS AMQP 1.0으로, ISO/IEC 19464로도 발행되었습니다.
KafkaTCP 위의 Apache Kafka 와이어 프로토콜로, v2 레코드 배치 형식을 포함합니다.
STOMPSTOMP 1.0, 1.1, 1.2.
WebSocket포함되지 않습니다. WebSocket 캐리어에는 WebSocket 클라이언트를 제공하는 sgcWebSockets가 필요합니다.
TLSOpenSSL을 통한 TLS 1.2 및 TLS 1.3, 또는 Windows SChannel.
컴파일러Delphi 및 C++ Builder 7부터 13까지.
플랫폼Win32, Win64, Linux64, macOS, iOS, Android.
라이선스단독 제품입니다. sgcWebSockets Core 런타임이 함께 포함되며 전체 소스 코드가 제공됩니다.
최고의 가성비: All-Access모든 eSeGeCe 제품과 프리미엄 지원이 포함되어 연 €1,059부터 이용할 수 있어요.
All-Access 가격 보기

sgcMQ로 만들어 보세요

무료 체험판을 다운로드하고 Delphi 또는 C++ Builder에서 브로커에 연결해 보세요.