[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-24-nashr-siyaq-rust-ghayr-mutazamin-mawaid-ilgha-tatabbue":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},"d9000000-0000-0000-0000-000000000124","a0000000-0000-0000-0000-000000000096","Deep EVM #24: نشر السياق في Rust غير المتزامن — المواعيد النهائية والإلغاء والتتبع","deep-evm-24-nashr-siyaq-rust-ghayr-mutazamin-mawaid-ilgha-tatabbue","أنماط نشر السياق في Rust غير المتزامن: المواعيد النهائية مع tokio::time، الإلغاء التعاوني، التتبع الموزع مع tracing.","## السياق في الأنظمة غير المتزامنة\n\nعندما يصل طلب إلى خادمك، يمر عبر عدة مراحل: المعالج، الخدمة، قاعدة البيانات. كيف تنشر معلومات السياق (الموعد النهائي، معرف التتبع، بيانات الاعتماد) عبر هذه المراحل؟\n\n## المواعيد النهائية مع tokio::time\n\n```rust\nuse tokio::time::{timeout, Duration};\n\nasync fn handle_request(req: Request) -> Result\u003CResponse> {\n    \u002F\u002F الموعد النهائي: 5 ثوانٍ لكل العملية\n    timeout(Duration::from_secs(5), async {\n        let data = fetch_from_db(&req).await?;\n        let result = process(data).await?;\n        Ok(Response::new(result))\n    })\n    .await\n    .map_err(|_| Error::Timeout)?\n}\n```\n\n## الإلغاء التعاوني\n\n```rust\nuse tokio_util::sync::CancellationToken;\n\nlet token = CancellationToken::new();\nlet child_token = token.child_token();\n\ntokio::spawn(async move {\n    tokio::select! {\n        _ = child_token.cancelled() => {\n            tracing::info!(\"تم الإلغاء\");\n        }\n        result = do_work() => {\n            \u002F\u002F العمل اكتمل\n        }\n    }\n});\n\n\u002F\u002F إلغاء كل المهام الفرعية\ntoken.cancel();\n```\n\n## التتبع الموزع\n\n```rust\nuse tracing::{instrument, info_span};\n\n#[instrument(skip(pool))]\nasync fn get_article(pool: &PgPool, slug: &str) -> Result\u003CArticle> {\n    let span = info_span!(\"db_query\", table = \"articles\");\n    let _guard = span.enter();\n    \n    sqlx::query_as::\u003C_, Article>(\"SELECT * FROM articles WHERE slug = $1\")\n        .bind(slug)\n        .fetch_one(pool)\n        .await\n        .map_err(Into::into)\n}\n```\n\n## task_local لسياق المهمة\n\n```rust\ntokio::task_local! {\n    static REQUEST_ID: String;\n}\n\nasync fn handle(req: Request) -> Response {\n    let request_id = Uuid::new_v4().to_string();\n    \n    REQUEST_ID.scope(request_id, async {\n        \u002F\u002F كل الكود هنا يمكنه الوصول لـ REQUEST_ID\n        let article = get_article(&pool, &slug).await?;\n        Ok(Response::new(article))\n    }).await\n}\n```\n\n## الخلاصة\n\nنشر السياق في Rust غير المتزامن يعتمد على timeout للمواعيد النهائية، CancellationToken للإلغاء، وtracing للتتبع الموزع. هذه الأنماط ضرورية لبناء خدمات إنتاجية قابلة للمراقبة.","\u003Ch2 id=\"\">السياق في الأنظمة غير المتزامنة\u003C\u002Fh2>\n\u003Cp>عندما يصل طلب إلى خادمك، يمر عبر عدة مراحل: المعالج، الخدمة، قاعدة البيانات. كيف تنشر معلومات السياق (الموعد النهائي، معرف التتبع، بيانات الاعتماد) عبر هذه المراحل؟\u003C\u002Fp>\n\u003Ch2 id=\"tokio-time\">المواعيد النهائية مع tokio::time\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::time::{timeout, Duration};\n\nasync fn handle_request(req: Request) -&gt; Result&lt;Response&gt; {\n    \u002F\u002F الموعد النهائي: 5 ثوانٍ لكل العملية\n    timeout(Duration::from_secs(5), async {\n        let data = fetch_from_db(&amp;req).await?;\n        let result = process(data).await?;\n        Ok(Response::new(result))\n    })\n    .await\n    .map_err(|_| Error::Timeout)?\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">الإلغاء التعاوني\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio_util::sync::CancellationToken;\n\nlet token = CancellationToken::new();\nlet child_token = token.child_token();\n\ntokio::spawn(async move {\n    tokio::select! {\n        _ = child_token.cancelled() =&gt; {\n            tracing::info!(\"تم الإلغاء\");\n        }\n        result = do_work() =&gt; {\n            \u002F\u002F العمل اكتمل\n        }\n    }\n});\n\n\u002F\u002F إلغاء كل المهام الفرعية\ntoken.cancel();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">التتبع الموزع\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tracing::{instrument, info_span};\n\n#[instrument(skip(pool))]\nasync fn get_article(pool: &amp;PgPool, slug: &amp;str) -&gt; Result&lt;Article&gt; {\n    let span = info_span!(\"db_query\", table = \"articles\");\n    let _guard = span.enter();\n    \n    sqlx::query_as::&lt;_, Article&gt;(\"SELECT * FROM articles WHERE slug = $1\")\n        .bind(slug)\n        .fetch_one(pool)\n        .await\n        .map_err(Into::into)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"task-local\">task_local لسياق المهمة\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">tokio::task_local! {\n    static REQUEST_ID: String;\n}\n\nasync fn handle(req: Request) -&gt; Response {\n    let request_id = Uuid::new_v4().to_string();\n    \n    REQUEST_ID.scope(request_id, async {\n        \u002F\u002F كل الكود هنا يمكنه الوصول لـ REQUEST_ID\n        let article = get_article(&amp;pool, &amp;slug).await?;\n        Ok(Response::new(article))\n    }).await\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>نشر السياق في Rust غير المتزامن يعتمد على timeout للمواعيد النهائية، CancellationToken للإلغاء، وtracing للتتبع الموزع. هذه الأنماط ضرورية لبناء خدمات إنتاجية قابلة للمراقبة.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.809071Z","نشر السياق في Rust غير المتزامن — المواعيد النهائية والإلغاء والتتبع","نشر السياق في Rust غير المتزامن: timeout وCancellationToken وtracing الموزع.","Rust غير متزامن سياق",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","الهندسة",[33,39,45],{"id":34,"title":35,"slug":36,"excerpt":37,"locale":12,"category_name":31,"published_at":38},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","2026-03-28T10:44:50.120618Z",{"id":40,"title":41,"slug":42,"excerpt":43,"locale":12,"category_name":31,"published_at":44},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":46,"title":47,"slug":48,"excerpt":49,"locale":12,"category_name":31,"published_at":50},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"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"]