惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Last Week in AI
Last Week in AI
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
V
Visual Studio Blog
宝玉的分享
宝玉的分享
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园 - 聂微东
S
SegmentFault 最新的问题
博客园 - 司徒正美
罗磊的独立博客
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
小众软件
小众软件
Jina AI
Jina AI

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
GitHub - resilient-rs/resilient: A composable async resil...
yofabr · 2026-05-19 · via Hacker News: Show HN

A composable async resilience toolkit for Rust — retry, timeout, circuit breaker, rate limiting, bulkheads, and fallbacks.

Crates.io docs.rs MIT License


Installation

[dependencies]
resilient = "0.1"
tokio = { version = "1", features = ["time", "macros", "rt-multi-thread"] }

Policies

Policy What it does
Retry Re-run a failed operation with configurable backoff
Timeout Cancel if the operation takes too long
Circuit Breaker Stop calling a broken dependency until it recovers
Rate Limiter Cap how many calls per second reach a downstream
Bulkhead Limit concurrent in-flight calls
Fallback Return a default value when everything else fails

Quick Start

use resilient::pipeline::Pipeline;
use resilient::{RetryPolicy, TimeoutPolicy, BreakerPolicy, RateLimiter};

let pipeline = Pipeline::new()
    .with_retry(RetryPolicy::default().with_max_retries(3))
    .with_timeout(TimeoutPolicy::default().with_timeout_secs(5))
    .with_circuit_breaker(BreakerPolicy::default())
    .with_rate_limiter(RateLimiter::default());

let result: Result<String, Box<dyn std::error::Error + Send + Sync>> = pipeline
    .run(|| async {
        // Your async operation here
        Ok("success".to_string())
    })
    .await;

Individual Policy Usage

Each policy can be used standalone:

Retry

use resilient::RetryPolicy;

let policy = RetryPolicy::default().with_max_retries(3);
let result: Result<String, String> = policy
    .run(|| async { Ok("success".to_string()) })
    .await;

Timeout

use resilient::TimeoutPolicy;
use std::time::Duration;

let policy = TimeoutPolicy::default().with_timeout(Duration::from_secs(2));
let result: Result<String, Box<dyn std::error::Error + Send + Sync>> = policy
    .run(|| async { Ok("success".to_string()) })
    .await;

Circuit Breaker

use resilient::{BreakerPolicy, BreakerResult};

let policy = BreakerPolicy::default().with_failure_threshold(5);
let result: Result<String, BreakerResult<String>> = policy
    .run(|| async { Ok("success".to_string()) })
    .await;

Bulkhead

use resilient::Bulkhead;

let bulkhead = Bulkhead::default().with_max_concurrent(3);
let result: Result<String, String> = bulkhead
    .run(|| async { Ok("success".to_string()) })
    .await;

Rate Limiter

use resilient::RateLimiter;

let limiter = RateLimiter::default().with_capacity(10).with_refill(5);
let result: Result<String, String> = limiter
    .run(|| async { Ok("success".to_string()) })
    .await;

Using Pipeline (Recommended)

The Pipeline composes multiple policies together in the correct order:

use resilient::pipeline::Pipeline;
use resilient::timeout::Builder as TimeoutBuilder;
use resilient::{RetryPolicy, BreakerPolicy, RateLimiter, Bulkhead};

let pipeline = Pipeline::new()
    .with_retry(RetryPolicy::default())
    .with_timeout(TimeoutBuilder::new().with_timeout_secs(5).build())
    .with_circuit_breaker(BreakerPolicy::default())
    .with_rate_limiter(RateLimiter::default())
    .with_bulkhead(Bulkhead::default());

let result = pipeline
    .run(|| async { Ok("result".to_string()) })
    .await;

Note: When using timeout with Pipeline, your error type must implement From<resilient::timeout::TimeoutError>. Use Box<dyn std::error::Error + Send + Sync> or a custom error enum.


Fallback

Provide a fallback when the pipeline fails:

use resilient::pipeline::Pipeline;

let pipeline = Pipeline::default()
    .with_retry(RetryPolicy::default())
    .or_else(|| async { Ok("fallback value".to_string()) });

let result = pipeline
    .run(|| async { Err::<String, _>("error") })
    .await;

assert!(result.is_ok());

Feature Flags

Flag Description
async-closure Enables async closure syntax (nightly only)

License

MIT — see LICENSE.