Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

[Multi-provider] Gaps identified relative to js-sdk reference implementation

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

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
25/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
backend

调研方向

从 #511 中的 Python MultiProvider 实现开始,检查其事件处理、get_provider_hooks()、FirstMatchStrategy 以及 run_mode 的求值路径。将每个差距与所链接的 js-sdk、go-sdk 和 dotnet-sdk 参考进行比较。完成的标准是实现并测试所指定的状态、钩子、策略、比较和并行求值行为,同时将跟踪留待 #374 之后处理。

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

描述

multi-provider

Context

We conducted a cross-SDK comparison of all MultiProvider implementations using the js-sdk as the reference. The Python MultiProvider was implemented in #511 and is functional for basic use cases, but we identified several gaps relative to the reference implementation. Some of these were noted as future work in the original PR.

Note: Tracking forwarding is blocked by SDK-level tracking support (#374).

Gaps

1. Event aggregation and status tracking (High)

The MultiProvider passes child provider events through directly via attach/detach with no aggregation. If one child emits PROVIDER_ERROR while another is READY, both events propagate independently. There is no composite status, so consumers cannot determine the overall health of the MultiProvider.

Expected behavior:

  • Maintain a per-provider status map
  • Compute an aggregate status using "worst-wins" precedence: FATAL > NOT_READY > ERROR > STALE > READY
  • Only emit an event when the aggregate status actually changes (deduplication)
  • Always forward PROVIDER_CONFIGURATION_CHANGED events as a pass-through

Reference: js-sdk status-tracker.ts, dotnet-sdk HandleProviderEventAsync / DetermineAggregateStatus

2. Per-provider hook isolation during evaluation (High)

Hooks are aggregated into a flat list via get_provider_hooks(), meaning ALL child provider hooks run for ALL evaluations regardless of which provider actually evaluated the flag. The js-sdk reference runs each provider's hooks only during that provider's evaluation, with an isolated context copy to prevent cross-provider mutation.

Expected behavior:

  • Run each child provider's hooks only when that specific provider is being evaluated
  • Isolate hook context per-provider to prevent cross-provider mutation
  • Execute the full before/after/error/finally lifecycle per-provider

Reference: js-sdk hook-executor.ts, go-sdk isolation.go, dotnet-sdk ProviderExtensions.EvaluateAsync

3. FirstMatchStrategy semantics (Medium)

The current FirstMatchStrategy.should_use_result() accepts any result where reason != Reason.ERROR. It does not distinguish FLAG_NOT_FOUND from other error types. The js-sdk reference treats FLAG_NOT_FOUND as "skip to next provider" but halts on any other error.

Expected behavior:

  • FLAG_NOT_FOUND should cause fallthrough to the next provider
  • Any other error (e.g. PARSE_ERROR, GENERAL) should halt evaluation and surface that error
  • A successful result should be returned immediately

Reference: js-sdk strategies/first-match-strategy.ts

4. Add FirstSuccessfulStrategy (Medium)

Only FirstMatchStrategy exists. There is no FirstSuccessfulStrategy, which is more resilient by skipping all errors (including non-FLAG_NOT_FOUND errors) and continuing to the next provider.

Expected behavior:

  • Return the first completely successful result (no error at all)
  • Skip any provider that returns an error or throws, regardless of error type
  • If all providers fail, collect and report all errors

Reference: js-sdk strategies/first-successful-strategy.ts

5. Add ComparisonStrategy (Medium)

There is no ComparisonStrategy for evaluating all providers and comparing results (useful for migration validation and consistency checks).

Expected behavior:

  • Evaluate all providers (ideally in parallel)
  • If all providers agree on the value, return it
  • If providers disagree, call an optional onMismatch callback and return the designated fallback provider's result
  • If any provider errors, collect and report all errors
  • Constructor accepts a fallbackProvider and optional onMismatch callback

Reference: js-sdk comparison-strategy.ts, go-sdk comparison_strategy.go, dotnet-sdk ComparisonStrategy.cs

6. True parallel evaluation (Low)

The run_mode="parallel" option currently executes providers sequentially in a for-loop despite the name. The only difference from "sequential" is the lack of early exit. The docstring acknowledges this as a planned future enhancement.

Expected behavior:

  • When run_mode="parallel", evaluate all providers concurrently (e.g. via asyncio.gather or ThreadPoolExecutor)
  • Collect all results, then let the strategy determine the final result

Reference: js-sdk parallel evaluation in flagResolutionProxy

Blocked / Deferred

  • Tracking forwarding: Requires SDK-level tracking support first (#374)

Related Issues

  • #511 — Original multi-provider implementation
  • #374 — Implement tracking in Python

Spec Reference

https://openfeature.dev/specification/appendix-a/#multi-provider

主要语言
Python
星标
111
派生
44
平均合并
2 小时 37 分钟
30 天内合并 PR
14

贡献指南

打开贡献指南

从这里开始

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

open-feature/python-sdk 的其他 Issue

查看 open-feature/python-sdk 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

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