Mulai cepat: Membuat aplikasi Python Durable Functions

Gunakan Durable Functions, fitur Azure Functions, untuk menulis alur kerja tanpa server stateful di Python. Dalam panduan singkat ini, Anda mengklon dan menjalankan aplikasi contoh yang menunjukkan dua pola orkestrasi umum:

  • Penautan fungsi: Memanggil aktivitas secara berurutan (Tokyo → Seattle → London).
  • Fan-out/fan-in: Memanggil aktivitas secara paralel di lima kota, lalu menggabungkan hasilnya.

Pada akhirnya, Anda akan memiliki kedua orkestrasi yang berjalan secara lokal dengan emulator Durable Task Scheduler dan dapat melihat statusnya di dasbor.

  • Kloning dan siapkan proyek sampel Hello Cities.
  • Siapkan emulator Durable Task Scheduler dan Azurite untuk pengembangan lokal.
  • Jalankan aplikasi fungsi dan picu kedua orkestrasi.
  • Tinjau status orkestrasi dan output di dasbor Durable Task Scheduler.

Prasyarat

Menyiapkan emulator "Durable Task Scheduler"

Emulator Task Scheduler Durable menyediakan lingkungan pengembangan lokal sehingga Anda dapat menguji orkestrasi tanpa langganan Azure. Host Functions juga memerlukan Azurite untuk penyimpanan lokal.

Mulai kedua kontainer:

docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
  mcr.microsoft.com/dts/dts-emulator:latest

docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
  mcr.microsoft.com/azure-storage/azurite

Tip

Setelah emulator berjalan, Anda dapat mengakses dasbor Durable Task Scheduler di http://localhost:8082 untuk memantau orkestrasi.

Jalankan contoh memulai cepat

  1. Navigasikan ke direktori sampel Hello Cities:

    cd samples/durable-functions/python/hello-cities
    
  2. Membuat lingkungan virtual dan menginstal dependensi:

    python -m venv .venv
    .venv\Scripts\activate
    pip install -r requirements.txt
    
  3. Verifikasi bahwa local.settings.json file berisi konfigurasi berikut:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "python",
        "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
      }
    }
    
  4. Mulai aplikasi fungsi:

    func start
    
  5. Di terminal terpisah, jalankan orkestrasi rantai fungsi:

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining
    $response
    

    Respons berisi URL status untuk instans orkestrasi. statusQueryGetUri Salin nilai dan jalankan untuk memeriksa hasilnya:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    
  6. Picu orkestrasi fan-out/fan-in:

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn
    Invoke-RestMethod -Uri $response.statusQueryGetUri
    

Output yang diharapkan

Permintaan POST mengembalikan respons JSON dengan URL status. Contohnya:

{
  "id": "<instanceId>",
  "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
  "sendEventPostUri": "...",
  "terminatePostUri": "...",
  "purgeHistoryDeleteUri": "..."
}

Saat Anda mengkueri statusQueryGetUri dan orkestrasi runtimeStatus adalah Completed, Anda bisa menemukan hasil salam di output bidang . Orkestrasi perangkaian mengembalikan:

{
  "name": "chaining_orchestration",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}

Orkestrasi fan-out/fan-in mengembalikan:

{
  "name": "fan_out_fan_in_orchestration",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}

Tip

Jika runtimeStatus memperlihatkan Running atau Pending, tunggu sebentar dan kueri lagi statusQueryGetUri .

Buka dasbor Durable Task Scheduler di http://localhost:8082 untuk melihat status orkestrasi dan riwayat eksekusi.

Memahami kode

Sampel menggunakan model pemrograman Python v2 dengan dekorator, di mana semua fungsi ditentukan dalam satu file (function_app.py).

Fungsi aktivitas

Aktivitas say_hello ini mengambil nama kota dan menghasilkan salam:

@app.activity_trigger(input_name="city")
def say_hello(city: str) -> str:
    """Activity function that returns a greeting for a city."""
    logging.info(f"Saying hello to {city}.")
    return f"Hello {city}!"

Fungsi orkestrator

orkestrator berantai memanggil say_hello secara berurutan untuk tiga kota:

@app.orchestration_trigger(context_name="context")
def chaining_orchestration(context: df.DurableOrchestrationContext):
    """Function chaining orchestration: calls activities sequentially."""
    result1 = yield context.call_activity("say_hello", "Tokyo")
    result2 = yield context.call_activity("say_hello", "Seattle")
    result3 = yield context.call_activity("say_hello", "London")
    return [result1, result2, result3]

Orkestrator fan-out/fan-in menjadwalkan aktivitas secara paralel:

@app.orchestration_trigger(context_name="context")
def fan_out_fan_in_orchestration(context: df.DurableOrchestrationContext):
    """Fan-out/Fan-in orchestration: calls activities in parallel."""
    cities = ["Tokyo", "Seattle", "London", "Paris", "Berlin"]

    # Fan-out: schedule all activities in parallel
    parallel_tasks = []
    for city in cities:
        task = context.call_activity("say_hello", city)
        parallel_tasks.append(task)

    # Fan-in: wait for all to complete
    results = yield context.task_all(parallel_tasks)
    return results

Fungsi klien

Fungsi klien yang dipicu HTTP memulai setiap orkestrasi. Misalnya, permulaan rantai:

@app.route(route="StartChaining", methods=["POST"])
@app.durable_client_input(client_name="client")
async def start_chaining(req: func.HttpRequest, client) -> func.HttpResponse:
    """HTTP trigger to start the function chaining orchestration."""
    instance_id = await client.start_new("chaining_orchestration")
    logging.info(f"Started chaining orchestration with ID = '{instance_id}'.")
    return client.create_check_status_response(req, instance_id)

Konfigurasi

Sampel menggunakan emulator Durable Task Scheduler sebagai backend penyimpanannya. Ini dikonfigurasi dalam host.json:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Membersihkan sumber daya

Hentikan kontainer emulator setelah Anda selesai:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Untuk menonaktifkan lingkungan virtual Python:

deactivate

Langkah berikutnya