डेव, एक डेवलपर्स को मिले, जिसने होटल की आग अलार्म अनुबंध प्राप्त किया क्योंकि वह सीईओ का भतीजा था. डेव ने पहले कभी आग अलार्म प्रणाली नहीं देखी थी, लेकिन उन्होंने सिर्फ एक ग्राहक सेवा परियोजना को पूरा किया था जहां "व्यक्तिगत फोन कॉल 847% प्रतिबद्धता बढ़ाते हैं! उनके तर्क: "जब मेरी माँ मुझे सीधे कॉल करती है, तो मैं हमेशा जवाब देता हूं. जब कोई सामान्य अलार्म बंद हो जाता है, तो मैं मानता हूं कि यह एक कार अलार्म है और इसे अनदेखा करता हूं. व्यक्तिगत स्पर्श कुंजी है! चरण 1: बिंदु से बिंदु संचार (टेलफोन कॉल फास्को) जब सिगरेट का पता लगाया जाता है, तो सिस्टम होटल के हर कमरे को कॉल करता है। रूम 237 को कॉल मिलता है: "हाय, रसोईघर में धूम्रपान है, कृपया बाहर निकलें." रूम 301: "हाय, रसोईघर में धूम्रपान है, कृपया बाहर निकलें." सभी 847 कमरे, एक-एक। क्या होता है जब रसोई में एक छोटी सी वसा आग होती है और पार्किंग गैरेज में धूम्रपान होता है? डेव की प्रणाली कमरे 237 को कॉल करती है: "हाय, रसोई में धूम्रपान है। फिर तुरंत: "हाय, पार्किंग गैरेज में सिगरेट है." मेहमान भ्रमित है - क्या आपातकाल? क्लिक करें। इस बीच, कमरे 512 में एक मेहमान है जो गूढ़ है. कमरे 623 ने घंटों पहले बाहर की जाँच की लेकिन फोन ध्वनि जारी रखता है. कमरे 108 में एक सोने वाला बच्चा है जिसके माता-पिता अब गुस्से में हैं. एक सप्ताह में तीसरे झूठे अलार्म के बाद, मेहमान अपने फोन को बंद करना शुरू करते हैं. यह क्लासिक बिंदु से बिंदु संचार है - एक भेजने वाला, एक रिसीवर, 847 बार दोहराया जाता है. यह स्केल नहीं करता है, यह अप्रभावी है, और यह सभी शामिल लोगों को परेशान करता है। आग नियंत्रक दिखाई देता है: "डेव, आप ऐसा नहीं कर सकते. एक सामान्य आग अलार्म स्थापित करें." डेव निराश रूप से अनुपालन करता है। चरण 2: रेडियो संचार (परमाणु विकल्प) लेकिन डेव ने अपनी गलतियों से सीखा है. "मेरे पास एक बेहतर विचार है! डेव एक विशाल आग अलार्म स्थापित करता है जो पूरे होटल में विस्फोट करता है। सफलता! हर कोई इसे सुनता है! लेकिन फिर डेव को एहसास होता है कि यह सिस्टम घोषणाओं के लिए सही है। पूल बंद करना? आग अलार्म. नाश्ता 10 मिनट में समाप्त होता है? आग अलार्म. लॉबी में खो गया बच्चा? आग अलार्म. योग कक्षा शुरू होती है? आग अलार्म. आगमन विभाग को इस हफ्ते 47 बार बुलाया गया है. किसी ने आपातकालीन बाहर निकलने की कोशिश की है. यह प्रसारण संचार है - हर किसी के लिए एक संदेश, चाहे वे इसे चाहते हों या नहीं। चरण 3: डेव कुछ क्रांतिकारी खोजता है डेव का तीसरा प्रयास: "क्या होगा अगर हमारे पास विभिन्न क्षेत्रों के लिए अलग-अलग इंटरकॉम होते हैं? पूल क्षेत्र इंटरकॉम: "पुल 10 मिनट में बंद, थैली सेवा समाप्त होती है" रेस्तरां इंटरकॉम: "अच्छे घंटे शुरू, रसोई जल्द बंद" सम्मेलन रूम इंटरकॉम: "मेटिंग रूम बी उपलब्ध है, वाईफाई पासवर्ड बदल गया" स्पा इंटरकॉम: "मैसाई नियुक्तियां उपलब्ध हैं, 3pm पर सॉना रखरखाव" मंजिल-विशिष्ट इंटरकॉम: "तीसरे मंजिल पर हाउसिंग, सातवें मंजिल पर बर्फ मशीन टूट गई" मेहमान स्वाभाविक रूप से उन क्षेत्रों में इंटरकॉम के साथ समायोजित होते हैं जो वे वास्तव में उपयोग कर रहे हैं. पूल के मेहमान पूल अपडेट सुनते हैं, रेस्तरां डिनरर्स भोजन जानकारी प्राप्त करते हैं, सम्मेलन प्रतिभागियों को मीटिंग रूम घोषणाएं मिलती हैं। What Dave Actually Built: Publish-Subscribe (Pub/Sub) इसे समझने के बिना, डेविड ने एक - आधुनिक सॉफ्टवेयर वास्तुकला में सबसे महत्वपूर्ण पैटर्न में से एक। publish-subscribe system यहां यह कैसे काम करता है: संपादक (होटल स्टाफ) विशिष्ट विषयों या चैनलों (पुल अद्यतन, रेस्तरां समाचार, आदि) के लिए संदेश भेजते हैं। Subscribers (guests) चुनते हैं कि वे किस विषय को सुनना चाहते हैं संपादक नहीं जानते कि कौन सुन रहा है, सदस्य नहीं जानते कि कौन भेज रहा है - वे पूरी तरह से अलग हैं यह N×M संचार है: कई संपादक कई सदस्यों को भेज सकते हैं, लेकिन यह संगठित और फ़िल्टर किया जाता है. कोई और शोर नहीं, कोई और याद किए गए संदेश नहीं, कोई भी कमरे को व्यक्तिगत रूप से कॉल नहीं करना। क्यों यह आपके कोड के लिए महत्वपूर्ण है डेव ने गलती से तीन बुनियादी संदेश पैटर्न बनाए: : सेवाओं के बीच प्रत्यक्ष कनेक्शन. जब आपको कई सिस्टम को सूचित करने की आवश्यकता है तो स्केल नहीं करता है. Point-to-Point : सभी के लिए एक संदेश. शोर और तंग कनेक्शन बनाता है। Broadcast : संपादक विषयों / चैनलों को संदेश भेजते हैं, ग्राहक चुनते हैं कि क्या सुनना है। Pub/Sub वास्तविक प्रणालियों में, pub / sub उसी समस्याओं को हल करता है जो डेव ने सामना किया था: ई-कॉमर्स: भंडारण अद्यतन कई सेवाओं (संस्करण, विश्लेषण, नोटिस) के लिए जाते हैं, बिना कि भंडारण सेवा जानती है कि कौन सुन रहा है चैट ऐप्स: चैनलों में प्रकाशित संदेश, उपयोगकर्ता उन वार्तालापों को साइन अप करते हैं जिनमें वे हैं Microservices: सेवाएं घटनाएं प्रकाशित करती हैं (उपयोगकर्ता पंजीकृत, ऑर्डर पूरा) जिन्हें अन्य सेवाएं स्वतंत्र रूप से प्रतिक्रिया कर सकती हैं अपने स्वयं के पब / उप प्रणाली का निर्माण करें (यह आपके विचारों की तुलना में आसान है) Pub/sub को डरावना नहीं होना चाहिए. चलो एक उत्पादन-ग्रेड प्रणाली बनाते हैं जिस पर डेव गर्व होगा: 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!") यह है! 20 लाइनों में एक काम करने वाला पब / उप प्रणाली। Async Queues के साथ अनुकूलन लेकिन क्या होगा अगर डेव का होटल वास्तव में व्यस्त हो जाता है? हमारे सरल संस्करण संपादकों को अवरुद्ध करता है जब सदस्य धीरे-धीरे हैं। 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()) अब संपादक कभी ब्लॉक नहीं करते हैं - वे केवल संदेशों की रैंकिंग करते हैं और आगे बढ़ते रहते हैं. पृष्ठभूमि कर्मचारी सभी सदस्यों को समान रूप से वितरण का संचालन करता है. तेज़ सदस्य अपने संदेशों को तेजी से प्राप्त करते हैं (0.1s), जबकि धीरे-धीरे लोग अपना समय लेते हैं (2.5s), लेकिन दोनों दूसरे को अवरुद्ध नहीं करते हैं। आसान प्रदर्शन हैक: uvloop डेव का असंक्रण प्रणाली शानदार काम कर रहा है, लेकिन फिर वह कुछ जादुई पाता है: कोड के एक पंक्ति को बदलना सब कुछ 2-4 गुना तेज़ कर सकता है। प्रवेश - 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) डेटाबेस लिखता है, एपीआई कॉल, फ़ाइल ऑपरेशन uvloop का libuv-आधारित कार्यान्वयन हजारों साथ-साथ आई / ओ ऑपरेशनों को अधिक कुशलता से संभालता है डेव का होटल अब श्रीमती हेंडरसन के क्लाउड डायरी अपलोड और श्री Peterson के इंस्टाग्राम पोस्ट को एक साथ संभाल सकता है 2. Many Concurrent Subscribers (1.5-2x speedup) प्रति चैनल सैकड़ों या हजारों सदस्यों के साथ सिस्टम uvloop के अनुकूलित कार्य योजनाएं ओवरहेड को कम करती हैं 500+ कमरे सूचना सदस्यों के साथ डेव के सम्मेलन केंद्र के लिए आदर्श 3. Thread Pool Operations (30-50% improvement) सिंक्रनाइज़ कॉलबैक जो थ्रेड पोल्स में स्थानांतरित होते हैं uvloop के तार पूल प्रबंधन अधिक कुशल है डेव के प्राचीन सिस्टम के लिए बेहतर है जो एसिंक्रनाइज़ नहीं किया जा सकता है 4. Timer and Queue Precision मीट्रिक और दर सीमा के लिए अधिक सटीक समय निर्धारण बेहतर रेंज प्रदर्शन निगरानी डेव को ट्रैक करने में मदद करता है कि उसका सिस्टम मांग का अनुसरण कर रहा है 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! सबसे अच्छा हिस्सा? डेव यादृच्छिक रूप से पाता है कि कभी-कभी सबसे अच्छे अनुकूलन वे होते हैं जो कम से कम प्रयास करते हैं। Zero code changes डेव की प्रतिक्रिया: "अच्छा, यह है? मैं सिर्फ uvloop आयात करता हूं और सब कुछ तेजी से होता है? यह धोखा देने की तरह लगता है! यह धोखा नहीं है, डेव. यह सिर्फ अच्छी इंजीनियरिंग है। When uvloop matters most: उच्च सदस्य संख्या: 100 + सदस्य प्रति चैनल I/O भारी कॉलबैक: डेटाबेस लिखता है, एपीआई कॉल, फ़ाइल ऑपरेशन मिश्रित कार्य भार: तेजी से और धीरे-धीरे सदस्यों का संयोजन लाइटेंसी-संवेदनशील: जब हर मिलीसेकंड मायने रखता है जबकि uvloop asyncio तेजी से बनाता है, कुछ डेवलपर्स एक साथ हजारों कार्यों के साथ जटिल प्रणालियों के लिए ट्रिओ पसंद करते हैं. ट्रिओ का संरचित समानता और अंतर्निहित बैकप्रेशर प्रबंधन अत्यधिक भार के तहत अधिक विश्वसनीय हो सकता है - यह अद्भुत रूप से विफल होने के बजाय रहस्यमय रूप से लटकाने के लिए डिज़ाइन किया गया है जब आपके पास 10,000+ समकालीन संचालन होते हैं. डेव के होटल के लिए, asyncio+uvloop सही है. डेव के अगले उद्यम के लिए (मगरम माल के लिए एक वास्तविक समय ट्रेडिंग सिस्टम), ट्रिओ कुछ 3am डबगिंग सत्रों को रोक सकता है. A note about Trio: डेव uvloop स्थापित करने की कोशिश करता है और त्रुटि संदेशों से भ्रमित हो जाता है. यहाँ बात है - uvloop संस्करण की आवश्यकता होती है, इसलिए आपको विकास उपकरणों को स्थापित करने की आवश्यकता होती है. Ubuntu/Debian पर: Homebrew के साथ macOS पर: . विंडोज पर ... ठीक है, डेव विंडोज पर मानक घटना चक्र को पकड़ने और उत्पादन में लिनक्स पर तैनात करने का फैसला करता है. कभी-कभी कम से कम प्रतिरोध का मार्ग सही विकल्प होता है. The uvloop installation gotcha: apt-get install build-essential brew install python3-dev Going Nuclear: मेमोरी-मैपेड Pub/Sub अत्यधिक प्रदर्शन या मल्टीप्रोसेस परिदृश्यों के लिए, हम पूर्ण सदस्य प्रबंधन के साथ साझा स्मृति का उपयोग कर सकते हैं: 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: अत्यधिक तेज़ प्रकाशन: प्रत्यक्ष मेमोरी लिखता है, कोई सिस्टम कॉल नहीं करता है स्वचालित संदेश मार्गदर्शन: पृष्ठभूमि थ्रेड संदेशों को संसाधित करता है और ग्राहकों को कॉल करता है चैनल प्रति कई सदस्य: प्रत्येक चैनल में कई सुनने वाले हो सकते हैं त्रुटि इन्सुलेशन: एक बुरा कॉलबैक सिस्टम को खराब नहीं करता है साफ संसाधन प्रबंधन: समाप्त होने पर स्वचालित सफाई डेव का होटल अब प्रति सेकंड लाखों मेहमान संदेशों को संभाल सकता है, जबकि सरल "सेबुक और भूलना" मॉडल को बनाए रखता है जिसने अपने सिस्टम को प्रसिद्ध बना दिया। प्रदर्शन की तुलना 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 50K छोटे ऐप्स, प्रोटोटाइप सरल Queued Pub/Sub 200 करोड़ अधिकांश उत्पादन प्रणाली ⭐⭐ आधुनिकता Memory-Mapped 5 एम + उच्च आवृत्ति ट्रेडिंग, मल्टीप्रोसेस ⭐⭐⭐⭐ विशेषज्ञ External (Redis) ~ 100k + वितरित प्रणाली ⭐⭐⭐ आधुनिकता When to use each: बुनियादी: सीखना, छोटे परियोजनाएं, <10K संदेश / सेक लाइन: अधिकांश वास्तविक अनुप्रयोग, ट्रैफ़िक स्पीक को अच्छी तरह से संभालता है मेमोरी-मैप: > 500K संदेश / सेकंड, क्रॉस-प्रोसेस संचार, अल्ट्रा-कम लाटेंस बाहरी: कई सर्वर, दृढ़ता, सिद्ध विश्वसनीयता त्रुटि प्रसंस्करण, निरंतरता और स्केलिंग जोड़ें, और आपके पास उद्यम-स्तरीय संदेश प्राप्त होते हैं। लोकप्रिय Pub / उप प्रौद्योगिकी Redis Pub/Sub: सरल, तेज़, वास्तविक समय सुविधाओं के लिए महान Apache Kafka: एंटरप्राइज़ ग्रेड, बड़े पैमाने पर पारगमन को संभालता है RabbitMQ: लचीला राउटिंग के साथ विश्वसनीय संदेश रेंज क्लाउड समाधान: AWS SNS/SQS, Google Pub/Sub, Azure Service Bus डेव की कहानी का अंत छह महीने बाद, डेव को "चीफ संचार नवाचार अधिकारी" के रूप में बढ़ाया जाता है क्योंकि मेहमान संतुष्टि स्कोर छत के माध्यम से हैं। डेव अभी भी सोचता है कि "चैनल" होटल की केबल टीवी प्रणाली को संदर्भित करता है, लेकिन उनके इंटरकॉम क्षेत्र कंप्यूटर विज्ञान छात्रों को दुनिया भर में सिखा रहे हैं कि संदेश पैटर्न कैसे काम करते हैं। यहां तक कि एक बंद घड़ी एक दिन में दो बार सही है, और यहां तक कि डेव भी अच्छी वास्तुकला में टकरा सकते हैं यदि वह पहले पर्याप्त चीजें तोड़ता है। उनके नए उद्यम "डेटा बसों" पर चलने वाले "सार्वजनिक सब्बैक" के साथ समुद्री सार्वजनिक परिवहन को क्रांति दे रहे हैं। And what about Dave? जब तकनीकी आर्किटेक्चर के बारे में पूछा जाता है, तो डेव उत्साहित रूप से समझाता है: "प्रत्येक सब्ब यात्रियों को अपना स्थान प्रकाशित करता है जो विशिष्ट मार्गों पर साइन अप करते हैं. यह pub / सब्ब है, लेकिन सब्ब के लिए! शहर के परिवहन विभाग अभी भी यह पता लगाने की कोशिश कर रहे हैं कि क्या वह एक प्रतिभा है या अगर उन्हें अपने व्यावसायिक लाइसेंस को रद्द करने की आवश्यकता है। डेव अपने नए सिस्टम की सफलता से इतना प्रोत्साहित किया गया था कि उन्होंने एक नया व्यवसाय शुरू किया और एक नया व्यवसाय शुरू किया. अगली बार जब आप अपने स्थानीय पानी के छेद में हैं, तो आप नए "पब सब" को देख सकते हैं - डेव के क्रांतिकारी "असीनक्रोनिक रूप से संसाधित कारीगर उपकरणों की पंक्तियों के साथ कारीगर उपकरण सैंडविच" के साथ। वह अभी भी होटल के मेहमानों से क्रिसमस कार्ड प्राप्त करते हैं।