លោក Dave មិនបានឃើញប្រព័ន្ធពន្លឺពន្លឺពន្លឺមុនទេប៉ុន្តែគាត់បានបញ្ចប់គម្រោងសេវាកម្មអតិថិជនដែលមាន "ការទូរស័ព្ទផ្ទាល់ខ្លួនបង្កើនការចូលរួមដោយ 847%!" ដូច្នេះគាត់គិតថា "ការពន្លឺពន្លឺពន្លឺពន្លឺគឺគ្រាន់តែសេវាកម្មអតិថិជនសម្រាប់បរិស្ថានពន្លឺពន្លឺ!" គោលបំណងរបស់គាត់គឺ: "នៅពេលដែលម៉ាករបស់ខ្ញុំទូរស័ព្ទទៅខ្ញុំដោយផ្ទាល់ខ្ញុំមានការឆ្លើយតប។ នៅពេលដែលអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ុយអ៊ ដំណោះស្រាយ 1: ការទាក់ទង Point-to-Point (The Phone Call Fiasco) នៅពេលដែលប្រេងត្រូវបានរកឃើញ, ប្រព័ន្ធនេះបានទូរស័ព្ទទៅក្នុងរថយន្តទាំងអស់នៅក្នុងសណ្ឋាគារ។ កុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុំព្យូទ័រកុ តើធ្វើដូចម្តេចនៅពេលដែលមានអាកាសធាតុប្រេងតូចនៅក្នុងរចនាសម្ព័ន្ធនិងខ្សាច់នៅក្នុងរចនាសម្ព័ន្ធរចនាសម្ព័ន្ធ? ប្រព័ន្ធរបស់លោក Dave បានទូរស័ព្ទទៅកន្លែង 237: "អី, មានខ្សាច់នៅក្នុងរចនាសម្ព័ន្ធ។" បន្ទាប់មកបន្ទាប់មកបន្ទាប់មក: "សួរអ្នក, មានខ្យល់នៅក្នុងហាងហាងហាង។" អតិថិជនមានការជឿទុកចិត្ត - អ្វីដែលមានការជឿទុកចិត្ត? អ្វីដែលបានធ្វើ? សូមចុច ទោះជាយ៉ាងណាក៏ដោយស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស្នាក់នៅស វាគឺជាការទំនាក់ទំនងធម្មតានៅក្នុងតំបន់ - អ្នកផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើផ្ញើ។ សាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យ ដំណោះស្រាយទីពីរ: ការបោះពុម្ពទំនាក់ទំនង (តម្រូវការអ៊ីនធឺណិត) ប៉ុន្តែលោក Dave បានអរគុណពីគោលបំណងរបស់គាត់។ "ខ្ញុំមានគំនិតល្អជាងនេះ!" លោកបានប្រកាស។ លោក Dave បានដំឡើង អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡិចត្រូនិ អេឡ សាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យ វាគឺជាការទំនាក់ទំនងទូរទស្សន៍មួយទៅដល់មនុស្សទាំងអស់, ប្រសិនបើពួកគេចង់វាឬមិន។ វាគឺជាការប្រើប្រាស់ប្រព័ន្ធទូរទស្សន៍ទូរទស្សន៍ជារៀងរាល់ប្រទេសដើម្បីប្រកាសការលក់រថភ្លើងរបស់អ្នក។ ដំណោះស្រាយ 3: Dave Discovers Something Revolutionary ការធ្វើតេស្តទីបីរបស់លោក Dave: "អ្វីប្រសិនបើយើងមានការគាំទ្រផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ្នានៅក្នុងតំបន់ផ្សេងគ សាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យ ហ្វេសប៊ុកអ៊ីនធឺណិត: "Happy hour starting, kitchen closing soon" សាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យសាកលវិទ្យាល័យ Spa Intercom: "ការដោះស្រាយម៉ាស៊ីនបណ្តុះបណ្តាលអាចរកបាន, ការបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះ" សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ អ្នកចូលរួមក្នុងការចូលរួមក្នុងការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេពិតប្រាកដប្រើ។ អ្នកចូលរួមក្នុងការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេមានការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេមានការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេមានការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេមានការជួបប្រជុំគ្នានៅក្នុងតំបន់ដែលពួកគេមានការជួបប្រជុំគ្នានៅក្នុងតំបន់។ អ្វីដែលអ្នកពិតប្រាកដបានបង្កើត: Publish-Subscribe (Pub/Sub) ដោយគ្មានការយល់ដឹងនេះលោក Dave បានបង្កើត - ជាផ្នែកមួយនៃគំរូសំខាន់បំផុតនៅក្នុងការរចនាសម្ព័ន្ធកម្មវិធីទំនើប។ publish-subscribe system នេះជារបៀបដែលវាធ្វើការ: អ្នកផ្គត់ផ្គង់ (បុគ្គលិកសណ្ឋាគារ) អនុញ្ញាតឱ្យអ្នកផ្គត់ផ្គង់សេចក្តីអធិប្បាយទៅនឹងតំបន់បណ្ដាញឬប្រព័ន្ធផ្សព្វផ្សាយពិសេស (ទូទាត់ទូទាត់សណ្ឋាគារទូទាត់សណ្ឋាគារទូទាត់សេចក្តីអធិប្បាយសណ្ឋាគារ ល។) អ្នកចូលរួមបញ្ចូល (អ្នកចូលរួម) ជ្រើសរើសតម្រូវការដែលពួកគេចង់មើល អ្នកផ្គត់ផ្គង់មិនដឹងថាតើអ្នកផ្គត់ផ្គង់មិនដឹងថាតើអ្នកផ្គត់ផ្គង់មិនដឹងថាតើអ្នកផ្គត់ផ្គង់មិនដឹងថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ថាតើអ្នកផ្គត់ផ្គង់ វាគឺជាការទំនាក់ទំនង N × M: អ្នកបោះពុម្ពជាច្រើនអាចផ្ញើទៅដល់អ្នកគាំទ្រជាច្រើនទេប៉ុន្តែវាគឺជាការរចនាឡើងនិងរចនាសម្ព័ន្ធ។ មិនមានលក្ខណៈសម្បត្តិបន្ថែមទៀត, មិនមានសេចក្តីអធិប្បាយបន្ថែមទៀត, មិនមានសេចក្តីអធិប្បាយបន្ថែមទៀត, មិនមានសេចក្តីអធិប្បាយបន្ថែមទៀតក្នុងការទូរស័ព្ទទាំងអស់។ ហេតុអ្វីវាជាការសំខាន់សម្រាប់កូដរបស់អ្នក លោក Dave បានរចនាឡើងដោយគ្មានគោលបំណងគ្នានៃគំរូប្រព័ន្ធផ្សព្វផ្សាយជាមូលដ្ឋានបី: ការផ្លាស់ប្តូរប្រព័ន្ធផ្សព្វផ្សាយ: មិនមានការផ្លាស់ប្តូរប្រព័ន្ធផ្សព្វផ្សាយនៅពេលដែលអ្នកត្រូវការបញ្ជាក់ប្រព័ន្ធផ្សព្វផ្សាយជាច្រើន។ Point-to-Point មួយសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តីសេចក្តី។ Broadcast : អ្នកបោះពុម្ពផ្ញើអត្ថបទទៅនឹងតម្រូវការ / តម្រូវការ, អ្នកចូលរួមជ្រើសរើសអ្វីដើម្បីអាន។ ទំហំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលំទូលាយ។ Pub/Sub ក្នុងប្រព័ន្ធពិតប្រាកដ pub/sub បានដោះស្រាយបញ្ហាដូចគ្នានៅលើ Dave: អេឡិចត្រូនិ: ការបច្ចុប្បន្នភាពសម្ភារៈផ្គត់ផ្គង់ចូលទៅក្នុងសេវាកម្មជាច្រើន (ការណែនាំ, ការវិភាគ, ការអនុម័ត) ដោយគ្មានសេវាកម្មសម្ភារៈផ្គត់ផ្គង់ដឹងថានៅពេលដែលអ្នកកំពុងត្រួតពិនិត្យ ប្រព័ន្ធ ប្រព័ន្ធ ប្រតិបត្តិការ ទូរស័ព្ទ: ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ ទូរស័ព្ទ microservices: សេវាកម្មផ្តល់ជូននូវព្រឹត្តិការណ៍ (អ្នកប្រើបានចុះឈ្មោះ, ការបញ្ចប់ការបញ្ជា) ដែលសេវាកម្មផ្សេងទៀតអាចផ្លាស់ប្តូរដោយខ្លួនឯង Building Your Own Pub/Sub System (វាជាការងាយស្រួលជាងអ្នកគិត) សូមបង្កើតប្រព័ន្ធគុណភាពផលិតកម្មដែលលោក Dave នឹងមានអារម្មណ៍: from collections import defaultdict from typing import Dict, List, Callable class HotelPubSub: def __init__(self): self.channels: Dict[str, List[Callable]] = defaultdict(list) def subscribe(self, channel: str, callback: Callable): """Guest subscribes to hotel updates""" self.channels[channel].append(callback) print(f"Subscribed to {channel}") def publish(self, channel: str, message: str): """Hotel staff publishes updates""" if channel in self.channels: for callback in self.channels[channel]: callback(message) print(f"Published to {channel}: {message}") # Dave's hotel in action hotel = HotelPubSub() # Guests subscribe to what they care about def pool_guest(msg): print(f"🏊 Pool Guest: {msg}") def restaurant_guest(msg): print(f"🍽️ Restaurant Guest: {msg}") hotel.subscribe("pool", pool_guest) hotel.subscribe("restaurant", restaurant_guest) # Hotel publishes updates hotel.publish("pool", "Pool closing in 10 minutes!") hotel.publish("restaurant", "Happy hour starts now!") វាគឺជាការ! ប្រព័ន្ធ pub / sub ដែលធ្វើការនៅក្នុង 20 ដំណឹង. ការបង្កើនប្រសិទ្ធិភាពជាមួយ Async Queues ប៉ុន្តែប្រសិនបើសណ្ឋាគាររបស់លោក Dave បានទទួលបានអារម្មណ៍អស្ចារ្យ? កំណែប្រសើរឡើងរបស់យើងបង្វិលអ្នកបោះពុម្ពនៅពេលដែលអ្នកចុះឈ្មោះគឺជារៀងរាល់។ សូមបន្ថែមការកំណត់រថភ្លើង: import asyncio from asyncio import Queue from collections import defaultdict class AsyncPubSub: def __init__(self): self.channels = defaultdict(list) self.message_queue = Queue() # Start background worker asyncio.create_task(self._worker()) def subscribe(self, channel: str, callback): self.channels[channel].append(callback) async def publish(self, channel: str, message: str): # Non-blocking publish - just queue it await self.message_queue.put((channel, message)) async def _worker(self): # Background worker processes messages while True: channel, message = await self.message_queue.get() if channel in self.channels: # Run all subscribers in parallel tasks = [callback(message) for callback in self.channels[channel]] await asyncio.gather(*tasks, return_exceptions=True) # Dave's async hotel in action async def demo(): hotel = AsyncPubSub() # Fast and slow subscribers async def fast_guest(msg): await asyncio.sleep(0.1) # Quick processing print(f"🏊 Fast: {msg}") async def slow_guest(msg): await asyncio.sleep(2.5) # Simulate slow database write print(f"🍽️ Slow: {msg}") hotel.subscribe("updates", fast_guest) hotel.subscribe("updates", slow_guest) # Publishers don't wait for slow subscribers await hotel.publish("updates", "Pool closing!") await hotel.publish("updates", "Happy hour!") await asyncio.sleep(0.2) # Let everything finish # asyncio.run(demo()) ឥឡូវនេះអ្នកបោះពុម្ពមិនមែនកាត់បន្ថយទិន្នន័យទេ - ពួកគេគ្រាន់តែកាត់បន្ថយទិន្នន័យនិងរក្សាទុកការធ្វើដំណើរ។ អ្នកធ្វើដំណើរបន្ទាប់ដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដំណើរដ ការ hack ការអនុវត្តងាយស្រួល: uvloop ប្រព័ន្ធ async របស់លោក Dave បានធ្វើការល្អឥតខ្ចោះទេប៉ុន្តែបន្ទាប់មកលោកបានរកឃើញអ្វីដែលជាការច្នៃប្រឌិត: ការផ្លាស់ប្តូរកូដមួយអាចធ្វើឱ្យអ្វីគ្រប់យ៉ាងយ៉ាងឆាប់រហ័ស 2-4x ។ លោក Dave បាននិយាយថាវាជាការល្អឥតខ្ចោះសម្រាប់ការពិតទេប៉ុន្តែគាត់ចង់ធ្វើការប៉ុណ្ណោះ។ ការចូល - ការផ្លាស់ប្តូរ Drop-in សម្រាប់ប្រព័ន្ធប្រតិបត្តិការ Python ដែលត្រូវបានសរសេរនៅក្នុង Cython និងមានមូលដ្ឋានលើ libuv (អ្វីដែលធ្វើឱ្យ Node.js លឿនលឿន) ។ uvloop import uvloop import asyncio from collections import defaultdict import time # The magic line that makes Dave's hotel 2-4x faster asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) class TurboHotelPubSub: def __init__(self, max_queue_size=10000): self.channels = defaultdict(list) self.message_queue = asyncio.Queue(maxsize=max_queue_size) self.running = True self.performance_metrics = { 'messages_per_second': 0, 'avg_latency_ms': 0, 'active_subscribers': 0 } # Start background worker and metrics collector asyncio.create_task(self._worker()) asyncio.create_task(self._metrics_collector()) def subscribe(self, channel: str, callback): self.channels[channel].append(callback) self.performance_metrics['active_subscribers'] = sum(len(subs) for subs in self.channels.values()) print(f"Subscribed to {channel} (Total subscribers: {self.performance_metrics['active_subscribers']})") async def publish(self, channel: str, message: str): timestamp = time.time() message_with_timestamp = (channel, message, timestamp) try: self.message_queue.put_nowait(message_with_timestamp) except asyncio.QueueFull: # Backpressure - with uvloop, this is much faster await self.message_queue.put(message_with_timestamp) async def _worker(self): """Background worker - uvloop makes this significantly faster""" while self.running: channel, message, publish_time = await self.message_queue.get() # Measure end-to-end latency processing_start = time.time() if channel in self.channels: # uvloop excels at handling many concurrent tasks tasks = [] for callback in self.channels[channel]: if asyncio.iscoroutinefunction(callback): tasks.append(callback(message)) else: # uvloop's thread pool is much more efficient tasks.append(asyncio.get_event_loop().run_in_executor(None, callback, message)) # uvloop's gather is optimized for many concurrent operations await asyncio.gather(*tasks, return_exceptions=True) # Track latency total_latency = (time.time() - publish_time) * 1000 # Convert to ms self.performance_metrics['avg_latency_ms'] = ( self.performance_metrics['avg_latency_ms'] * 0.9 + total_latency * 0.1 ) self.message_queue.task_done() async def _metrics_collector(self): """Track messages per second - uvloop's timer precision helps here""" last_time = time.time() last_count = 0 while self.running: await asyncio.sleep(1) current_time = time.time() # In uvloop, queue.qsize() is more accurate and faster current_count = getattr(self.message_queue, '_finished', 0) if current_time - last_time >= 1: messages_processed = current_count - last_count self.performance_metrics['messages_per_second'] = messages_processed last_time, last_count = current_time, current_count def get_performance_stats(self): return self.performance_metrics.copy() # Dave's hotel with uvloop superpowers async def benchmark_uvloop_vs_standard(): """Demonstrate uvloop performance improvements""" # Simulate I/O-heavy subscribers (database writes, API calls) async def database_subscriber(msg): # Simulate database write await asyncio.sleep(0.001) # 1ms "database" call return f"DB: {msg}" async def api_subscriber(msg): # Simulate API call await asyncio.sleep(0.002) # 2ms "API" call return f"API: {msg}" def analytics_subscriber(msg): # Simulate CPU-heavy sync work time.sleep(0.0005) # 0.5ms CPU work return f"Analytics: {msg}" hotel = TurboHotelPubSub() # Subscribe multiple handlers to same channel for i in range(10): # 10 database subscribers hotel.subscribe("orders", database_subscriber) for i in range(5): # 5 API subscribers hotel.subscribe("orders", api_subscriber) for i in range(20): # 20 analytics subscribers hotel.subscribe("orders", analytics_subscriber) print("Starting benchmark with uvloop...") start_time = time.time() # Publish lots of messages for i in range(1000): await hotel.publish("orders", f"Order #{i}") # Wait for processing to complete await hotel.message_queue.join() end_time = time.time() stats = hotel.get_performance_stats() print(f"Benchmark complete in {end_time - start_time:.2f} seconds") print(f"Performance stats: {stats}") print(f"Total subscriber callbacks: {stats['active_subscribers'] * 1000:,}") return end_time - start_time # Uncomment to run benchmark # asyncio.run(benchmark_uvloop_vs_standard()) What uvloop supercharges: 1. I/O-Heavy Subscribers (2-4x speedup) ការសរសេរទិន្នន័យ, ការសរសេរ API, ការប្រតិបត្តិការឯកសារ ការដោះស្រាយដែលមានមូលដ្ឋានលើ libuv នៃ uvloop អាចដោះស្រាយប្រតិបត្តិការ I/O ដំបូងជាច្រើនប្រសើរជាងមុន សណ្ឋាគាររបស់លោក Dave ឥឡូវនេះអាចគ្រប់គ្រងការផ្ទុកទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យ 2. Many Concurrent Subscribers (1.5-2x speedup) ប្រព័ន្ធដែលមានក្រុមហ៊ុនផ្គត់ផ្គង់ចំនួន 100 ឬ 1000 ក្នុងមួយប្រព័ន្ធ ការធ្វើតេស្តការធ្វើតេស្តដែលមានប្រសិទ្ធិភាពបំផុតរបស់ uvloop បានកាត់បន្ថយការបញ្ជាទម្ងន់ ជាការល្អឥតខ្ចោះសម្រាប់មជ្ឈមណ្ឌលប្រព័ន្ធប្រតិបត្តិការរបស់ Dave ជាមួយនឹង 500+ អ្នកអនុម័តការអនុម័តប្រព័ន្ធប្រតិបត្តិការ 3. Thread Pool Operations (30-50% improvement) ការបញ្ចូល Callbacks ដែលបានផ្លាស់ប្តូរទៅ Thread Pools ការគ្រប់គ្រងបំពង់បំពង់របស់ uvloop គឺមានប្រសិទ្ធិភាពជាងមុន ល្អបំផុតសម្រាប់ប្រព័ន្ធប្រវត្តិសាស្រ្តរបស់ Dave ដែលមិនអាចត្រូវបានធ្វើ async 4. Timer and Queue Precision ពេលវេលាត្រឹមត្រូវបំផុតសម្រាប់ម៉ែត្រនិងការកាត់បន្ថយតម្លៃ ការត្រួតពិនិត្យប្រសិទ្ធិភាពល្អបំផុត អនុញ្ញាតឱ្យ Dave ពិនិត្យឡើងវិញប្រព័ន្ធរបស់គាត់ប្រសិនបើប្រព័ន្ធរបស់គាត់បានបំពេញតាមតម្រូវការ Real-world uvloop impact for Dave's hotel: # Before uvloop: 15,000 notifications/second # After uvloop: 35,000 notifications/second # Same code, 2.3x faster! ជាផ្នែកល្អបំផុត? លោក Dave បានចាប់ផ្តើមដោយគួរឱ្យចាប់អារម្មណ៍ថា ទោះជាយ៉ាងណាក៏ដោយវាជាការល្អបំផុតដែលត្រូវការធ្វើការយ៉ាងហោចណាស់។ Zero code changes ដំណោះស្រាយរបស់លោក Dave បាន: "វាជាអ្វីដែលខ្ញុំបាននាំចូល uvloop និងអ្វីដែលបានធ្វើបានយ៉ាងឆាប់រហ័ស? វាមានអារម្មណ៍ដូចជាការបាត់បង់!" វាគឺមិនមែនជាការបាត់បង់, លោក Dave. វាគឺជាការវិស្វកម្មល្អ។ When uvloop matters most: អតិថិជន: 100+ អតិថិជន per channel I/O-heavy callbacks: database writes, API calls, ប្រតិបត្តិការឯកសារ កម្រិតខំប្រឹងប្រឹងប្រឹងប្រឹងប្រឹងប្រឹងប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែងខំប្រឹងប្រែង កុំព្យូទ័រដែលមានអារម្មណ៍: នៅពេលដែលគ្មានកុំព្យូទ័រកុំព្យូទ័រទាំងអស់មានតម្លៃ ខណៈពេលដែល uvloop ធ្វើឱ្យ asyncio លឿនលឿនជាងមុន, អ្នកផ្គត់ផ្គង់មួយចំនួនចង់ Trio សម្រាប់ប្រព័ន្ធដែលមានកម្រិតខ្ពស់ជាមួយនឹងការធ្វើតេស្តជារៀងរាល់រាប់រយ។ ការធ្វើតេស្តជារៀងរាល់នៃ Trio និងការដោះស្រាយ backpressure បានបង្កើតឡើងអាចមានភាពងាយស្រួលជាងមុននៅក្រោមការផ្ទុកខ្ពស់ - វាត្រូវបានរចនាឡើងដើម្បីបាត់បង់ដោយគួរឱ្យចាប់អារម្មណ៍ជាងការបាត់បង់ដោយគួរឱ្យចាប់អារម្មណ៍នៅពេលដែលអ្នកមានប្រតិបត្តិការជារៀងរាល់ពេល 10,000+ ។ សម្រាប់សណ្ឋាគាររបស់ Dave, asyncio+uvloop គឺល្អឥតខ្ចោះ។ សម្រាប់ការធ្វើតេស្តបន្ទាប់របស់ Dave (ប្រព័ន្ធពាណិជ្ជកម្មពេលវេលាពិតប្រាក A note about Trio: លោក Dave បានធ្វើតេស្តដើម្បីដំឡើង uvloop និងទទួលបានបញ្ហានេះដោយសារតែការបញ្ហានេះ។ នេះគឺជាអ្វីដែល - uvloop មានតម្រូវការដើម្បីដំឡើង, ដូច្នេះអ្នកត្រូវការឧបករណ៍អភិវឌ្ឍន៍ដែលត្រូវបានដំឡើង។ នៅលើ Ubuntu / Debian: នៅលើ macOS ជាមួយ Homebrew: នៅលើ ប្រព័ន្ធ ប្រព័ន្ធ ប្រតិបត្តិការ Windows... ដូច្នេះលោក Dave បានក្លាយទៅជាអ្នកគាំទ្រក្នុងការដំឡើងប្រព័ន្ធ ប្រតិបត្តិការ Windows និងដំឡើងប្រព័ន្ធ ប្រតិបត្តិការ Linux នៅពេលដំឡើង ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ Windows ។ The uvloop installation gotcha: apt-get install build-essential brew install python3-dev Going Nuclear: Memory-Mapped សៀវភៅ / សៀវភៅ សម្រាប់ប្រសិនបើមានគុណភាពខ្ពស់ឬប្រសិនបើមានប្រសិនបើមានដំណើរការជាច្រើនយើងអាចប្រើប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានការគ្រប់គ្រងអតិថិជនពេញលេញ។ import mmap import struct import multiprocessing import threading import time from collections import defaultdict from typing import Callable, Dict, List class MemoryMappedPubSub: def __init__(self, buffer_size=1024*1024): # 1MB buffer # Create shared memory buffer self.buffer_size = buffer_size self.shared_file = f'/tmp/pubsub_{multiprocessing.current_process().pid}' # Initialize memory-mapped file with open(self.shared_file, 'wb') as f: f.write(b'\x00' * buffer_size) self.mmap = mmap.mmap(open(self.shared_file, 'r+b').fileno(), 0) # Layout: [head_pos][tail_pos][message_data...] self.head_offset = 0 self.tail_offset = 8 self.data_offset = 16 # Subscriber management self.subscribers: Dict[str, List[Callable]] = defaultdict(list) self.listening = False self.listener_thread = None def subscribe(self, channel: str, callback: Callable): """Subscribe to a channel with a callback function""" self.subscribers[channel].append(callback) print(f"Subscribed to channel: {channel}") # Start listener if not already running if not self.listening: self.start_listening() def start_listening(self): """Start background thread to listen for messages""" if self.listening: return self.listening = True self.listener_thread = threading.Thread(target=self._listen_loop, daemon=True) self.listener_thread.start() print("Started listening for messages...") def stop_listening(self): """Stop the message listener""" self.listening = False if self.listener_thread: self.listener_thread.join() def _listen_loop(self): """Background loop that processes incoming messages""" while self.listening: messages = self.read_messages() for message in messages: self._process_message(message) time.sleep(0.001) # Small delay to prevent excessive CPU usage def _process_message(self, message: str): """Process a single message and notify subscribers""" try: if ':' in message: channel, content = message.split(':', 1) if channel in self.subscribers: for callback in self.subscribers[channel]: try: callback(content) except Exception as e: print(f"Error in callback for channel {channel}: {e}") except Exception as e: print(f"Error processing message: {e}") def publish(self, channel: str, message: str): """Ultra-fast direct memory write""" data = f"{channel}:{message}".encode() # Get current tail position tail = struct.unpack('Q', self.mmap[self.tail_offset:self.tail_offset+8])[0] # Check if we have enough space (simple wraparound) available_space = self.buffer_size - self.data_offset - tail if available_space < len(data) + 4: # Reset to beginning if we're near the end tail = 0 # Write message length + data struct.pack_into('I', self.mmap, self.data_offset + tail, len(data)) self.mmap[self.data_offset + tail + 4:self.data_offset + tail + 4 + len(data)] = data # Update tail pointer new_tail = tail + 4 + len(data) struct.pack_into('Q', self.mmap, self.tail_offset, new_tail) def read_messages(self): """Ultra-fast direct memory read""" head = struct.unpack('Q', self.mmap[self.head_offset:self.head_offset+8])[0] tail = struct.unpack('Q', self.mmap[self.tail_offset:self.tail_offset+8])[0] messages = [] current = head while current < tail: try: # Read message length msg_len = struct.unpack('I', self.mmap[self.data_offset + current:self.data_offset + current + 4])[0] # Safety check if msg_len > self.buffer_size or msg_len <= 0: break # Read message data data = self.mmap[self.data_offset + current + 4:self.data_offset + current + 4 + msg_len] messages.append(data.decode()) current += 4 + msg_len except Exception as e: print(f"Error reading message: {e}") break # Update head pointer struct.pack_into('Q', self.mmap, self.head_offset, current) return messages def __del__(self): """Cleanup when object is destroyed""" self.stop_listening() if hasattr(self, 'mmap'): self.mmap.close() # Dave's ultra-fast hotel messaging in action hotel = MemoryMappedPubSub() # Define subscriber callbacks def pool_guest(message): print(f"🏊 Pool Guest received: {message}") def restaurant_guest(message): print(f"🍽️ Restaurant Guest received: {message}") # Subscribe to channels (automatically starts background listener) hotel.subscribe("pool", pool_guest) hotel.subscribe("restaurant", restaurant_guest) # Publish messages (ultra-fast memory writes) hotel.publish("pool", "Pool closing in 10 minutes!") hotel.publish("restaurant", "Happy hour starts now!") What makes this special: ការបោះពុម្ពយ៉ាងឆាប់រហ័ស: ការបោះពុម្ពម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីនម៉ាស៊ីន ដោយស្វ័យប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិប្រវត្តិ អ្នកប្រព័ន្ធផ្សព្វផ្សាយជាច្រើនក្នុងប្រព័ន្ធផ្សព្វផ្សាយ: ប្រព័ន្ធផ្សព្វផ្សាយទាំងអស់អាចមានអ្នកប្រព័ន្ធផ្សព្វផ្សាយជាច្រើន ការកាត់បន្ថយអារម្មណ៍: One bad callback doesn’t crash the system ការគ្រប់គ្រងឧស្ម័នស្អាត: ការចែកចាយដោយស្វ័យប្រវត្តិនៅពេលដែលធ្វើបាន ទិន្នន័យដែលបានកំណត់ដោយម៉ាស៊ីនបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តុះបណ្តាល ការប្រៀបធៀបការអនុវត្ត Solution Messages/Second Use Case Complexity Basic Pub/Sub ~50K Small apps, prototypes ⭐ Simple Queued Pub/Sub ~200K Most production systems ⭐⭐ Moderate Memory-Mapped ~5M+ High-frequency trading, multi-process ⭐⭐⭐⭐⭐ Expert External (Redis) ~100K+ Distributed systems ⭐⭐⭐ Moderate Basic Pub/Sub 50 គ ទំហំទំហំទំហំទំហំទំហំទំហំ លក្ខណៈសម្បត្តិ Queued Pub/Sub 200 គីឡូក្រាម ប្រព័ន្ធផលិតកម្មភាគច្រើន Memory-Mapped 5 ម៉ែត្រ ការផ្លាស់ប្តូរកម្រិតខ្ពស់, multi-process External (Redis) 100 គីឡូក្រាម + ប្រព័ន្ធផ្លាស់ប្តូរ When to use each: សម្បត្តិ: ការអប់រំ, គម្រោងតូច, <10K ដំណោះស្រាយ / វិនាទី គោលបំណង: កម្មវិធីជាច្រើនពិតប្រាកដដែលគ្រប់គ្រងការដឹកជញ្ជូនយ៉ាងល្អ ទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យទិន្នន័យ ប្រព័ន្ធផ្សព្វផ្សាយអ៊ីនធឺណិត: អ្នកផ្គត់ផ្គង់ជាច្រើន, persistence, reliability proven បន្ថែមការដោះស្រាយបញ្ហានិងការកាត់បន្ថយទំហំនិងអ្នកអាចទទួលបានការបញ្ជូនពាណិជ្ជកម្មដែលមានគុណភាព។ ក្រុមហ៊ុន Pub / Sub Technologies Redis Pub/Sub: ជាងាយស្រួលយ៉ាងឆាប់រហ័សល្អសម្រាប់លក្ខណៈពិសេសពេលវេលាពិតប្រាកដ Apache Kafka: Enterprise-grade ដែលគ្រប់គ្រងការអនុវត្តធំទូលាយ RabbitMQ: ដំណោះស្រាយដែលមានសុវត្ថិភាពដោយមានដំណោះស្រាយដែលមានភាពងាយស្រួល ប្រតិបត្តិការ Cloud: AWS SNS / SQS, Google Pub / Sub, Azure Service Bus ការបញ្ចប់នៃប្រវត្តិសាស្រ្តរបស់ Dave 6 ខែបន្ទាប់មកលោក Dave ត្រូវបានបង្កើតឡើងទៅជា "Chief Communication Innovation Officer" ដោយសារតែកម្រិតខ្ពស់នៃការពេញនិយមរបស់អតិថិជន។ សណ្ឋាគារនេះឥឡូវនេះត្រូវបានគេស្គាល់ថាជា "ប្រព័ន្ធផ្សព្វផ្សាយច្នៃប្រឌិត" ។ ទោះបីជាលោក Dave បាននិយាយថា “សាកលវិទ្យាល័យ” គឺជាប្រព័ន្ធទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍របស់គាត់ប៉ុន្តែលោក Dave បាននិយាយថា “សាកលវិទ្យាល័យទូរទស្សន៍ទូរទស្សន៍” គឺជាប្រព័ន្ធទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូរទស្សន៍ទូទាំងពិភពលោក។ លក្ខណៈសម្បត្តិនៃប្រវត្តិសាស្រ្តនេះ? ទោះបីជាពេលវេលាដែលបានបាត់បន្ថយគឺត្រឹមត្រូវពីរដងក្នុងមួយថ្ងៃ, និងទោះបីជាលោក Dave អាចបាត់បន្ថយការវិជ្ជាជីវៈល្អប្រសិនបើលោកបានបាត់បន្ថយអ្វីដែលជាមុន។ លោកបានចូលទៅក្នុងប្រព័ន្ធការដឹកជញ្ជូនដែលគាត់ដឹងល្អបំផុត។ ការសហប្រតិបត្តិការថ្មីរបស់គាត់គឺជាការច្នៃប្រឌិតនៅក្នុងការដឹកជញ្ជូនសាធារណៈនៅក្រោមទឹកដោយមាន "ការដឹកជញ្ជូនសាធារណៈ" ដែលដំណើរការនៅលើ "ប៊ុកទិន្នន័យ" ។ And what about Dave? នៅពេលដែលគួរឱ្យដឹងអំពីអេក្រង់បច្ចេកទេសលោក Dave បានពិនិត្យឡើងវិញដោយគួរឱ្យចាប់អារម្មណ៍ថា: "រាល់ sub បានបោះពុម្ពទីតាំងរបស់ខ្លួនដល់អ្នកដំណើរការដែលបានចុះឈ្មោះសម្រាប់ដំណើរការឯកទេស។ វាគឺជា pub / sub, ប៉ុន្តែសម្រាប់ subs! ហើយជាការផ្លាស់ប្តូរនៃម៉ាស៊ីនធម្មតា, ពួកគេត្រូវបានផ្គត់ផ្គង់ដោយប៊ូតុងទិន្នន័យ - អ្នកដឹងថា, សម្រាប់ការផ្គត់ផ្គង់ខ្ពស់បំផុត! " ការដឹកជញ្ជូននៃទីក្រុងនេះនៅតែធ្វើការដើម្បីរកឃើញថាគាត់គឺជាការច្នៃប្រឌិតឬគាត់ត្រូវការកាត់បន្ថយអាជ្ញាប័ណ្ណពាណិជ្ជកម្មរបស់គាត់។ លោក Dave មានការជឿថាគាត់នឹងដោះស្រាយបញ្ហាសម្រាប់ "បញ្ហាសម្រាប់ការច្នៃប្រឌិតច្នៃប្រឌិត" ។ លោក Dave ត្រូវបានអរគុណយ៉ាងខ្លាំងដោយការជោគជ័យនៃប្រព័ន្ធថ្មីរបស់គាត់ដែលគាត់បានកាត់បន្ថយនិងចាប់ផ្តើមអាជីវកម្មថ្មី។ នៅពេលបច្ចុប្បន្ននេះអ្នកអាចមើលឃើញ "Pub Sub" ថ្មីរបស់គាត់ - ដែលមានការច្នៃប្រឌិតនៃលោក Dave ដែលមាន "សាងសង់ submarine សម្ភារៈដែលត្រូវបានដំណើរការដោយសម្ភារៈដែលមិនគ្មានការកាត់បន្ថយ" ។ កញ្ចក់នេះត្រូវបានដំឡើងនៅក្នុងកញ្ចក់កំដៅសម្រាប់ "សេចក្តីអធិប្បាយល្អបំផុត" និងលោក Dave បានបង្ហាញថាសាងសង់ soggy គឺជាការពិតប្រាកដ "ការកើនឡើងដោយធន់ទ្រាំសម្រាប់ការអនុវត្តល្អបំផុត" ។ វាគឺជាការពិតណាស់ដែលគាត់បានទទួលបានកាតសៀវភៅព្រះគ្រីស្ទពីអតិថិជននៃសណ្ឋាគារ។