microsoft / microsoft/durabletask-python

Add Durable Task middleware support

未關閉
#136 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

主要語言
Python
星號
40
分支
33
平均合併
2 天 2 小時
30 天內合併 PR
6

描述

Summary

Track adding SDK-level Durable Task middleware support to the Python SDK, aligned with the .NET reference implementation.

Reference spec: https://github.com/microsoft/durabletask-dotnet/blob/feature/durable-task-middleware/doc/cross-sdk-middleware.md
.NET user guide: https://github.com/microsoft/durabletask-dotnet/blob/feature/durable-task-middleware/doc/durable-task-middleware.md
Motivation: https://github.com/Azure/azure-functions-durable-extension/issues/3054

The spec may shift until the .NET v1 implementation is merged. This issue is intended to track the Python design and implementation work so it can follow the same durable middleware contract with idiomatic API names.

Proposed shape

Names are illustrative, not final API commitments.

@app.orchestration_middleware
async def orchestration_middleware(ctx, next):
    if not ctx.is_replaying:
        ctx.logger.info("starting orchestration", extra={"instance_id": ctx.instance_id})

    await next(ctx)

@app.activity_middleware
async def activity_middleware(ctx, next):
    cached = await cache.try_get(ctx.name, ctx.input)
    if cached is not None:
        ctx.set_result(cached)
        return

    await next(ctx)

Design points to cover

  • Decorator and/or builder registration APIs that are scoped to a worker/app instance.
  • Registration ordering: first registered middleware runs outermost and unwinds last.
  • Dataclass/protocol-style contexts that expose durable task name, instance ID, version/parent/tags where available, input, raw input where available, replay state for orchestrations, features, and result after next.
  • A feature collection using type keys or well-known keys when runtime type identity is not the right Python abstraction.
  • Orchestration middleware determinism guidance for replay, including replay-safe logging and avoiding datetime.now, uuid.uuid4, random, file/network I/O, arbitrary asyncio awaits, and mutable process state.
  • Activity middleware short-circuiting through an explicit set_result API.
  • Host integration pattern for Azure Functions or other hosts to attach invocation context through features instead of durable middleware depending on host middleware internals.

Acceptance criteria

  • Orchestration and activity middleware APIs are exposed at the durable worker/app level.
  • Middleware executes in registration order and unwinds in reverse order.
  • Orchestration middleware must call next(ctx) exactly once when completing successfully; missing or duplicate calls are rejected where feasible.
  • Activity middleware can call next(ctx) once or short-circuit only through ctx.set_result(...); duplicate next is invalid.
  • Host-specific objects can be passed through features without serialization into durable history.
  • Documentation covers replay determinism and the difference between durable middleware and host/Functions middleware.
  • Tests cover registration ordering, context population, feature access, orchestration next-call validation, and activity short-circuiting.
  • No wire protocol or protobuf changes are required.
  • Entity middleware is out of scope for v1.

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

先比較所引用的 .NET cross-SDK middleware specification 和 user guide,然後定位 Python durable worker/app registration entry points。定義 orchestration 和 activity APIs、contexts、feature access、ordering、validation 以及 short-circuit behavior,並新增 acceptance-criteria tests 和 documentation;entity middleware 和 wire changes 不在範圍內。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
backend-api-design, distributed-systems
Issue 類型
功能
難度
5/5
預估耗時
一週以上
活躍度
冷清
描述清晰度
基本清楚
新手友好度
32/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。