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:接続で使用できる最大チャネル番号です。この値に 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、またはサーバーがサポートするその他のメカニズムが含まれます。
例: セキュアポート 5671 でリッスンする AMQP サーバーに SASL 認証情報を使用して接続します。
// 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 クライアント
Delphi / C++ Builder 向け AMQP 1.0.0 クライアントの詳細はこちら https://www.esegece.com/help/sgcWebSockets/ja/#t=Components%2FProtocols%2FSubprotocols%2FAMQP1%2FProtocol_AMQP1.htmデモのダウンロード
sgcWebSockets ライブラリで Windows 向けにコンパイルされた AMQP 1.0.0 クライアントデモをダウンロードしてください。
