サブスクリプション入門

分散環境では多くの場合、他のコンポーネント (通常、イベント・プロデューサーと呼ばれる) で生成されたメッセージ (イベント) に対応する処理をアプリケーションまたはジョブに行わせます。 Code Engine では、イベント・プロデューサーをサブスクライブすることで、アプリケーションまたはジョブが関心対象のイベントを受信できるようになります。 イベント情報は、アプリケーションについては POST HTTP 要求、ジョブについては環境変数として受信されます。

Code Engine は、以下のタイプのイベント・プロデューサーをサポートします。

Cron
cron イベント・プロデューサーは、クーロンに基づいており、一定の間隔でイベントを生成します。 明確に定義された間隔または特定の時刻にアクションを実行する必要がある場合に、cron イベント・プロデューサーを使用します。
IBM Cloud Object Storage
Object Storage イベント・プロデューサーは、オブジェクト・ストレージ・バケット内のオブジェクトに変更が加えられると、イベントを生成します。 例えば、バケットにオブジェクトが追加されると、アプリケーションがイベントを受信して、その変更に基づくアクション (新しいオブジェクトを取り込むなど) を実行できます。
Kafka
Kafka イベント・プロデューサーは、 Kafka インスタンスに新規メッセージが表示されるかどうかを監視します。 一連のトピックに対して Code Engine Kafka サブスクリプションを作成すると、アプリケーションまたはジョブは、いずれかのトピックに表示される新規メッセージごとに別個のイベントを受け取ります。
Webhook
GitHub Webhook を使用して、 GitHub リポジトリーから Code Engine ワークロードにイベントを送信できます。 イベントは、 サポートされるコンテンツ・タイプのいずれかで POST 要求として送信されます。 GitHub イベントを受信するには、パブリック・エンドポイントを持つアプリケーションを使用する必要があります。ジョブはサポートされません。 詳しくは、 アプリケーションへの GitHub イベントの送信 を参照してください。

サブスクリプション API について詳しくは、 サブスクリプション CRD メソッド を参照してください。

アプリおよびアプリ・スケーリングのサブスクリプション

アプリケーションは複数のイベント・プロデューサーをサブスクライブできるが、各サブスクリプションからイベントを受信できるのは1つのアプリケーションのみである。 サブスクリプションはアプリケーションのスケーリングに影響を及ぼすことに留意してください。 例えば、アプリが同時に多くのイベントを受信し、各イベントの処理に数分かかることが予想される場合、各イベントを迅速に処理できる場合よりも高い最大スケール値が必要になるかもしれません。 詳しくは、アプリケーション・スケーリングの構成を参照してください。

アプリケーションに配信されるすべてのイベントは、HTTP メッセージとして受信されます。 イベントには特定の HTTP ヘッダーが含まれており、イベントの本文 (ビジネス・ロジック) を確認しなくても、イベントに関する重要な情報を素早く判別することができます。 詳細については、 アプリケーションに送られる IBM Cloud Object Storage イベントのヘッダーの例 HTTP を参照のこと。

ジョブおよびジョブ実行の制限のサブスクリプション

サブスクリプションは、ジョブの開始数に影響します。 例えば、ジョブが Object Storage バケット上の変更を削除するようにサブスクライブしていて、そのバケットが削除された場合、そのバケット内にあったオブジェクトごとにジョブが実行され、100 ジョブ実行という制限に素早く達することができます。 さらに、イベントによってトリガーされるジョブ実行ごとにランタイムを考慮する必要があります。 例えば、イベント・プロデューサーが 1 秒当たり 10 個以上のイベントをトリガーし、各ジョブが約 20 秒間実行されると、ジョブ実行制限 100 に約 10 秒で到達し、それ以降のジョブ実行は、前に開始されたジョブ実行が完了するまで失われます。 ジョブをイベント・サブスクライバ・デスティネーションとして選択するのは、受信イベント数が一般的に少なく、特定の時間枠で予想されるイベント数のピークが、実行中のジョブ数をクォータ制限以下に保つのに十分低い場合に限られる。 詳しくは、Code Engine の制限と割り当て量を参照してください。

10 分後に、サブスクリプションによって作成されたジョブ実行が削除されます。 詳しくは、 ジョブの実行場所 を参照してください。

ジョブに配信されるすべてのイベントは、環境変数として受け取られる。 詳しくは、 ジョブに送信される IBM Cloud Object Storage イベントの環境変数の例 を参照してください。

イベント処理メタデータ

