永続的な機能


最近、私は見ていましたApache Airflow 以来、私はそれが“ワークフロー”シナリオをサポートするためのPython開発者やクラウドプロバイダから注目を集めている.文脈のために、私はDurable Functions Azureでは、すぐにPythonの永続的な機能の一般的な可用性(GA)を発表するでしょう.両方の気流と永続的な機能は、Pythonでワークフローを構築することをサポートしています.このブログ記事は、この比較を行う試みです.また、人々はそれがいくぶん役に立つと思っています.
最後に、私が学んだことは、永続的な機能とApache Airflowが異なるアプローチを使って異なる問題を解決しようとしていることです.主な違いは、サポートされているワークフローの種類と、Pythonがオーサリングプロセスで果たす役割のまわりにあります.私は、このポストのこれらの違いに関する詳細に入ります.

オーケストラとの比較
私が見つけた最も重要な技術的な違いはプログラミングモデルです.永続的な機能を使用すると、ワークフローを作成することでorchestrator functions . オーケストラータ関数は、どのように動作を実行するか、アクションが実行されるかを記述します.説明するために、以下のことは、「活動」として知られている3つの仕事を呼ぶPythonの単純な連続オーケストレーションです.t1 , t2 , and t3 , Pythonのジェネレータ構文を使用します.
import azure.functions as func
import azure.durable_functions as df

def orchestrator_function(context: df.DurableOrchestrationContext):
    x = yield context.call_activity("t1", None)
    y = yield context.call_activity("t2", x)
    z = yield context.call_activity("t3", y)
    return z

main = df.Orchestrator.create(orchestrator_function)
それぞれyield 式を使用すると、スケジュールされたタスクが完了してから結果をローカル変数に保存するまで待機します.このようにして生成されると、オーケストラータ関数はメモリからアンロードされ、ワークフローの進行が持続します.
オーケストレーションは多くの異なるタイプの行動を含むことができますactivity functions , sub-orchestrations , 彼らは待つことができるexternal events , メイクHTTP calls , 使用してスリープdurable timers . オーケストラの機能はまた、として知られている耐久性のある俳優のようなオブジェクトと対話することができますentity functions . これらのすべては通常の手続き型コーディング構造を使用して行われます.これは、Conditionals、ループ、関数呼び出し、Test/Exclusion/Duendy(Device Logicを実装するために)を通して例外処理のようなプログラミング言語機能を使用できることを意味します.信頼性と分散実行は、基になるフレームワークによって処理されます.
Apache Airflow Programming Modelは、より宣言的な構文を使用してDAG Pythonを使用した(非サイクルグラフ指向)説明するには、3つのタスクが定義されていることを再度仮定します.t1 , t2 , and t3 . 上記のように、次のコードを使用して、同様のシーケンシャルワークフローを実装できます.
dag = DAG('hello_world', description='Sequential DAG',
          schedule_interval='0 12 * * *',
          start_date=datetime(2020, 11, 28), catchup=False)

t1 = PythonOperator(task_id='t1', dag=dag, python_callable=t1)
t2 = PythonOperator(task_id='t2', dag=dag, python_callable=t2)
t3 = PythonOperator(task_id='t3', dag=dag, python_callable=t3)

t1 >> t2 >> t3
Airflow Pythonスクリプトは、コードとしてDAGの構造を指定するだけの設定ファイルです.通常のPythonスクリプトとは異なり、動的な入力を渡したり、出力を検査したり、条件式、ループ、エラー処理、または言語の他の機能を持つコントロールフローを行うことはできません.したがって、設定のためにPythonを使用するために起こるワークフローDSLとして気流DAGオーサリングを考えるのがベストです.
この点をさらに説明するために、一般的な「承認ワークフロー」使用ケースを考えてください.このシナリオでは、誰かがマネージャーによって承認される必要がある購入注文を提出します.ワークフローは承認を待ち、受け取った直後に処理ステップに移動する.しかし、承認が72時間(多分承認が休暇にある)で受け取られないならば、エスカレーションタスクは保留中の承認を解決するのを助ける予定です.永続的な関数を使用すると、次のようにコードを使用してこのワークフローを実装できます.
import azure.durable_functions as df
from datetime import timedelta 


def orchestrator_function(context: df.DurableOrchestrationContext):
    yield context.call_activity("RequestApproval", None)

    # create a timer task that expires 72 hours from now
    due_time = context.current_utc_datetime + timedelta(hours=72)
    timeout_task = context.create_timer(due_time)

    # create a task that completes when an "Approval" event is received
    approval_task = context.wait_for_external_event("Approval")

    # context.task_any() waits until any one task completes and returns it
    winning_task = yield context.task_any([approval_task, timeout_task])

    if approval_task == winning_task:
        timeout_task.cancel()
        yield context.call_activity("Process", approval_task.result)
    else:
        yield context.call_activity("Escalate", None)


