Go पर WebSocket: उन्नत स्तर के real-time अनुप्रयोग बनाना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go पर WebSocket: real-time अनुप्रयोगों के लिए उन्नत तकनीकें

\n\n

Go पर real-time अनुप्रयोग विकसित करना भाषा की सबसे मजबूत विशेषताओं में से एक है। गोरूटीन और चैनलों के माध्यम से अंतर्निहित समवर्ती समर्थन Go को WebSocket सर्वर के लिए एक आदर्श विकल्प बनाता है। हालांकि, जब हजारों समवर्ती कनेक्शनों वाली प्रोडक्शन प्रणालियों की बात आती है, तो एक सरल "Hello, WebSocket" उदाहरण काम करना बंद कर देता है। इस लेख में, हम उन्नत तकनीकों पर चर्चा करेंगे: कनेक्शन पूल अनुकूलन से लेकर संदेश ब्रोकरों के माध्यम से स्केलिंग तक।

\n\n

1. कनेक्शन पूल आर्किटेक्चर: हजारों क्लाइंट का प्रबंधन

\n\n

मूल उदाहरण में, हम प्रत्येक कनेक्शन के लिए एक अलग गोरूटीन बनाते हैं। यह 100-200 क्लाइंट के लिए ठीक है, लेकिन 10,000+ कनेक्शनों पर मेमोरी खपत और संदर्भ स्विचिंग का ओवरहेड गंभीर हो जाता है। उन्नत दृष्टिकोण निश्चित संख्या में वर्कर और चैनलों के साथ कनेक्शन पूल का उपयोग करना है।

\n\n
// Pool — गोरूटीन सीमा के साथ कनेक्शन पूल\ntype Pool struct {\n    connections map[*websocket.Conn]bool\n    broadcast   chan []byte\n    register    chan *websocket.Conn\n    unregister  chan *websocket.Conn\n}\n\nfunc NewPool(maxGoroutines int) *Pool {\n    return &Pool{\n        connections: make(map[*websocket.Conn]bool),\n        broadcast:   make(chan []byte, 256),\n        register:    make(chan *websocket.Conn),\n        unregister:  make(chan *websocket.Conn),\n    }\n}\n\nfunc (pool *Pool) Start() {\n    for {\n        select {\n        case conn := <-pool.register:\n            pool.connections[conn] = true\n        case conn := <-pool.unregister:\n            if _, ok := pool.connections[conn]; ok {\n                delete(pool.connections, conn)\n                conn.Close()\n            }\n        case message := <-pool.broadcast:\n            for conn := range pool.connections {\n                go func(c *websocket.Conn) {\n                    if err := c.WriteMessage(websocket.TextMessage, message); err != nil {\n                        pool.unregister <- c\n                    }\n                }(conn)\n            }\n        }\n    }\n}
\n\n

यह क्यों काम करता है? चैनल बफर के रूप में कार्य करते हैं, ब्लॉकिंग को रोकते हैं। एक एकल select सभी घटनाओं का प्रबंधन करता है, और लिखने के लिए गोरूटीन केवल आवश्यकता होने पर बनाई जाती हैं। यह GC (गार्बेज कलेक्टर) पर पीक लोड को कम करता है।

\n\n

2. Graceful shutdown और कनेक्शन स्थिति प्रबंधन

\n\n

सर्वर को पुनरारंभ करते समय, सभी WebSocket कनेक्शनों को सही ढंग से बंद करना और क्लाइंट को शटडाउन संदेश भेजना महत्वपूर्ण है। इस चरण को अनदेखा करने से "लटके हुए" कनेक्शन और मेमोरी लीक होते हैं।

\n\n
// Server — graceful shutdown के साथ WebSocket सर्वर\ntype Server struct {\n    pool    *Pool\n    httpSrv *http.Server\n}\n\nfunc (s *Server) Shutdown(ctx context.Context) error {\n    // 1. HTTP सर्वर बंद करें (नए कनेक्शन स्वीकार नहीं किए जाते)\n    if err := s.httpSrv.Shutdown(ctx); err != nil {\n        return err\n    }\n\n    // 2. सभी क्लाइंट को शटडाउन संदेश भेजें\n    shutdownMsg := []byte(`{"type":"shutdown","message":"server is going down"}`)\n    s.pool.broadcast <- shutdownMsg\n\n    // 3. पूल में सभी कनेक्शन बंद करें\n    for conn := range s.pool.connections {\n        conn.WriteMessage(websocket.CloseMessage, \n            websocket.FormatCloseMessage(websocket.CloseNormalClosure, "server shutdown"))\n        conn.Close()\n    }\n\n    return nil\n}\n\n// main में उपयोग\nfunc main() {\n    pool := NewPool(1000)\n    go pool.Start()\n\n    srv := &Server{pool: pool}\n    srv.httpSrv = &http.Server{Addr: ":8080"}\n\n    // सिग्नल प्रोसेसिंग\n    go func() {\n        sigint := make(chan os.Signal, 1)\n        signal.Notify(sigint, os.Interrupt, syscall.SIGTERM)\n        <-sigint\n        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n        defer cancel()\n        srv.Shutdown(ctx)\n    }()\n\n    log.Fatal(srv.httpSrv.ListenAndServ                

ब्लॉग

पुस्तक अनुशंसाएँ