Azure Functions を使用したイベント レプリケーションのタスクとアプリケーション

ヒント

イベントのペイロードを考慮し、それらを変換、集計、エンリッチ、または削減する必要があるすべてのステートフル レプリケーション タスクには、Azure Functions の代わりに Azure Stream Analytics を使用します。

イベント レプリケーションとクロスリージョン フェデレーションに関する記事で説明されているように、Event Hubs のペア間、および Event Hubs とその他のストリームのソースとターゲット間でのステートレス レプリケーションは、Azure Functions に依存しています。

Azure Functions は、イベント レプリケーションとフェデレーション タスクを含む、サーバーレス アプリケーションを構成および実行するためのスケーラブルで信頼性の高い実行環境です。

この概要では、このようなアプリケーション用の Azure Functions の組み込み機能、変換タスクに適応して変更できるコード ブロック、および Event Hub と他の Azure メッセージング サービスと理想的に統合されるように Azure Functions アプリケーションを構成する方法について説明します。 詳細については、この記事で紹介する Azure Functions のドキュメントを参照してください。

レプリケーション タスクとは

ソースからのイベントは、レプリケーション タスクによって受信されて、ターゲットに転送されます。 ほとんどのレプリケーション タスクで、イベントは変更されずに転送され、変更されるとしても、ソースとターゲットのプロトコルが異なる場合のメタデータ構造間のマッピング程度です。

レプリケーション タスクは一般にステートレスであり、タスクの順次実行または並列実行の間に状態や他の副作用が共有されないことを意味します。 これは、バッチ処理とチェーン化にも当てはまり、どちらもストリームの既存の状態の上に実装できます。

これにより、レプリケーション タスクは、一般にステートフルであり Azure Stream Analytics のような分析フレームワークとサービスのドメインである集計タスクとは異なるものになります。

Azure Functions でのレプリケーション アプリケーションとタスク

Azure Functions でのレプリケーション タスクは、構成されているソースから入力メッセージを取得するトリガーと、ソースからコピーされたメッセージを、構成されているターゲットに転送する出力バインドを使用して実装されます。

トリガー 出力
Azure Event Hubs トリガー Azure Event Hubs 出力バインド
Azure Service Bus トリガー Azure Service Bus 出力バインド
Azure IoT Hub トリガー Azure IoT Hub 出力バインド
Azure Event Grid トリガー Azure Event Grid 出力バインド
Azure Queue Storage トリガー Azure Queue Storage 出力バインド
Apache Kafka トリガー Apache Kafka 出力バインド
RabbitMQ トリガー RabbitMQ 出力バインド
Azure Notification Hubs 出力バインド
Azure SignalR Service 出力バインド
Twilio SendGrid 出力バインド

レプリケーション タスクは、他の Azure Functions アプリケーションと同じデプロイ方法を使用し、レプリケーション アプリケーションにデプロイされます。 同じアプリケーションに複数のタスクを構成できます。

Azure Functions Premium を使用すると、複数のレプリケーション アプリケーションで基になる同じリソース プールを共有できます。これは App Service プランと呼ばれます。 つまり、たとえば、.NET で記述されたレプリケーション タスクを、Java で記述されたレプリケーション タスクと、簡単に併置することができます。 これは、Java でのみ使用できる Apache Camel などの特定のライブラリを利用する必要がある場合で、他のレプリケーション タスクには異なる言語とランタイムを使用するのが一般的には好ましくても、特定の統合パスにはこれが最適なオプションである場合に、重要になります。

可能な場合は常に、イベントやメッセージを個別に配信するトリガーよりバッチ指向のトリガーを優先する必要があり、Azure Functions のパラメーター バインド式に依存するのではなく、イベントまたはメッセージの完全な構造を常に取得する必要があります。

関数には、接続しているソースとターゲットのペアを反映した名前を付ける必要があり、アプリケーション構成ファイル内の接続文字列または他の構成要素への参照を、その名前の前に付ける必要があります。

データとメタデータのマッピング

入力トリガーと出力バインドのペアを決定した後は、トリガーと出力の種類が同じでない限り、異なるイベントまたはメッセージの種類の間で何らかのマッピングを実行する必要があります。

Event Hubs と Service Bus 間でメッセージをコピーする単純なレプリケーション タスクの場合は、独自のコードを記述する必要はなく、レプリケーションのサンプルと共に提供されているユーティリティ ライブラリを利用することができます。

再試行ポリシー