Code Engine、サブスクリプションを作成する際に管理されるイベントは、以下のように変更される CloudEvents 仕様。 この仕様では、メタデータの共通セットを提供するために各イベントに含めることができる、共通属性のセットが定義されています。 このメタデータを参照すれば、イベント・ペイロード全体を解析して理解しなくても、メッセージの重要な要素を素早く把握できます。 例えば、アプリケーションに配送される各イベントは、 ce-type と呼ばれる、イベントのセマンティックな意味(あるいは「理由」)を示す HTTP ヘッダーを含む。 データベースからのイベントに ce-type という com.example.row.deleted 値が含まれている場合、これはデータベースで行が削除されたためにイベントが生成されたことを示しています。

以下の表に、いくつかの主要な共通属性をリストします。 各属性について、それが着信イベントの必須の属性か、それともオプションかが示されています。

一般的なCloudEvent属性
ヘッダー 説明
ID この必須属性は、イベントの固有 ID です。 同じイベント・プロデューサーからの別々のイベントに、同じ値が割り当てられることはありません。
ソース この必須属性は、イベントが発生したコンテキストを指定します。 例えば、オブジェクト・ストレージ・システムの場合、この値は、問題のオブジェクトが存在するバケットである可能性があります。
Specversion この必須の属性は、イベントで使用される CloudEvents 仕様のバージョンを示します。
タイプ この必須属性は、イベントのタイプを示します。 例えば、リソースが作成または削除されたことを示すイベントのタイプがあります。
件名 このオプションの属性は、イベントが関連しているリソースを示します。 例えば、オブジェクト・ストレージ・システムでは、この値は、変更されたバケットからのオブジェクトである可能性があります。
時刻 このオプションの属性は、事象が発生した時を示すタイム・スタンプです。

属性の完全なリストについては、 CloudEvents 仕様を参照のこと。

Code Engine で、イベントがアプリケーションに送達される際には、CloudEvent 属性は接頭部が ce- の HTTP ヘッダーとして示されます。 イベントがバッチ・ジョブに送信されると、属性は環境変数として表示され、接頭部CE_ が付き、変数名全体が大文字になります。

アプリケーションに送信される IBM Cloud Object Storage イベントの HTTP ヘッダーの例

ce-id: 3fb2c04e-a660-4640-8899-b82efb8169b6
ce-source: https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket
ce-specversion: 1.0
ce-subject: object-69-144
ce-time: 2021-08-17T20:22:02.917Z
ce-type: com.ibm.cloud.cos.document.delete

ジョブに送信される IBM Cloud Object Storage イベントの環境変数の例

CE_DATA={"bucket":"mybucket","endpoint":"","key":"Notes.rtf","notification":{"bucket_name":"mybucket","content_type":"text/rtf","event_type":"Object:Delete","format":"2.0","object_length":"4642","object_name":"Notes.rtf","request_id":"b59727ee-9c4e-446a-9261-5616f6d1283b","request_time":"2021-04-13T20:10:37.631Z"},"operation":"Object:Delete"}  
CE_ID=b59727ee-9c4e-446a-9261-5616f6d1283b  
CE_SOURCE=https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket  
CE_SPECVERSION=1.0  
CE_TIME=2021-08-17T20:22:02.917Z  
CE_TYPE=com.ibm.cloud.cos.document.delete  

サブスクリプションを作成するとどうなりますか?

デフォルトでは、 subscription cron createsubscription cos create 、および subscription kafka create コマンドは、最初に宛先アプリケーションまたはジョブが存在するかどうかを検査します。 アプリケーションまたはジョブがプロジェクトに存在しないために宛先検査が失敗した場合、サブスクリプション作成のコマンドはエラーを返します。 最初にアプリケーションを作成することなくサブスクリプションを作成する場合は、--force オプションを使用します。 --force オプションを使用することで、コマンドは宛先の確認をバイパスします。 宛先のアプリケーションまたはジョブが作成されるまでサブスクリプションの Ready フィールドに false が表示されることに注意してください。 宛先アプリが作成されると、サブスクリプションの状態は自動的に Ready: true になります。

サブスクリプションの作成後、サブスクリプションの準備ができているかを検査するために、サブスクリプションの状況をチェックするポーリングが繰り返し実行されます。 デフォルトで、このポーリングは 15 秒間続くとタイムアウトになります。 コマンドがタイムアウトになるまでの時間は、--wait-timeout オプションを使用して変更できます。 また、--no-wait オプションを false に設定することで状況のポーリングをバイパスすることもできます。

サブスクリプションの状況は、 subscription cron getsubscription cos get 、または subscription kafka get CLI コマンドを使用して表示できます。