microsoft / microsoft/durabletask-python

[azure-functions-durable] Orchestrator context parameter name is fixed to `context`, blocking access to `func.Context`

未关闭
#171 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Python
星标
40
派生
33
平均合并
2 天 2 小时
30 天内合并 PR
6

描述

Summary

In the azure-functions-durable (V2) package, the parameter that receives the
orchestration context is effectively hardcoded to the name context. As a
consequence:

  • A user-supplied context_name other than "context" on
    @app.orchestration_trigger(...) does not work — the host cannot bind the
    trigger to the generated handle.
  • There is no way for an orchestrator to also receive an
    azure.functions.Context (func.Context) parameter, because the Functions
    host injects func.Context only into a parameter named exactly context
    that is not a trigger binding — and that name is always consumed by the
    orchestrationTrigger binding.

This matches V1 behavior (see "Not a regression" below), so it is not a
regression introduced by V2. Filing this to track it as a potential V2
improvement to be considered after the Functions PR merges and the beta
release ships.

Mechanism / relevant code paths

The Azure Functions host binds a trigger to a function parameter by name,
and it inspects the generated handle (not the user's function).

  1. The trigger binding is registered with name=context_name:

    • azure/durable_functions/decorators/durable_app.py
      orchestration_trigger(context_name, ...) calls
      OrchestrationTrigger(name=context_name, ...).
  2. The generated handle that the host actually indexes hardcodes a parameter
    literally named context:

    • azure/durable_functions/orchestrator.pyOrchestrator.create:
      def handle(context: func.OrchestrationContext) -> str:
          return Orchestrator(fn).handle(context)
      
    • The parameter must be annotated azure.functions.OrchestrationContext
      for the host's orchestrationTrigger binding converter to accept it.
  3. Because the host matches the binding name (context_name) to a parameter
    of handle by name, they only line up when context_name == "context".
    Any other context_name leaves the trigger unbound.

  4. func.Context injection: the Python worker injects func.Context only into
    a parameter named exactly context that is not itself a trigger binding.
    Since the orchestrationTrigger always occupies the context name, there is
    no free context parameter for func.Context to be injected into.

  5. Separately, durabletask's executor invokes the user's orchestrator as
    fn(ctx, input) — there is no slot in that calling convention for a
    func.Context object to be passed through to user code.

Not a regression (V1 parity)

V1 has the same structural constraint. In
azure-functions-durable-python's azure/durable_functions/orchestrator.py,
Orchestrator.create also registers a single-parameter
def handle(context: func.OrchestrationContext), so a V1 orchestrator could
never receive a working func.Context parameter either. V2 preserves this
behavior.

Related parity gap: function_context contents

The V1-compat DurableOrchestrationContext adapter currently exposes an empty
function_context. V1's function_context is not necessarily empty: in
azure/durable_functions/models/DurableOrchestrationContext.py, __init__
consumes a fixed set of named fields (history, instanceId, isReplaying,
parentInstanceId, input, upperSchemaVersion, maximumShortTimerDuration,
longRunningTimerIntervalDuration, upperSchemaVersionNew) and funnels every
remaining field of the orchestration-trigger JSON into
FunctionContext(**kwargs). As of today the WebJobs extension injects at least
one such field — defaultHttpAsyncRequestSleepTimeMillseconds (observed value
30000, the durable-HTTP async polling interval) — so a live V1
function_context carries that value.

V2 receives the orchestration input via a protobuf trigger that does not carry
these arbitrary extra fields, so the compat adapter has no source to populate
function_context from. This is a minor parity gap to consider alongside the
context-name / func.Context work above.

Notes

  • Out of scope for the current parity-focused Functions PR; capturing here so
    it can be picked up as a V2 improvement after the beta release.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 azure/durable_functions/decorators/durable_app.py 和 azure/durable_functions/orchestrator.py 开始,重点查看 orchestration_trigger 和 Orchestrator.create。跟踪生成的 handle 如何建立索引,以及 durabletask 如何调用用户函数;然后检查 V1 兼容适配器及其对 DurableOrchestrationContext 中 function_context 的处理。完成这项工作需要就自定义上下文名称、对 func.Context 的访问以及相关的 function_context 对等性缺口达成一致的 V2 方案。

由索引模型根据 Issue 内容生成。

评估

技术栈
azure, python
领域
backend
Issue 类型
功能
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。