Устойчивая функция Azure с использованием модели программирования Python V2 без вызова Activity_trigger

Мне удалось настроить функцию Azure Durable, и я могу выполнить ее и увидеть активацию триггера http, о чем свидетельствуют файлы журнала. Я также вижу вызов оркестратора_триггера.

Я настроил параметры конфигурации, чтобы включить модель программирования v2:

AzureWebJobsFeatureFlags=EnableWorkerIndexing

По инструкции здесь Вот код

import json
import logging
from typing import Any
import azure.functions as func
import azure.durable_functions as df

myapp = df.Blueprint(http_auth_level=func.AuthLevel.ANONYMOUS)

@myapp.route(route = "synthetic/solar/snapshot")
@myapp.durable_client_input(client_name = "client")
async def http_start(req: func.HttpRequest, client):
    function_name = 'my_orchestrator_function'
    instance_id = await client.start_new(function_name)
    response = client.create_check_status_response(req, instance_id)
    return response

@myapp.orchestration_trigger(context_name = "context")
def my_orchestrator_function(context):
    
    test_act_data = {"testdata": "test"}
    test_serialised_act_data = json.dumps(test_act_data)
    logging.info(f"Activity result: {test_serialised_act_data}")
    test_result = yield context.call_activity("hello_activity", test_serialised_act_data)
    return test_result

@myapp.activity_trigger(input_name = "test_json")
def hello_activity(test_json: str):
    json_activity_data = json.loads(test_json)
    data = json_activity_data["testdata"] 
    logging.info("Hello Test, Executing Activity Trigger")
    return data

Мой хост.json:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

И function_app.py:

import azure.functions as func 

app = func.FunctionApp() 

app.register_functions(myapp) 

Я попытался улучшить ведение журнала. Я пытался пройтись по этапам и сослаться на множество примеров, но на самом деле нет никаких намеков на то, почему Activity_trigger не запускается.

Журнал HTTP-триггеровжурнал оркестратора

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Устойчивая функция Azure с использованием модели программирования Python V2 без вызова Activity_trigger

Для вызова триггера активности устойчивых функций используйте приведенный ниже код:

function_app.py:

import azure.functions as func
import azure.durable_functions as df
import json
import logging

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@myApp.route(route = "orchestrators/{functionName}")
@myApp.durable_client_input(client_name = "client")
async def http_start(req: func.HttpRequest, client):
    function_name = req.route_params.get('functionName')
    instance_id = await client.start_new(function_name)
    response = client.create_check_status_response(req, instance_id)
    return response

@myApp.orchestration_trigger(context_name = "context")
def rith_orchestrator(context):
    
    rith_act_data = {"testdata": "Rithwik"}
    rith_serialised_act_data = json.dumps(rith_act_data)
    logging.info(f"Activity result: {rith_serialised_act_data}")
    rith_result = yield context.call_activity("hello_rithwik", rith_serialised_act_data)
    return rith_result

@myApp.activity_trigger(input_name = "rithjson")
def hello_rithwik(rithjson: str):
    json_activity_data = json.loads(rithjson)
    data = json_activity_data["testdata"] 
    logging.info("Helo Rithwik, Executing Activity Trigger")
    return data

требования.txt

azure-functions
azure-functions-durable

хост.json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

локальные.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=rithwik;AccountKey=pPBW9jWu77Sqp5F+NLWkA==;EndpointSuffix=core.windows.net",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
  }
}

Вызов функции:

В URL-адресе замените имя функции на имя оркестратора, как показано ниже:

http://localhost:7071/api/orchestrators/rith_orchestrator

Выход:

Теперь используйте первый URL statusQueryGetUri. Вы получите сериализованные данные:

Спасибо за ваш ответ. Я просмотрел это внимательно, строчка за строчкой. Единственное отличие, которое я вижу, заключается в том, что вы возвращаете URL-адреса check_status_response в функции httpTrigger. И затем вы используете функцию statusQueryGetUri, чтобы получить статус. Но я предполагаю, что не запрос Uri запускает выполнение Activity_trigger? Пожалуйста подтвердите.

steambun 29.04.2024 07:00

Он вызывает только тогда, когда после сериализации вы получаете вывод как рифвик. Попробуйте использовать мой полный код и изменить его в соответствии с вашими требованиями, поскольку мой правильный. Попробуйте использовать мой, тогда он сработает, могут быть небольшие изменения, которых вы, возможно, не получите.

RithwikBojja 29.04.2024 07:04

Это решило мою проблему, медленно повторно применив мои изменения. Хоть убей, я до сих пор точно не понимаю, в чем была основная причина. Две строки, которые я никогда не добавлял обратно, были: # @myApp.function_name(name = "usage_synthetic_snapshot_post") # @myApp.route(route = "orchestrators/{functionName}",auth_level‌​=func.AuthLevel.ANON‌​YMOUS, методы =["POST"]) Я предполагаю, что один из этих двух был причиной проблемы.

steambun 30.04.2024 10:39

Теперь я попытался изменить имя функции с hello_rithwik на мое собственное имя функции в двух определенных местах, но когда я это делаю, Azure скрывает Activity_trigger. Должно быть что-то, что сохраняется в профиле функции Azure или что-то еще, когда вы просто меняете имя функции. Потому что это должно сработать. Есть идеи, как принудительно обновить обрабатываемую функцию и почему она это сделает? @rithwikbojja

steambun 02.05.2024 11:48

Попробуйте сделать это в коде Vs, а затем повторно разверните его. На самом деле это должно работать, когда имя изменилось, возможно, в вашей среде может быть проблема с кешем.

RithwikBojja 02.05.2024 11:52

Другие вопросы по теме