[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-scalability-websocket-redis-all--*":3,"academy-blog-translations-mlvpzlynlgvljj8":100},{"data":4,"page":87,"perPage":87,"totalItems":87,"totalPages":87},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":95,"keywords":96,"locale":69,"published_at":97,"scheduled_at":13,"school_blog":91,"short_description":98,"status":89,"title":6,"updated":99,"updated_by":13,"slug":92,"views":94},"EP.59 การทำให้ WebSocket Server รองรับการสเกล (Scalability) ด้วย Redis","sclblg987654321","school_blog_translations","\u003Cp>ฟีเจอร์การรองรับการสเกล (scalability) ด้วย Redis จะช่วยให้ WebSocket Server สามารถจัดการกับการเชื่อมต่อที่มีจำนวนมากได้อย่างมีประสิทธิภาพ โดยการใช้ Redis เป็นแคชสำหรับจัดเก็บข้อมูลสถานะการเชื่อมต่อ และการส่งข้อมูลในห้องแชทในแบบเรียลไทม์ ด้วย Redis, WebSocket Server สามารถเพิ่มขนาดได้อย่างง่ายดายเมื่อมีการขยายตัวของจำนวนผู้ใช้งาน\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ทำไม WebSocket Server ต้องรองรับการสเกล?\u003C\u002Fh2>\u003Cp>ในแอปพลิเคชันที่มีผู้ใช้งานจำนวนมาก WebSocket Server อาจจะต้องรองรับการเชื่อมต่อหลายพันหรือหลายหมื่นคอนเน็กชันพร้อมกัน ซึ่งเป็นการทดสอบประสิทธิภาพของเซิร์ฟเวอร์ในกรณีการใช้งานแบบสเกลสูง ดังนั้นการทำให้ WebSocket Server รองรับการสเกลจะช่วยให้:\u003C\u002Fp>\u003Cul>\u003Cli>รองรับการเชื่อมต่อที่มากขึ้น: โดยไม่ทำให้ระบบช้าลง\u003C\u002Fli>\u003Cli>เพิ่มประสิทธิภาพในการจัดการข้อมูล: ในขณะที่มีการเชื่อมต่อหลายร้อยหรือหลายพัน\u003C\u002Fli>\u003Cli>ช่วยเพิ่มความเร็วในการส่งข้อมูล: โดยใช้ Redis ในการเก็บข้อมูลแคชและแชร์ข้อมูลระหว่างหลาย instance ของเซิร์ฟเวอร์\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>ข้อดีของการรองรับการสเกล:\u003C\u002Fh3>\u003Cul>\u003Cli>สามารถจัดการกับจำนวนการเชื่อมต่อที่สูง: รองรับผู้ใช้จำนวนมากโดยไม่ทำให้เกิดการดีเลย์หรือข้อผิดพลาด\u003C\u002Fli>\u003Cli>เพิ่มประสิทธิภาพ: ใช้ Redis เพื่อจัดเก็บข้อมูลที่ต้องใช้ซ้ำในหลายๆ การเชื่อมต่อ\u003C\u002Fli>\u003Cli>รองรับการขยายระบบ: สามารถเพิ่ม WebSocket Server เพิ่มเติมได้ง่ายและทำงานร่วมกันได้โดยไม่ต้องปรับแก้โค้ดมาก\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>โครงสร้างของฟีเจอร์การควบคุมการเข้าถึงห้องแชท\u003C\u002Fh2>\u003Cp>ฟีเจอร์การควบคุมการเข้าถึงห้องแชทจำเป็นต้องมีการตรวจสอบสิทธิ์ของผู้ใช้ในระบบ โดยจะต้องเชื่อมโยงกับข้อมูลผู้ใช้ในฐานข้อมูลและตรวจสอบว่าผู้ใช้คนใดสามารถเข้าร่วมการสนทนาในห้องนั้นได้\u003C\u002Fp>\u003Ch3>ส่วนประกอบหลักของระบบการควบคุมการเข้าถึงห้องแชท:\u003C\u002Fh3>\u003Cul>\u003Cli>การเก็บข้อมูลผู้ใช้ในฐานข้อมูล: ข้อมูลเกี่ยวกับผู้ใช้ เช่น สิทธิ์การเข้าร่วมจะต้องถูกเก็บในฐานข้อมูล\u003C\u002Fli>\u003Cli>การตรวจสอบสิทธิ์การเข้าถึง: ระบบจะต้องสามารถตรวจสอบสิทธิ์ของผู้ใช้และอนุมัติหรือปฏิเสธการเข้าร่วม\u003C\u002Fli>\u003Cli>การจัดการการเข้าถึงห้องแชท: เมื่อผู้ใช้พยายามเข้าร่วมห้องแชท ระบบจะต้องสามารถอนุมัติหรือปฏิเสธการเข้าร่วมได้ตามสิทธิ์ของผู้ใช้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การทำให้ WebSocket Server รองรับการสเกล (Scalability) ด้วย Redis\u003C\u002Fh2>\u003Cp>การปรับปรุง WebSocket Server ให้รองรับการสเกลด้วย Redis ประกอบไปด้วยขั้นตอนการตั้งค่า Redis และการเชื่อมต่อกับ WebSocket Server เพื่อให้สามารถจัดการกับหลายๆ connection พร้อมกันได้\u003C\u002Fp>\u003Ch3>ขั้นตอนที่ต้องทำ:\u003C\u002Fh3>\u003Col>\u003Cli>การติดตั้ง Redis และเชื่อมต่อกับ WebSocket Server: เริ่มต้นด้วยการติดตั้ง Redis และตั้งค่า WebSocket Server ให้สามารถใช้ Redis ในการเก็บข้อมูลสถานะการเชื่อมต่อ\u003C\u002Fli>\u003Cli>การจัดเก็บสถานะการเชื่อมต่อใน Redis: เราจะใช้ Redis สำหรับเก็บข้อมูลสถานะการเชื่อมต่อทั้งหมด รวมถึงการเชื่อมต่อของผู้ใช้ที่เข้าห้องแชท\u003C\u002Fli>\u003Cli>การกระจายข้อมูลระหว่างหลาย WebSocket Servers: เมื่อ WebSocket Server หลายตัวทำงานร่วมกัน Redis จะช่วยให้สามารถกระจายข้อมูลไปยังทุกเซิร์ฟเวอร์ได้โดยไม่ขัดแย้งกัน\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การสร้าง UI สำหรับการรองรับการสเกล\u003C\u002Fh2>\u003Cp>การแสดงผล UI จะช่วยให้ผู้ใช้สามารถเห็นการเชื่อมต่อในห้องแชทและประสิทธิภาพของการเชื่อมต่อในระบบ โดยการแสดงสถิติการเชื่อมต่อและข้อมูลที่มีการอัปเดตในทุกๆ ช่วงเวลา\u003C\u002Fp>\u003Ch3>ส่วนประกอบของ UI:\u003C\u002Fh3>\u003Cul>\u003Cli>แสดงจำนวนการเชื่อมต่อที่กำลังทำงานอยู่: UI จะมีการแสดงจำนวนคอนเน็กชันที่กำลังทำงานในระบบ\u003C\u002Fli>\u003Cli>แสดงการอัปเดตข้อความที่มีการส่ง: ข้อความที่ถูกส่งไปยังทุกคนในห้องแชทจะถูกแสดงผลทันที\u003C\u002Fli>\u003Cli>แสดงสถานะของการเชื่อมต่อ: UI จะแสดงสถานะการเชื่อมต่อที่พร้อมใช้งานในห้องแชท\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การทดสอบการรองรับการสเกล\u003C\u002Fh2>\u003Cp>หลังจากเพิ่มฟีเจอร์การรองรับการสเกลแล้ว การทดสอบจะเป็นสิ่งสำคัญเพื่อให้มั่นใจว่าระบบสามารถรองรับการเชื่อมต่อที่มีจำนวนมากได้\u003C\u002Fp>\u003Ch3>การทดสอบที่ควรทำ:\u003C\u002Fh3>\u003Cul>\u003Cli>ทดสอบจำนวนการเชื่อมต่อ: ทดสอบระบบโดยการเชื่อมต่อหลายพันคอนเน็กชันไปยัง WebSocket Server\u003C\u002Fli>\u003Cli>ทดสอบการส่งข้อความในหลายๆ instance ของเซิร์ฟเวอร์: ตรวจสอบว่า Redis สามารถช่วยกระจายข้อมูลและการส่งข้อความไปยังหลายๆ เซิร์ฟเวอร์ได้\u003C\u002Fli>\u003Cli>ทดสอบการตอบสนองในระบบที่มีการขยายขนาด: ตรวจสอบว่า WebSocket Server สามารถจัดการกับการขยายขนาดของระบบและให้บริการต่อไปได้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตัวอย่างโค้ดสำหรับการรองรับการสเกลใน WebSocket Chat ด้วย Redis\u003C\u002Fh2>\u003Col>\u003Cli>\u003Ch3>การติดตั้ง Redis (Redis Setup)\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>ติดตั้ง Redis บนเครื่องหรือเซิร์ฟเวอร์ที่ใช้งาน\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-bash\">sudo apt-get install redis-server\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Col start=\"2\">\u003Cli>\u003Ch3>โค้ดใน WebSocket Server (Backend)\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>ใช้ Redis เพื่อเก็บสถานะการเชื่อมต่อ\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"github.com\u002Fgo-redis\u002Fredis\u002Fv8\"\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n    \"fmt\"\n    \"net\u002Fhttp\"\n    \"sync\"\n    \"context\"\n)\n\nvar rdb *redis.Client\n\nfunc init() {\n    rdb = redis.NewClient(&amp;redis.Options{\n        Addr: \"localhost:6379\", \u002F\u002F Redis server address\n    })\n}\n\nvar (\n    clients   = make(map[*websocket.Conn]bool)\n    broadcast = make(chan string)\n    mu        sync.Mutex\n)\n\nfunc handleConnection(w http.ResponseWriter, r *http.Request) {\n    conn, _ := upgrader.Upgrade(w, r, nil)\n    defer conn.Close()\n    clients[conn] = true\n\n    for {\n        var message string\n        err := conn.ReadMessage(&amp;message)\n        if err != nil {\n            delete(clients, conn)\n            break\n        }\n\n        \u002F\u002F Store message in Redis\n        rdb.LPush(context.Background(), \"chat_messages\", message)\n        \n        broadcast &lt;- message\n    }\n}\n\nfunc notifyClients() {\n    for {\n        msg := &lt;-broadcast\n        for client := range clients {\n            err := client.WriteMessage(msg)\n            if err != nil {\n                client.Close()\n                delete(clients, client)\n            }\n        }\n    }\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleConnection)\n    go notifyClients()\n    fmt.Println(\"WebSocket Server Running on Port 8080\")\n    http.ListenAndServe(\":8080\", nil)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Col start=\"3\">\u003Cli>\u003Ch3>โค้ดใน Frontend (Client)\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>เพิ่มการเชื่อมต่อกับ Redis เพื่อแสดงข้อความใน UI\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-javascript\">const socket = new WebSocket(\"ws:\u002F\u002Flocalhost:8080\u002Fws\");\nconst chatContainer = document.getElementById(\"chat-container\");\n\nsocket.onmessage = (event) =&gt; {\n    const data = event.data;\n    const messageElement = document.createElement(\"p\");\n    messageElement.innerText = data;\n    chatContainer.appendChild(messageElement);\n};\n\nfunction sendMessage(message) {\n    socket.send(message);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ท้าให้ลอง!\u003C\u002Fh3>\u003Cp>ลองเพิ่ม \u003Cstrong>ระบบการเก็บข้อความใน Redis\u003C\u002Fstrong> เพื่อให้สามารถค้นหาข้อความได้เร็วขึ้นและช่วยเพิ่มประสิทธิภาพในการส่งข้อมูล!\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>EP ถัดไป:\u003C\u002Fstrong>\u003Cbr>ใน EP ถัดไป เราจะมาดู \u003Cstrong>การเพิ่มฟีเจอร์การแชทแบบกลุ่ม (Group Chat)\u003C\u002Fstrong> ใน WebSocket เพื่อทำให้ผู้ใช้สามารถเข้าร่วมแชทกลุ่มได้ และรองรับการส่งข้อความในกลุ่มผ่าน WebSocket!\u003C\u002Fp>","89_11zon_pwaaovzod7.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fg6sooep7we6bwc0\u002F89_11zon_pwaaovzod7.webp","2026-03-04 08:48:36.170Z","",{"keywords":15,"locale":63,"school_blog":73},[16,23,28,33,38,43,48,53,58],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:48:01.927Z","vcknw4qrrifzlfg","WebSocket scalability","2026-04-10 16:13:39.152Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:48:33.630Z","0ywh76lu4wdls2m","Redis WebSocket","2026-04-10 16:13:49.957Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:48:32.974Z","eisfqhcev64quw9","scalable WebSocket server","2026-04-10 16:13:49.769Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:48:32.209Z","48y556uc6leq7y0","real-time chat WebSocket","2026-04-10 16:13:49.571Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:48:31.837Z","ahb1ycvssncgam5","WebSocket chat app","2026-04-10 16:13:49.440Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:48:05.655Z","jbilbz5mzbvhi7v","WebSocket performance","2026-04-10 16:13:40.132Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:48:31.334Z","mc8i2g75noi47kf","Redis chat app","2026-04-10 16:13:49.128Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":59,"created_by":13,"id":60,"name":61,"updated":62,"updated_by":13},"2026-03-04 08:48:30.822Z","9oaikj2kr22tbp3","server scaling","2026-04-10 16:13:48.922Z",{"code":64,"collectionId":65,"collectionName":66,"created":67,"flag":68,"id":69,"is_default":70,"label":71,"updated":72},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":74,"collectionId":75,"collectionName":76,"created":13,"expand":77,"id":91,"slug":92,"updated":93,"views":94},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":78},{"blogIds":79,"collectionId":80,"collectionName":81,"created":82,"created_by":13,"id":74,"image":83,"image_alt":13,"image_path":84,"label":85,"name":86,"priority":87,"publish_at":88,"scheduled_at":13,"status":89,"updated":90,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":86,"th":86},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","mlvpzlynlgvljj8","scalability-websocket-redis","2026-05-12 05:34:44.986Z",343,"g6sooep7we6bwc0",[20,25,30,35,40,45,50,55,60],"2025-07-01 04:30:02.627Z","เรียนรู้วิธีทำให้ WebSocket Server รองรับการสเกล (scalability) โดยใช้ Redis เพื่อจัดการกับการเชื่อมต่อจำนวนมากและเพิ่มประสิทธิภาพในการส่งข้อมูลในห้องแชท","2026-05-06 08:38:21.523Z",{"th":92,"en":92}]