azaharizaman/nexus-idempotency 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

azaharizaman/nexus-idempotency

最新稳定版本:v0.1.0-alpha1

Composer 安装命令:

composer require azaharizaman/nexus-idempotency

包简介

Domain-level idempotency: command deduplication and replay-safe results (Layer 1).

README 文档

README

Overview

Nexus\Idempotency is a Layer 1 package for command-level idempotency: deduplicate mutating operations using a tenant-scoped composite key (tenantId, operationRef, clientKey) plus a request fingerprint, and replay a stored opaque result for safe retries.

It does not implement HTTP, databases, outbox, event streams, or audit trails—see REQUIREMENTS.md for boundaries.

Architecture

  • Layer 1: pure PHP 8.3+, framework-agnostic
  • Explicit lifecycle: begin() → domain work → complete() or fail()
  • Persistence via IdempotencyStoreInterface (composite of IdempotencyQueryInterface + IdempotencyPersistInterface; e.g. InMemoryIdempotencyStore for tests — uses JSON-encoded tuple keys json_encode([tenantId, operationRef, clientKey]) so segments cannot collide across delimiter characters)
  • Time via IdempotencyClockInterface (SystemClock returns UTC DateTimeImmutable, or test doubles)

Key interfaces

  • Nexus\Idempotency\Contracts\IdempotencyServiceInterface
  • Nexus\Idempotency\Contracts\IdempotencyStoreInterface (extends query + persist ports)
  • Nexus\Idempotency\Contracts\IdempotencyClockInterface

Installation

From monorepo root:

composer dump-autoload
vendor/bin/phpunit -c packages/Idempotency/phpunit.xml

Usage (conceptual)

$service = new IdempotencyService($store, $store, $clock, IdempotencyPolicy::default());

$decision = $service->begin($tenantId, $operationRef, $clientKey, $fingerprint);

if ($decision->outcome === BeginOutcome::Replay) {
    return $decision->replayResult; // replay cached outcome
}

if ($decision->outcome === BeginOutcome::InProgress) {
    // Another in-flight execution for the same key + fingerprint; surface 409 + Retry-After in Layer 3.
    return;
}

// BeginOutcome::FirstExecution — run domain command, then complete using the attempt bound to this reservation:
$service->complete(
    $tenantId,
    $operationRef,
    $clientKey,
    $fingerprint,
    $decision->record->attemptToken,
    new ResultEnvelope($json),
);

complete() / fail() require the AttemptToken from the FirstExecution record for that attempt so completions cannot attach to a superseded reservation after TTL expiry/replace.

License

MIT

统计信息

  • 总下载量: 2
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 11
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-05-04

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固