sgcMQ 機能一覧
sgcMQ でできることすべてを、7 つのクライアントコンポーネントと、それらが実装する仕様に対応付けて示します。すべての機能は Delphi と C++ Builder で同じように動作し、すべてのライセンスに完全なソースコードが付属します。各コンポーネントをクリックすると、使い方とサンプルを掲載した個別ページに移動します。
sgcMQ でできることすべてを、7 つのクライアントコンポーネントと、それらが実装する仕様に対応付けて示します。すべての機能は Delphi と C++ Builder で同じように動作し、すべてのライセンスに完全なソースコードが付属します。各コンポーネントをクリックすると、使い方とサンプルを掲載した個別ページに移動します。
3.1.1 と 5.0
0.9.1 と 1.0
ネイティブのワイヤプロトコル
1.0 / 1.1 / 1.2
素の 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 を通じて利用します。
4 つのプロトコルファミリーが、SGC MQ パレットページに登録されます。
| コンポーネント | クラス | ファミリー | 説明 |
|---|---|---|---|
| MQTT クライアント | TsgcWSPClient_MQTT | MQTT | MQTT 3.1.1 と 5.0 のパブリッシュ/サブスクライブ。QoS 0/1/2、保持メッセージ、Last Will and Testament、セッション、MQTT 5 のプロパティに対応します。 |
| AMQP 0.9.1 クライアント | TsgcWSPClient_AMQP | AMQP | チャネル、エクスチェンジ、キューとバインディング、コンシューマー、確認応答、プリフェッチ QoS、トランザクションに対応します。 |
| AMQP 1.0 クライアント | TsgcWSPClient_AMQP1 | AMQP | セッション、送信リンクと受信リンク、クレジットベースのフロー制御、SASL 認証、Azure CBS トークンのヘルパーに対応します。 |
| Kafka クライアント | TsgcWSPClient_Kafka | Kafka | acks と gzip に対応したプロデューサー、リバランスとオフセットコミットを備えたコンシューマーグループ、トピックの管理操作に対応します。 |
| STOMP クライアント | TsgcWSPClient_STOMP | STOMP | STOMP 1.0/1.1/1.2 のフレーム。SEND、SUBSCRIBE、ACK、NACK、レシート、ハートビート、トランザクションに対応します。 |
| STOMP RabbitMQ クライアント | TsgcWSPClient_STOMP_RabbitMQ | STOMP | RabbitMQ 向けに調整した STOMP。キュー、トピック、エクスチェンジ、外部キュー、一時キューのヘルパーを TCP または TLS 上で利用できます。 |
| STOMP ActiveMQ クライアント | TsgcWSPClient_STOMP_ActiveMQ | STOMP | Apache ActiveMQ 向けに調整した STOMP。キューとトピックのヘルパーに加え、ActiveMQ_Options プロパティを備えます。 |
IoT のパブリッシュ/サブスクライブプロトコルを、QoS の仕組みを隠さずそのまま公開して提供します。
| 機能 | 3.1.1 | 5.0 | 備考 |
|---|---|---|---|
| プロトコルバージョンの選択 | ✓ | ✓ | MQTTVersion は mqtt311 または mqtt5 を受け取ります。 |
| QoS 0、1、2 | ✓ | ✓ | QoS 2 のやり取りは OnMQTTPubRec、OnMQTTPubRel、OnMQTTPubComp として公開され、内部に隠されません。 |
| 保持メッセージ | ✓ | ✓ | retain フラグは Publish の第 4 引数です。 |
| Last Will and Testament | ✓ | ✓ | LastWillTestament がトピック、メッセージ、QoS、retain を保持します。 |
| ワイルドカードのサブスクリプション | ✓ | ✓ | 1 階層は +、以降のツリー全体は # です。 |
| セッション | ✓ | ✓ | OnMQTTConnect の Session 引数が、ブローカーがセッションを再開したかどうかを示します。 |
| パブリッシュして待機 | ✓ | ✓ | PublishAndWait はブローカーがパケットを確認応答するまでブロックします。 |
| ストリームのパブリッシュ | ✓ | ✓ | Publish にはバイナリペイロード用の TStream オーバーロードがあります。 |
| 理由コードと名称 | — | ✓ | MQTT 5 では CONNACK と DISCONNECT で数値の理由コードとその名称が返ります。 |
| CONNECT プロパティ | — | ✓ | ConnectProperties でセッション有効期限、受信最大数、最大パケットサイズ、トピックエイリアス最大数を設定します。 |
| トピックエイリアス | — | ✓ | 通信上は長いトピック名の代わりに短い整数を使い、受信パケットでは自動的に解決されます。 |
| ユーザープロパティ | — | ✓ | 任意のキー/値のペアが CONNECT、PUBLISH、SUBSCRIBE、DISCONNECT とともに送られます。 |
| 共有サブスクリプション | — | ✓ | $share/<group>/<topic> をサブスクライブすると、配信をクライアントのグループに分散できます。 |
| 拡張認証 | — | ✓ | チャレンジ/レスポンス方式向けに、Auth と OnMQTTAuth を通じた AUTH パケットの往復を行います。 |
| キープアライブ | ✓ | ✓ | HeartBeat が PINGREQ を送信し、応答時に OnMQTTPing が発生します。 |
名前以外に共通点のない 2 つのプロトコルです。1 つの API で両方をまかなうふりをせず、sgcMQ はそれぞれに専用のコンポーネントを提供します。
| 機能 | 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 は配信タグを確認し、1.0 は配信を確定します。 |
| フロー制御 | SetQoS のプリフェッチ、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 | 接続開始時のハンドシェイクで送信され、ブローカーとネゴシエートされます。 |
| プリフェッチ | 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 | トピックとパーティション単位で取得します。 |
| フェッチのチューニング | Consumer.MinBytes、MaxBytes、MaxPartitionBytes、MaxWaitMs | レイテンシとバッチサイズのバランスを調整します。 |
| トピックの管理 | CreateTopic、DeleteTopic、GetMetadata | 作成時にパーティション数とレプリケーションファクターを指定します。 |
| グループの管理 | ListGroups、DescribeGroups | 自作のツールからコンシューマーグループを調べられます。 |
| ブローカーの対応状況の確認 | GetApiVersions | ブローカーが対応しているプロトコル API のバージョンを問い合わせます。 |
| SASL | kafkaSaslNone、kafkaSaslPlain | SASL/PLAIN のユーザー名とパスワードによる認証です。 |
汎用クライアント 1 つに加え、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 フレームを 1 つのアトミックな単位にまとめます。 |
| レシート | OnSTOMPReceipt | OnRabbitMQReceipt | OnActiveMQReceipt | ブローカーが処理したフレームを確認します。 |
| メッセージイベント | OnSTOMPMessage | OnRabbitMQMessage | OnActiveMQMessage | デスティネーション、本文、フレームのヘッダーを渡します。 |
| ハートビート | HeartBeat、Ping | ✓ | ✓ | CONNECT フレームで双方向にネゴシエートされます。 |
| バージョンネゴシエーション | Versions.V1_0、V1_1、V1_2 | ✓ | ✓ | 受け入れ可能なバージョンを告知すると、ブローカーが 1 つを選びます。 |
| 仮想ホスト | Options.VirtualHost | ✓ | ✓ | CONNECT の host ヘッダーとして送信されます。 |
| ブローカーの拡張 | — | — | ActiveMQ_Options | ActiveMQ 固有のヘッダーを published プロパティとして公開しています。 |
どのプロトコルコンポーネントも、Client プロパティを通じて TsgcTCPClient に接続します。このキャリア 1 つで、プロトコル側のコードを変えずに素の TCP と TLS の両方を利用できます。
| 項目 | 内容 |
|---|---|
| 素の TCP | Client に TsgcTCPClient を割り当てると、プロトコルはブローカーのネイティブポート上のソケットで直接動作します。 |
| 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 ランタイムを同梱し、完全なソースコードが含まれます。 |