このトピックでは、Message Service (MNS) コネクタの使用方法について説明します。
背景情報
Message Service (MNS) は、効率的、高信頼性、安全、使いやすく、弾性的にスケーラブルな分散メッセージングサービスです。MNS は、Object Storage Service (OSS) のイベント通知機能を提供します。イベント通知ルールを作成することで、指定した OSS リソースでオブジェクト作成などのイベントが発生した際に、メッセージを MNS キューにプッシュできます。
Flink ジョブは MNS コネクタを使用してこれらのイベントを消費できます。たとえば、リアルタイム画像処理シナリオでは、MNS コネクタを使用して OSS バケット内の新しいファイルのパスを取得できます。その後、Realtime Compute for Apache Flink が提供する FETCH_CONTENT 関数を使用して画像コンテンツをダウンロードし、AI 大規模言語モデル統合 を使用してリアルタイムのマルチモーダル分析を行うことができます。
カテゴリ | 詳細 |
サポートタイプ | ソーステーブル |
実行モード | ストリーミング |
データ形式 | Orc、Parquet、Avro、CSV、JSON、Raw |
特定の監視メトリクス | duplicateMessages (重複メッセージ数)、deletedMessages (削除済みメッセージ数)、failedDeletes (削除失敗数)、deserializationErrors (逆シリアル化エラー数) |
API タイプ | SQL |
前提条件
MNS を有効化し、必要な権限を付与していること。内部ネットワークアクセスの場合、MNS キューはご利用の Flink ワークスペースと同じリージョンにある必要があります。
パブリックインターネット経由で MNS にアクセスする場合、ご利用の Flink ワークスペースの パブリックアクセスを有効にし、Flink ワークスペースのパブリック IP アドレスを MNS キューの許可リストに追加する必要があります。詳細については、「MNS アクセス制御」をご参照ください。
制限事項
MNS コネクタは、Realtime Compute for Apache Flink VVR 11.6.0 以降でのみサポートされています。
Kafka とは異なり、MNS コネクタは特定のオフセットからのメッセージ消費やシーク操作をサポートしていません。詳細については、「Message Service (MNS)」をご参照ください。
並列度 1 に固定: MNS コネクタは、コネクタ側の重複排除によって Exactly-Once セマンティクスを実現し、並列度は 1 のみをサポートします。
チェックポイントの有効化が必須: MNS コネクタは、メッセージの確認と削除をチェックポイントに依存しています。チェックポイントが有効になっていない場合、メッセージは削除されず、無限に繰り返し消費されることになります。
メッセージ本文のサイズ制限: 1 つの MNS メッセージの本文は 64 KB を超えることはできません。より大きなメッセージを処理する方法については、MNS ドキュメントの「大きなメッセージの転送」のベストプラクティスをご参照ください。
可視性タイムアウトの設定: MNS キューを作成する際には、可視性タイムアウト を設定する必要があります。メッセージの再配信を避けるため、可視性タイムアウトはチェックポイント間隔よりも大きい値に設定してください。
MNS コネクタは、消費されるイベントの厳密な順序を保証しません。 MNS スタンダードキューは、厳密な先入れ先出し (FIFO) ではありません。タイムアウト後のメッセージ再配信により、消費の順序が変わる可能性があります。
構文
CREATE TABLE mns_source (
data STRING
) WITH (
'connector' = 'mns',
'endpoint' = '${endpoint}',
'region' = '${region}',
'queueName' = '${queueName}',
'accessKeyId' = '${accessKeyId}',
'accessKeySecret' = '${accessKeySecret}',
'format' = 'json',
'batchSize' = '8',
'pollingWaitTime' = '10s',
'messageType' = 'RAW'
);WITH パラメーター
一般
パラメーター
説明
型
必須
デフォルト値
備考
connector
コネクタのタイプ。
String
はい
なし
値は
mnsに固定されます。endpoint
MNS サービスのエンドポイント。
String
はい
なし
URI のフォーマットは
http://{account-id}.mns.{region}.aliyuncs.comです。詳細については、「リージョンエンドポイント」をご参照ください。
region
MNS キューのリージョン。
String
はい
なし
例:
cn-hangzhou。サポートされているリージョンのリストについては、「エンドポイント」をご参照ください。queueName
MNS キュー名。
String
はい
なし
MNS コンソールでキューを作成する際に設定した名前。
accessKeyId
MNS サービスにアクセスするための AccessKey ID。
String
はい
なし
既存の AccessKey を使用するか、「AccessKey の作成」をご参照ください。
accessKeySecret
MNS サービスにアクセスするための AccessKey Secret。
String
はい
なし
format
データ形式。
String
はい
なし
有効な値:
csv
json
avro
parquet
orc
raw
batchSize
MNS キューから一度にプルするメッセージの最大数。
Integer
いいえ
1
範囲:1~16。これは読み取りパフォーマンスに影響します。値を大きくするとスループットが向上する可能性があります。注意:MNS サービスの API は、1 回の呼び出しで最大 16 メッセージに制限されています。
pollingWaitTime
MNS キューをポーリングする際のメッセージの最大待機時間。
Duration
いいえ
10s
範囲:0s~30s。値が 0s の場合は待機しません。
messageType
MNS メッセージのペイロードタイプ。
String
いいえ
RAW
値は
RAWまたはOSSです。RAW(デフォルト):メッセージ本文は標準の JSON として扱われ、設定されたformatデシリアライザーによって解析されます。OSS:OSS イベント通知 からの JSON データを自動的に解析します。(OSS イベントへの MNS サブスクリプションが必要です。) コネクタはevents配列から最初の要素を自動的に抽出し、ネストされたフィールドをフラット化してテーブル構造にマッピングします。説明messageTypeがOSSに設定されている場合、formatはjsonである必要があります。deleteMaxRetries
メッセージの削除が失敗した場合の最大リトライ回数。
Integer
いいえ
3
なし。
startTimeMs
消費を開始する時刻 (ミリ秒単位の UNIX タイムスタンプ)。
Long
いいえ
-1
値が -1 の場合、タイムスタンプによるフィルタリングは無効になり、コネクタはすべての可視メッセージを消費します。
説明MNS コネクタは Kafka のようなシークをサポートしていません。startTimeMs パラメーターはフィルタリング専用です。コネクタは、このタイムスタンプより前にキューに入ったメッセージを除外します。
OSS イベント通知の読み取り
'messageType' = 'OSS' を設定すると、MNS コネクタは OSS イベント通知の JSON フィールドを自動的に解析し、フラットなテーブル構造にマッピングします。以下のフィールド名マッピングがサポートされています (大文字と小文字は区別されません):
フィールド名 | JSON パス | 説明 |
eventName | eventName | イベントタイプ。 |
eventSource | eventSource | イベントソース。 |
eventTime | eventTime | イベント時間。 |
eventVersion | eventVersion | イベントプロトコルバージョン。 |
region | region | バケットリージョン。 |
ossBucketArn | oss.bucket.arn | バケットの一意の識別子。 |
ossBucketName | oss.bucket.name | バケット名。 |
ossBucketOwnerIdentity | oss.bucket.ownerIdentity | バケット作成者のユーザー ID。 |
ossObjectKey | oss.object.key | オブジェクト名。 |
ossObjectSize | oss.object.size | オブジェクトサイズ。 |
ossObjectETag | oss.object.eTag | オブジェクトの ETag。コンテンツの変更をチェックするために使用されます。 |
ossObjectDeltaSize | oss.object.deltaSize | オブジェクトサイズの変更。 |
ossObjectReadFrom | oss.object.readFrom | ファイル読み取り開始位置。 |
ossObjectReadTo | oss.object.readTo | ファイル読み取り終了位置。 |
ossOssSchemaVersion | oss.ossSchemaVersion | OSS スキーマバージョン番号。 |
ossRuleId | oss.ruleId | 一致したルールの ID。 |
requestParametersSourceIPAddress | requestParameters.sourceIPAddress | リクエストのソース IP アドレス。 |
responseElementsRequestId | responseElements.requestId | 一意のリクエスト ID。 |
userIdentityPrincipalId | userIdentity.principalId | リクエスターのユーザー ID (UID)。 |
以下の JSON フォーマットパラメーターを使用して、解析動作を制御します:
json.fail-on-missing-field:フィールドが見つからない場合に失敗するかどうかを指定します (デフォルト:false)。json.ignore-parse-errors:解析エラーを無視するかどうかを指定します。デフォルト値:false。json.timestamp-format.standard:タイムスタンプ形式 (デフォルト:ISO-8601)json.timestamp-format.pattern:タイムスタンプ形式のカスタムパターン。
フィールドの詳細な説明については、「OSS イベント通知」をご参照ください。
例
例 1:標準の JSON メッセージを消費する
-- MNS ソーステーブルを作成します。 -- フィールド名は JSON メッセージ本文のキーと一致する必要があります。 CREATE TEMPORARY TABLE mns_source ( `userId` BIGINT, `action` STRING, `timestamp` TIMESTAMP(3), `payload` STRING ) WITH ( 'connector' = 'mns', 'endpoint' = 'http://your-account-id.mns.cn-hangzhou.aliyuncs.com', 'region' = 'cn-hangzhou', 'queueName' = 'my-events-queue', 'accessKeyId' = 'your-ak', 'accessKeySecret' = 'your-sk', 'format' = 'json' ); -- 出力をテストするための結果テーブルを作成します。 CREATE TEMPORARY TABLE print_sink ( `userId` BIGINT, `action` STRING, `timestamp` TIMESTAMP(3), `payload` STRING ) WITH ( 'connector' = 'print' ); -- データを消費して出力します。 INSERT INTO print_sink SELECT userId, action, timestamp, payload FROM mns_source;例 2:OSS イベント通知メッセージを消費する
-- OSS イベント通知 JSON を自動的に解析するための MNS ソーステーブルを作成します。 -- フィールド名の定義については、「OSS イベント通知の読み取り」セクションをご参照ください。 CREATE TEMPORARY TABLE oss_event_source ( `eventName` STRING, `eventSource` STRING, `eventTime` TIMESTAMP(3), `region` STRING, `ossBucketName` STRING, `ossObjectKey` STRING, `ossObjectSize` BIGINT, `responseElementsRequestId` STRING, `userIdentityPrincipalId` STRING ) WITH ( 'connector' = 'mns', 'endpoint' = 'http://123456789.mns.cn-hangzhou.aliyuncs.com', 'region' = 'cn-hangzhou', 'queueName' = 'oss-events-queue', 'accessKeyId' = '${secret_values.ak_id}', 'accessKeySecret' = '${secret_values.ak_secret}', 'format' = 'json', 'messageType' = 'OSS' ); -- 出力をテストするための結果テーブルを作成します。 CREATE TEMPORARY TABLE print_sink ( `eventName` STRING, `ossBucketName` STRING, `ossObjectKey` STRING, `ossObjectSize` BIGINT, `eventTime` TIMESTAMP(3) ) WITH ( 'connector' = 'print' ); -- ObjectCreated イベントをフィルタリングして結果を出力します。 INSERT INTO print_sink SELECT eventName, ossBucketName, ossObjectKey, ossObjectSize, eventTime FROM oss_event_source WHERE eventName LIKE 'ObjectCreated:%';