[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-21-bunya-qaima-ahdath-rust-namat-hafila-anzima-fawriya":3},{"article":4,"author":55},{"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":35,"related_articles":36},"d9000000-0000-0000-0000-000000000121","a0000000-0000-0000-0000-000000000096","Deep EVM #21: البنية القائمة على الأحداث في Rust — نمط الحافلة للأنظمة الفورية","deep-evm-21-bunya-qaima-ahdath-rust-namat-hafila-anzima-fawriya","بناء نظام أحداث عالي الأداء في Rust: نمط الحافلة (Event Bus)، القنوات غير المتزامنة، فصل المنتجين عن المستهلكين، والتعامل مع الضغط الخلفي.","## لماذا البنية القائمة على الأحداث\n\nفي الأنظمة الفورية عالية الإنتاجية — روبوتات MEV، خوادم API، خطوط معالجة البيانات — يجب أن تكون المكونات مفصولة ومستقلة. البنية القائمة على الأحداث تحقق هذا عبر نمط الحافلة.\n\n## نمط الحافلة (Event Bus)\n\n```rust\nuse tokio::sync::broadcast;\n\n#[derive(Clone, Debug)]\nenum Event {\n    NewBlock(BlockInfo),\n    PendingTx(Transaction),\n    ArbitrageFound(Opportunity),\n    ProfitRealized(U256),\n}\n\nstruct EventBus {\n    sender: broadcast::Sender\u003CEvent>,\n}\n\nimpl EventBus {\n    fn new(capacity: usize) -> Self {\n        let (sender, _) = broadcast::channel(capacity);\n        Self { sender }\n    }\n    \n    fn publish(&self, event: Event) {\n        let _ = self.sender.send(event);\n    }\n    \n    fn subscribe(&self) -> broadcast::Receiver\u003CEvent> {\n        self.sender.subscribe()\n    }\n}\n```\n\n## المنتجون والمستهلكون\n\n```rust\n\u002F\u002F منتج: يراقب الكتل الجديدة\nasync fn block_monitor(provider: &Provider, bus: &EventBus) {\n    let mut stream = provider.subscribe_blocks().await?;\n    while let Some(block) = stream.next().await {\n        bus.publish(Event::NewBlock(block.into()));\n    }\n}\n\n\u002F\u002F مستهلك: يبحث عن فرص مراجحة\nasync fn arb_searcher(bus: &EventBus, graph: &Graph) {\n    let mut rx = bus.subscribe();\n    while let Ok(event) = rx.recv().await {\n        if let Event::NewBlock(block) = event {\n            let opportunities = find_arbitrage(graph, &block).await;\n            for opp in opportunities {\n                bus.publish(Event::ArbitrageFound(opp));\n            }\n        }\n    }\n}\n```\n\n## التعامل مع الضغط الخلفي\n\nعندما يكون المستهلك أبطأ من المنتج:\n\n```rust\nuse tokio::sync::mpsc;\n\n\u002F\u002F قناة محدودة الحجم للضغط الخلفي\nlet (tx, mut rx) = mpsc::channel::\u003CEvent>(1000);\n\n\u002F\u002F المنتج يحاول الإرسال بدون انتظار\nmatch tx.try_send(event) {\n    Ok(()) => {},\n    Err(TrySendError::Full(_)) => {\n        tracing::warn!(\"القناة ممتلئة، تجاهل الحدث\");\n        metrics::counter!(\"events_dropped\").increment(1);\n    },\n    Err(TrySendError::Closed(_)) => break,\n}\n```\n\n## فوائد النمط\n\n1. **الفصل** — المنتجون لا يعرفون المستهلكين\n2. **القابلية للتوسع** — إضافة مستهلكين جدد بدون تغيير المنتجين\n3. **الاختبار** — اختبار كل مكون بشكل مستقل\n4. **المرونة** — تغيير أو إزالة مكونات بدون تأثير\n\n## الخلاصة\n\nالبنية القائمة على الأحداث مع نمط الحافلة تمكّن بناء أنظمة فورية مفصولة وقابلة للتوسع في Rust. المفتاح هو اختيار نوع القناة المناسب (broadcast للتوزيع، mpsc للنقطة لنقطة) والتعامل الصحيح مع الضغط الخلفي.","\u003Ch2 id=\"\">لماذا البنية القائمة على الأحداث\u003C\u002Fh2>\n\u003Cp>في الأنظمة الفورية عالية الإنتاجية — روبوتات MEV، خوادم API، خطوط معالجة البيانات — يجب أن تكون المكونات مفصولة ومستقلة. البنية القائمة على الأحداث تحقق هذا عبر نمط الحافلة.\u003C\u002Fp>\n\u003Ch2 id=\"event-bus\">نمط الحافلة (Event Bus)\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::sync::broadcast;\n\n#[derive(Clone, Debug)]\nenum Event {\n    NewBlock(BlockInfo),\n    PendingTx(Transaction),\n    ArbitrageFound(Opportunity),\n    ProfitRealized(U256),\n}\n\nstruct EventBus {\n    sender: broadcast::Sender&lt;Event&gt;,\n}\n\nimpl EventBus {\n    fn new(capacity: usize) -&gt; Self {\n        let (sender, _) = broadcast::channel(capacity);\n        Self { sender }\n    }\n    \n    fn publish(&amp;self, event: Event) {\n        let _ = self.sender.send(event);\n    }\n    \n    fn subscribe(&amp;self) -&gt; broadcast::Receiver&lt;Event&gt; {\n        self.sender.subscribe()\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">المنتجون والمستهلكون\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F منتج: يراقب الكتل الجديدة\nasync fn block_monitor(provider: &amp;Provider, bus: &amp;EventBus) {\n    let mut stream = provider.subscribe_blocks().await?;\n    while let Some(block) = stream.next().await {\n        bus.publish(Event::NewBlock(block.into()));\n    }\n}\n\n\u002F\u002F مستهلك: يبحث عن فرص مراجحة\nasync fn arb_searcher(bus: &amp;EventBus, graph: &amp;Graph) {\n    let mut rx = bus.subscribe();\n    while let Ok(event) = rx.recv().await {\n        if let Event::NewBlock(block) = event {\n            let opportunities = find_arbitrage(graph, &amp;block).await;\n            for opp in opportunities {\n                bus.publish(Event::ArbitrageFound(opp));\n            }\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">التعامل مع الضغط الخلفي\u003C\u002Fh2>\n\u003Cp>عندما يكون المستهلك أبطأ من المنتج:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::sync::mpsc;\n\n\u002F\u002F قناة محدودة الحجم للضغط الخلفي\nlet (tx, mut rx) = mpsc::channel::&lt;Event&gt;(1000);\n\n\u002F\u002F المنتج يحاول الإرسال بدون انتظار\nmatch tx.try_send(event) {\n    Ok(()) =&gt; {},\n    Err(TrySendError::Full(_)) =&gt; {\n        tracing::warn!(\"القناة ممتلئة، تجاهل الحدث\");\n        metrics::counter!(\"events_dropped\").increment(1);\n    },\n    Err(TrySendError::Closed(_)) =&gt; break,\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">فوائد النمط\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>الفصل\u003C\u002Fstrong> — المنتجون لا يعرفون المستهلكين\u003C\u002Fli>\n\u003Cli>\u003Cstrong>القابلية للتوسع\u003C\u002Fstrong> — إضافة مستهلكين جدد بدون تغيير المنتجين\u003C\u002Fli>\n\u003Cli>\u003Cstrong>الاختبار\u003C\u002Fstrong> — اختبار كل مكون بشكل مستقل\u003C\u002Fli>\n\u003Cli>\u003Cstrong>المرونة\u003C\u002Fstrong> — تغيير أو إزالة مكونات بدون تأثير\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>البنية القائمة على الأحداث مع نمط الحافلة تمكّن بناء أنظمة فورية مفصولة وقابلة للتوسع في Rust. المفتاح هو اختيار نوع القناة المناسب (broadcast للتوزيع، mpsc للنقطة لنقطة) والتعامل الصحيح مع الضغط الخلفي.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.795176Z","البنية القائمة على الأحداث في Rust — نمط الحافلة للأنظمة الفورية","بنية قائمة على الأحداث في Rust: نمط الحافلة، القنوات غير المتزامنة، الضغط الخلفي.","Rust بنية أحداث",null,"index, follow",[22,27,31],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","الهندسة",[37,43,49],{"id":38,"title":39,"slug":40,"excerpt":41,"locale":12,"category_name":35,"published_at":42},"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":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":35,"published_at":48},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":35,"published_at":54},"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":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"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"]