foundatio について
Foundatio は、キャッシュ、キュー、メッセージング、ストレージ、ロック、ジョブを扱う .NET 開発者向けの、差し替え可能なインフラ抽象ライブラリです。インメモリ実装と本番向けバックエンドを備えています。
主な機能
- 01キャッシュ、キュー、メッセージングの抽象化
- 02インメモリと本番向けの実装
- 03ファイルストレージと分散ロック
- 04キュー処理とスケジュールジョブ
- 05リトライとサーキットブレーカーのポリシー
活用シーン
- 01テスト環境と本番環境で実装を切り替える
- 02アプリケーションイベントをキュー処理する
- 03定期的なクリーンアップを実行する
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ exceptionless/ exceptionless --skill foundatioインストール後、Claude Code で/foundatioを入力して読み込まれたか確認します。
詳細
Foundatio
Foundatio は、プラグイン可能なインフラストラクチャ抽象化を提供します。完全なドキュメントについては、context7 MCP を使用してください。
ドキュメント:
context7を使用して、最新の Foundatio API ドキュメントと例を取得してください。
コア抽象化
| インターフェース | 目的 | インメモリ | 本番環境 |
|---|---|---|---|
ICacheClient | 分散キャッシュ | InMemoryCacheClient | Redis |
IQueue<T> | メッセージキューイング | InMemoryQueue<T> | Redis/SQS |
IMessageBus | Pub/Sub メッセージング | InMemoryMessageBus | Redis |
IFileStorage | ファイルストレージ | InMemoryFileStorage | S3/Azure |
ILockProvider | 分散ロック | InMemoryLockProvider | Redis |
IResiliencePolicyProvider | 再試行/サーキットブレーカー | N/A | Polly ベース |
ICacheClient
var result = await _cache.GetAsync<int>(key);
int value = result.HasValue ? result.Value : 0;
await _cache.IncrementAsync(key, count);
await _cache.ListAddAsync(setKey, organizationId);
IQueue<T>
await _queue.EnqueueAsync(new EventPost { OrganizationId = orgId, ProjectId = projectId, FilePath = path });
IMessageBus
// Subscribe
await _subscriber.SubscribeAsync<EntityChanged>(OnEntityChangedAsync, shutdownToken);
// Publish
await _messagePublisher.PublishAsync(new EntityChanged
{
ChangeType = ChangeType.Saved, Type = nameof(Organization), Id = organization.Id
});
ジョブ
QueueJobBase — キュー処理
[Job(Description = "Processes queued events.", InitialDelay = "2s")]
public class EventPostsJob : QueueJobBase<EventPost>
{
public EventPostsJob(IQueue<EventPost> queue, TimeProvider timeProvider,
IResiliencePolicyProvider resiliencePolicyProvider, ILoggerFactory loggerFactory)
: base(queue, timeProvider, resiliencePolicyProvider, loggerFactory)
{
AutoComplete = false;
}
protected override async Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<EventPost> context)
{
var entry = context.QueueEntry;
// Process the event...
await entry.CompleteAsync();
return JobResult.Success;
}
}
IJob — スケジュールされたジョブ
[Job(Description = "Deletes old data.", InitialDelay = "1m", Interval = "1h")]
public class CleanupDataJob : IJob
{
public async Task<JobResult> RunAsync(CancellationToken cancellationToken = default) { ... }
}
ジョブ属性
| 属性 | 目的 | 例 |
|---|---|---|
Description | ジョブの説明 | — |
InitialDelay | 初回実行までの遅延 | "2s" |
Interval | 実行頻度 | "5m" |
IterationLimit | N 回実行後に停止 | 1 |
IsContinuous | 実行を継続 | true |
回復性と信頼性
- 障害を想定する:ネットワーク呼び出しは失敗し、リソースは枯渇し、並行アクセスでは競合が発生します
- あらゆる処理にタイムアウトを設定する:無期限に待機せず、キャンセルトークンを使用してください
- バックオフを伴う再試行:一時的な障害には、ジッターを加えた指数バックオフを使用してください
- 段階的な縮退:適切な場合は、キャッシュデータ、デフォルト値、または部分的な結果を返してください
- 冪等性:安全に再試行できるように操作を設計してください
- リソース制限:メモリ枯渇を防ぐため、キュー、キャッシュ、バッファーに上限を設けてください
キューエントリーでは、再試行するには AbandonAsync() を、完了するには CompleteAsync() を呼び出します。検証エラーは再試行しないでください。成功することはありません。
コメント
Markdown 対応