レプリケーション関数のいずれかの側で可用性イベントが発生したときにデータが失われないようにするには、堅牢な再試行ポリシーを構成する必要があります。 再試行ポリシーを構成するには、再試行に関する Azure Functions ドキュメントを参照してください。

サンプル リポジトリ内のプロジェクト例で選択されているポリシー設定により、データ損失を回避するために、5 秒から 15 分の再試行間隔で再試行回数が無限であるエクスポネンシャル バックオフ戦略が構成されます。

Azure Functions の一般提供 (GA) バージョンの再試行ポリシーでは、Event Hubs トリガーと Timer トリガーのみがサポートされます。 他のすべてのトリガーのプレビュー サポートは削除されました。

レプリケーション アプリケーション ホストの設定

レプリケーション アプリケーションは、1 つまたは複数のレプリケーション タスクのための実行ホストです。

それは、従量課金プランまたは Azure Functions Premium プラン (推奨) で実行するように構成されている Azure Functions アプリケーションです。 すべてのレプリケーション アプリケーションは、システムまたはユーザーによって割り当てられたマネージド ID で実行する必要があります。

リンクされた Azure Resource Manager (ARM) テンプレートにより、以下のものを使用してレプリケーション アプリケーションが作成および構成されます。

  • レプリケーションの進行状況とログを追跡するための Azure ストレージ アカウント。
  • システム割り当てマネージド ID。
  • 監視のための Azure Monitoring と Application Insights の統合。

Azure 仮想ネットワーク (VNet) にバインドされた Event Hubs にアクセスする必要があるレプリケーション アプリケーションの場合は、Azure Functions Premium プランを使用し、同じ VNet にアタッチするように構成する必要があります。これは、使用可能なオプションの 1 つでもあります。

デプロイ 視覚化する
Azure Functions 従量課金プラン Azure へのデプロイ 視覚化する
Azure Functions の Premium プラン Azure へのデプロイ 視覚化する
VNet を使用する Azure Functions Premium プラン Azure へのデプロイ 視覚化する

サンプル リポジトリには、Event Hubs 間または Service Bus エンティティ間でイベントをコピーするレプリケーション タスクの例がいくつか含まれています。

Event Hubs 間でイベント データをコピーする場合は、イベント ハブ トリガーとイベント ハブ出力バインドを使用します。

[FunctionName("telemetry")]
[ExponentialBackoffRetry(-1, "00:00:05", "00:05:00")]
public static Task Telemetry(
    [EventHubTrigger("telemetry", ConsumerGroup = "$USER_FUNCTIONS_APP_NAME.telemetry", Connection = "telemetry-source-connection")] EventData[] input,
    [EventHub("telemetry-copy", Connection = "telemetry-target-connection")] EventHubClient outputClient,
    ILogger log)
{
    return EventHubReplicationTasks.ForwardToEventHub(input, outputClient, log);
}

Service Bus エンティティ間でメッセージをコピーする場合は、Service Bus のトリガーと出力バインドを使用します。

[FunctionName("jobs-transfer")]
[ExponentialBackoffRetry(-1, "00:00:05", "00:05:00")]
public static Task JobsTransfer(
    [ServiceBusTrigger("jobs-transfer", Connection = "jobs-transfer-source-connection")] Message[] input,
    [ServiceBus("jobs", Connection = "jobs-target-connection")] IAsyncCollector<Message> output,
    ILogger log)
{
    return ServiceBusReplicationTasks.ForwardToServiceBus(input, output, log);
}

ヘルパー メソッドを使用すると、Event Hubs と Service Bus の間でレプリケーションを簡単に行うことができます。

source 移行先 エントリ ポイント
Event Hubs Event Hubs Azure.Messaging.Replication.EventHubReplicationTasks.ForwardToEventHub
Event Hubs Service Bus Azure.Messaging.Replication.EventHubReplicationTasks.ForwardToServiceBus
Service Bus Event Hubs Azure.Messaging.Replication.ServiceBusReplicationTasks.ForwardToEventHub
Service Bus Service Bus Azure.Messaging.Replication.ServiceBusReplicationTasks.ForwardToServiceBus

監視

レプリケーション アプリを監視する方法については、Azure Functions のドキュメントの監視に関するセクションを参照してください。

レプリケーション タスクの監視に特に役に立つビジュアル ツールは、Application Insights のアプリケーション マップです。これは、キャプチャされた監視情報から自動的に生成され、レプリケーション タスクによるソースとターゲットの転送の信頼性とパフォーマンスを調べることができます。

すぐに診断情報を得るには、ログの詳細を低遅延で視覚化できる Live Metrics ポータル ツールを使用します。

次のステップ