microsoft / microsoft/durabletask-python
[azure-functions-durable] Orchestrator context parameter name is fixed to `context`, blocking access to `func.Context`
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 40
- フォーク
- 33
- 平均マージ
- 2日 2時間
- マージ済み PR(30日)
- 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_nameother 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 injectsfunc.Contextonly into a parameter named exactlycontext
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).
-
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, ...).
-
The generated handle that the host actually indexes hardcodes a parameter
literally namedcontext:azure/durable_functions/orchestrator.py—Orchestrator.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.
-
Because the host matches the binding
name(context_name) to a parameter
ofhandleby name, they only line up whencontext_name == "context".
Any othercontext_nameleaves the trigger unbound. -
func.Contextinjection: the Python worker injectsfunc.Contextonly into
a parameter named exactlycontextthat is not itself a trigger binding.
Since the orchestrationTrigger always occupies thecontextname, there is
no freecontextparameter forfunc.Contextto be injected into. -
Separately, durabletask's executor invokes the user's orchestrator as
fn(ctx, input)— there is no slot in that calling convention for a
func.Contextobject 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.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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