[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-24-kontextpropagierung-async-rust":3},{"article":4,"author":51},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":31,"related_articles":32},"d7000000-0000-0000-0000-000000000124","a0000000-0000-0000-0000-000000000076","Deep EVM #24: Kontextpropagierung in async Rust — Deadlines, Abbruch und Tracing","deep-evm-24-kontextpropagierung-async-rust","Go-aehnliche Kontextpropagierung in async Rust implementieren: Deadlines, Abbruch-Token und Tracing-Span-Propagierung ueber asynchrone Grenzen hinweg.","## Das fehlende Stueck: context.Context fuer Rust\n\nGo hat context.Context fuer das Weiterreichen von Deadlines, Abbruchsignalen und Metadaten ueber API-Grenzen hinweg. Rust hat kein eingebautes Aequivalent. Dieser Artikel baut einen einheitlichen Kontexttyp fuer async Rust mit Deadline-bewussten Operationen, hierarchischem Abbruch und Tracing-Span-Propagierung.\n\n## CancellationToken\n\ntokio_util bietet CancellationToken fuer kooperativen Abbruch:\n\n```rust\nuse tokio_util::sync::CancellationToken;\n\nlet token = CancellationToken::new();\nlet child_token = token.child_token();\n\n\u002F\u002F Aufgabe mit Abbruchunterstuetzung\ntokio::spawn(async move {\n    tokio::select! {\n        result = do_work() => {\n            println!(\"Arbeit abgeschlossen: {:?}\", result);\n        }\n        _ = child_token.cancelled() => {\n            println!(\"Abgebrochen!\");\n        }\n    }\n});\n\n\u002F\u002F Spaeter: Alles abbrechen\ntoken.cancel();\n```\n\n## Deadline-bewusste Operationen\n\n```rust\nuse tokio::time::{timeout, Duration};\n\nstruct Context {\n    cancel: CancellationToken,\n    deadline: Option\u003CInstant>,\n    span: tracing::Span,\n}\n\nimpl Context {\n    fn with_timeout(parent: &Context, duration: Duration) -> Self {\n        let deadline = Instant::now() + duration;\n        Self {\n            cancel: parent.cancel.child_token(),\n            deadline: Some(deadline),\n            span: parent.span.clone(),\n        }\n    }\n    \n    async fn run\u003CF, T>(&self, future: F) -> Result\u003CT, ContextError>\n    where\n        F: Future\u003COutput = T>,\n    {\n        let _guard = self.span.enter();\n        \n        tokio::select! {\n            result = future => Ok(result),\n            _ = self.cancel.cancelled() => Err(ContextError::Cancelled),\n            _ = self.sleep_until_deadline() => Err(ContextError::DeadlineExceeded),\n        }\n    }\n}\n```\n\n## Tracing-Span-Propagierung\n\n```rust\nuse tracing::{instrument, Span};\n\n#[instrument(parent = &ctx.span, skip(ctx, db))]\nasync fn process_block(\n    ctx: &Context,\n    db: &Database,\n    block: &Block,\n) -> Result\u003C(), Error> {\n    let span = tracing::info_span!(\"process_transactions\",\n        count = block.transactions.len());\n    \n    for tx in &block.transactions {\n        let tx_ctx = Context::with_timeout(ctx, Duration::from_secs(5));\n        tx_ctx.run(process_transaction(db, tx)).await??;\n    }\n    \n    Ok(())\n}\n```\n\n## Hierarchischer Abbruch\n\nDas Schoene an CancellationToken: Kind-Token werden automatisch abgebrochen, wenn der Eltern-Token abgebrochen wird:\n\n```\nRoot Token\n  |- Block-Verarbeitung Token\n  |    |- Transaktion 1 Token\n  |    |- Transaktion 2 Token\n  |- API-Server Token\n       |- Request 1 Token\n       |- Request 2 Token\n```\n\nWenn der Root-Token abgebrochen wird (z.B. SIGTERM), werden alle Kind-Aufgaben sauber heruntergefahren.\n\n## Fazit\n\nKontextpropagierung in async Rust erfordert etwas mehr Aufwand als in Go, aber CancellationToken, tokio::select! und Tracing-Spans bieten alle Bausteine. Der Schluessel: Definieren Sie einen einheitlichen Context-Typ und verwenden Sie ihn konsistent durch Ihre gesamte Anwendung.","\u003Ch2 id=\"das-fehlende-stueck-context-context-fuer-rust\">Das fehlende Stueck: context.Context fuer Rust\u003C\u002Fh2>\n\u003Cp>Go hat context.Context fuer das Weiterreichen von Deadlines, Abbruchsignalen und Metadaten ueber API-Grenzen hinweg. Rust hat kein eingebautes Aequivalent. Dieser Artikel baut einen einheitlichen Kontexttyp fuer async Rust mit Deadline-bewussten Operationen, hierarchischem Abbruch und Tracing-Span-Propagierung.\u003C\u002Fp>\n\u003Ch2 id=\"cancellationtoken\">CancellationToken\u003C\u002Fh2>\n\u003Cp>tokio_util bietet CancellationToken fuer kooperativen Abbruch:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio_util::sync::CancellationToken;\n\nlet token = CancellationToken::new();\nlet child_token = token.child_token();\n\n\u002F\u002F Aufgabe mit Abbruchunterstuetzung\ntokio::spawn(async move {\n    tokio::select! {\n        result = do_work() =&gt; {\n            println!(\"Arbeit abgeschlossen: {:?}\", result);\n        }\n        _ = child_token.cancelled() =&gt; {\n            println!(\"Abgebrochen!\");\n        }\n    }\n});\n\n\u002F\u002F Spaeter: Alles abbrechen\ntoken.cancel();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"deadline-bewusste-operationen\">Deadline-bewusste Operationen\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::time::{timeout, Duration};\n\nstruct Context {\n    cancel: CancellationToken,\n    deadline: Option&lt;Instant&gt;,\n    span: tracing::Span,\n}\n\nimpl Context {\n    fn with_timeout(parent: &amp;Context, duration: Duration) -&gt; Self {\n        let deadline = Instant::now() + duration;\n        Self {\n            cancel: parent.cancel.child_token(),\n            deadline: Some(deadline),\n            span: parent.span.clone(),\n        }\n    }\n    \n    async fn run&lt;F, T&gt;(&amp;self, future: F) -&gt; Result&lt;T, ContextError&gt;\n    where\n        F: Future&lt;Output = T&gt;,\n    {\n        let _guard = self.span.enter();\n        \n        tokio::select! {\n            result = future =&gt; Ok(result),\n            _ = self.cancel.cancelled() =&gt; Err(ContextError::Cancelled),\n            _ = self.sleep_until_deadline() =&gt; Err(ContextError::DeadlineExceeded),\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"tracing-span-propagierung\">Tracing-Span-Propagierung\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tracing::{instrument, Span};\n\n#[instrument(parent = &amp;ctx.span, skip(ctx, db))]\nasync fn process_block(\n    ctx: &amp;Context,\n    db: &amp;Database,\n    block: &amp;Block,\n) -&gt; Result&lt;(), Error&gt; {\n    let span = tracing::info_span!(\"process_transactions\",\n        count = block.transactions.len());\n    \n    for tx in &amp;block.transactions {\n        let tx_ctx = Context::with_timeout(ctx, Duration::from_secs(5));\n        tx_ctx.run(process_transaction(db, tx)).await??;\n    }\n    \n    Ok(())\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"hierarchischer-abbruch\">Hierarchischer Abbruch\u003C\u002Fh2>\n\u003Cp>Das Schoene an CancellationToken: Kind-Token werden automatisch abgebrochen, wenn der Eltern-Token abgebrochen wird:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Root Token\n  |- Block-Verarbeitung Token\n  |    |- Transaktion 1 Token\n  |    |- Transaktion 2 Token\n  |- API-Server Token\n       |- Request 1 Token\n       |- Request 2 Token\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Wenn der Root-Token abgebrochen wird (z.B. SIGTERM), werden alle Kind-Aufgaben sauber heruntergefahren.\u003C\u002Fp>\n\u003Ch2 id=\"fazit\">Fazit\u003C\u002Fh2>\n\u003Cp>Kontextpropagierung in async Rust erfordert etwas mehr Aufwand als in Go, aber CancellationToken, tokio::select! und Tracing-Spans bieten alle Bausteine. Der Schluessel: Definieren Sie einen einheitlichen Context-Typ und verwenden Sie ihn konsistent durch Ihre gesamte Anwendung.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:30.381427Z","Kontextpropagierung in async Rust — Deadlines, Abbruch und Tracing","Go-aehnliche Kontextpropagierung in async Rust mit Deadlines, CancellationToken, tokio::select!-Abbruch und Tracing-Span-Propagierung implementieren.","async Rust Kontextpropagierung",null,"index, follow",[22,27],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","Ingenieurwesen",[33,39,45],{"id":34,"title":35,"slug":36,"excerpt":37,"locale":12,"category_name":31,"published_at":38},"d0000000-0000-0000-0000-000000000680","Warum Bali 2026 zum Impact-Tech-Hub Südostasiens wird","warum-bali-2026-impact-tech-hub-suedostasiens","Bali rangiert auf Platz 16 unter den Startup-Ökosystemen Südostasiens. Mit einer wachsenden Konzentration von Web3-Entwicklern, AI-Nachhaltigkeits-Startups und Eco-Travel-Tech-Unternehmen formt die Insel ihre Nische als Impact-Tech-Hauptstadt der Region.","2026-03-28T10:44:49.720230Z",{"id":40,"title":41,"slug":42,"excerpt":43,"locale":12,"category_name":31,"published_at":44},"d0000000-0000-0000-0000-000000000679","ASEAN-Datenschutz-Flickenteppich: Compliance-Checkliste für Entwickler","asean-datenschutz-flickenteppich-compliance-checkliste-entwickler","Sieben ASEAN-Länder verfügen mittlerweile über umfassende Datenschutzgesetze mit unterschiedlichen Einwilligungsmodellen, Lokalisierungsanforderungen und Sanktionsstrukturen. Eine praktische Compliance-Checkliste für Entwickler.","2026-03-28T10:44:49.715484Z",{"id":46,"title":47,"slug":48,"excerpt":49,"locale":12,"category_name":31,"published_at":50},"d0000000-0000-0000-0000-000000000678","Indonesias 29-Milliarden-Dollar-Digitaltransformation: Chancen für Softwareunternehmen","indonesias-29-milliarden-dollar-digitaltransformation-chancen-softwareunternehmen","Indonesias IT-Dienstleistungsmarkt wird voraussichtlich 2026 29,03 Milliarden Dollar erreichen, gegenüber 24,37 Milliarden im Jahr 2025. Cloud-Infrastruktur, AI, E-Commerce und Rechenzentren treiben das schnellste Wachstum in Südostasien.","2026-03-28T10:44:49.697275Z",{"id":13,"name":52,"slug":53,"bio":54,"photo_url":19,"linkedin":19,"role":55,"created_at":56,"updated_at":56},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]