main = df.Orchestrator.create(orchestrator_function)
ご覧のように、タスクが動的にスケジュールされ、入力と出力を持って、出力はワークフローを取るために次のステップを決定するために使用することができます.一方、気流は、データを渡す必要が必ずしもない静的データパイプラインを定義するために、より最適化されます.
これらの2つのワークフローオーサリングモデルの間に重要なトレードオフがあります.タスクスケジューリングがダイナミックである永続的な機能の「命令的なコード」モデルでは、可能なワークフローのより大きなセットを表現することができます.しかし、あなたのオーケストラのコードを決定するために慎重にする必要がありますorchestrator code constraints . 気流の「宣言的なコード」モデルは、より静的で、制約されます、しかし、それらの制約は、それをより簡単に分析するツールを構築するのをより簡単にして、創造的な可視化のようなものをします.

活動対オペレーター
もう一つの重要な違いは、活動と演算子です.どちらもスケジュールできるワークフロータスクを表します.永続的な機能では、すべてが機能です.これにはオーケストラが含まれている.しかし、それはあなたの活動機能の各ビジネスロジックを書くことです.前述のように、永続的な機能は、タイマ、外部イベントハンドラ、およびHTTPアクションのようないくつかの低レベルの原始的なタスクタイプを提供していますが、現在のバージョンで広範なライブラリ“事前に”タスクを提供していません.
Operators Apache Airflowでは、伝統的なワークフローの動作のようになります.最も基本的なのはPythonOperator , Python関数をタスクとして実行することができます.加えて、データベースのような外部システムと相互作用するための演算子の幅広いセットが存在する、HTTPエンドポイント、S 3のような雲データサービスなどhere . また、OSSコミュニティによって開発された他の演算子を活用することができますplugins . 既存の演算子のこのライブラリのため、多くのエアフローを作成ワークフローは、任意のカスタムコードを全く含まない可能性があります.

イベントドリブン
Apache Airflow DAGは、定義済みのcronスケジュールで主に起動されます.詳しい情報here . また、CLIを使用してワンオフの実行を行うことも可能です.あなたがバックフィルを行うか、データ処理パイプラインの一部として「キャッチアップ」実行をするならば、気流Frontモデルは特に役に立ちます.
一方、永続的な機能は、オーケストラを誘発するためのAzure関数のイベント駆動メカニズムに依存します.例えば、あなたはclient function これは、1つまたは複数のオーケストレーションインスタンスを起動するときに、HTTPメッセージを受信するときに、キューメッセージが到着するか、または1つのイベントからの基づいてmany other supported trigger types , cronベースのタイマートリガイベントを含む.

自分でそれを行う-組み込みの管理ツール
私はApache Airflowへの最大の描画の一つは、簡単に管理し、あなたのダグを検査できるようにするUIツールです.あなたはAirFlow UIのスクリーンショットの完全なリストを見ることができますhere . いくつかの特に有用な見解は、私の意見ではgraph view それはあなたのDAGを可視化し、リアルタイムでその進捗状況を示していますGantt chart それはあなたのワークフローの各ステップをどのように撮影している方法を示します.以前に述べたように、DAGの静的な性質は、管理と監視の目的のためにビジュアルツールを構築することを容易にします.あなたはこれらの機能のいくつかを披露素晴らしいビデオを見つけることができます.
永続的な機能は、管理APIのセットを公開しますHTTP and language-specific SDK APIs . しかし、この種の可視化を行うための組み込みツールはありません3rd party tools are available ). モニタリングに関しては、耐久性のある機能は詳細なテレメトリをApplication Insights , これは非常に強力ですが、アラート、可視化などを作成するための独自の学習曲線を持っていますhere .

無セル対VMS
この点で、あなたは永続的な機能とApache気流が潜在的にあなたのニーズを満たすことができると思っているならば、考慮するもう一つの重要な違いはサポートされたホスティング環境の範囲です.永続的な機能は、それが完全にServerlessな環境で走ることができる点で重要な利点を持ちますAzure Functions ). これはサーバやVMSが設定されていない、設定するデータベースがない、スケールアウトは自動で弾力性があり、仕事が行われているときにのみ支払うことを意味します.これは非常に軽い作業負荷を持っているときに頻繁に月あたりにペニーに変換されます.
他方、Apache気流は他の雲で利用可能な提供を管理しましたAstronomer.io , Google Cloud Composer , and Amazon Managed Workflows for Apache Airflow (MWAA) . これらの管理された提供は自動的なスケーリングと基盤の管理を提供します、しかし、あなたはまだ毎時VM課金モデルで残ります.書き込みの現在の時点で、これらの雲の最も安い構成は、あなたが実行する方法の多くのワークフローに関係なく、毎月100ドルと400ドルの間でかかります.

結論
Apache Airflowを検討するときに到着した最も重要な結論は、静的なデータ処理パイプラインのために設計され、最適化されることである.あなたがステップと従属性の既知のセットでETLパイプラインを構築する必要があるならば、AirFlowコミュニティによってつくられるいろいろなビルトイン・ツールと広範囲にわたるプラグインのために、気流は大きなオプションであるかもしれません.
しかし、ワークフロープリミティブとシナリオのより広い範囲をサポートするプラットフォームを探している場合、コードの最初のオーケストレーションが提供する柔軟性を必要とする場合は、永続的な関数のようなものをより適切にすることができます.