[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-en-1-1-all-load-balancing-websocket-go-all--*":3,"academy-blog-translations-sc44wz78zvi9foa":139},{"data":4,"page":127,"perPage":127,"totalItems":127,"totalPages":127},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":133,"keywords":134,"locale":109,"published_at":135,"scheduled_at":13,"school_blog":131,"short_description":136,"slug":137,"status":129,"title":6,"updated":138,"updated_by":13,"views":132},"Ep.25 Go and Load Balancing - Distributing Connections Like a Pro!","sclblg987654321","school_blog_translations","\u003Cp class=\"p1\">\u003Cstrong>Go and Load Balancing - Distributing Connections Like a Pro!\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Load Balancing on WebSocket Supports a Large Number of Users in Go\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">In this episode, we will explore how to optimize a WebSocket Server to support a large number of users using Load Balancing and Scaling, which are essential techniques to ensure your system can expand and operate efficiently.\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>What is Load Balancing?\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">Load Balancing is the process of distributing requests from users to multiple servers so that each server does not become overloaded, thereby reducing response time.\u003C\u002Fp>\u003Cp class=\"p3\">Benefits of Load Balancing :\u003C\u002Fp>\u003Cp class=\"p3\">1. Increased Stability: If one server fails, the system continues to operate.\u003C\u002Fp>\u003Cp class=\"p3\">2. Supports Many Users: Distributes connections to multiple servers.\u003C\u002Fp>\u003Cp class=\"p3\">3. Easy Scaling\u003Cstrong>:\u003C\u002Fstrong> Increase or decrease the number of servers as needed.\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Using a Load Balancer for WebSocket\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">For WebSocket, which is a persistent connection (long-term connection), we can use a Load Balancer to distribute connections to multiple servers. Popular tools that support WebSocket include :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">NGINX\u003C\u002Fli>\u003Cli class=\"li3\">HAProxy\u003C\u002Fli>\u003Cli class=\"li3\">AWS Elastic Load Balancer\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Example Configuration of Load Balancing with NGINX\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. Install NGINX\u003C\u002Fp>\u003Cp class=\"p3\">Install NGINX on the machine you want to use as a Load Balancer.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">sudo apt update\nsudo apt install nginx\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">2. Configure NGINX to Support WebSocket Create a configuration file in \u002Fetc\u002Fnginx\u002Fsites-available\u002Fwebsocket.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">upstream websocket_backend {\r\n    server 127.0.0.1:8080; # เซิร์ฟเวอร์ WebSocket เครื่องที่ 1\r\n    server 127.0.0.1:8081; # เซิร์ฟเวอร์ WebSocket เครื่องที่ 2\r\n}\r\n\r\nserver {\r\n    listen 80;\r\n\r\n    location \u002F {\r\n        proxy_pass http:\u002F\u002Fwebsocket_backend;\r\n        proxy_http_version 1.1;\r\n        proxy_set_header Upgrade $http_upgrade;\r\n        proxy_set_header Connection \"upgrade\";\r\n        proxy_set_header Host $host;\r\n    }\r\n}\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">3. Activate the Configuration File Create a symbolic link and restart NGINX.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">sudo ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fwebsocket \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\r\nsudo systemctl restart nginx\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">4. Test the Connection Users can connect to ws:\u002F\u002F&lt;your-nginx-server&gt; and NGINX will distribute the connection to multiple WebSocket servers.\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Scaling WebSocket Server with Docker and Kubernetes\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. Using Docker Compose for Scaling If you use Docker, you can easily increase the number of WebSocket Servers.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">version: '3'\r\nservices:\r\n  websocket:\r\n    build: .\r\n    ports:\r\n      - \"8080-8082:8080\"\r\n    deploy:\r\n      replicas: 3 # สร้าง 3 Instance ของ WebSocket Server\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p3\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">Run the command.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">docker-compose up --scale websocket=3\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">2. Using Kubernetes for Load Balancing Kubernetes has a built-in Load Balancer that helps distribute connections. Here’s an example deployment file.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">apiVersion: apps\u002Fv1\r\nkind: Deployment\r\nmetadata:\r\n  name: websocket\r\nspec:\r\n  replicas: 3\r\n  selector:\r\n    matchLabels:\r\n      app: websocket\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: websocket\r\n    spec:\r\n      containers:\r\n      - name: websocket\r\n        image: your-websocket-image\r\n        ports:\r\n        - containerPort: 8080\r\n---\r\napiVersion: v1\r\nkind: Service\r\nmetadata:\r\n  name: websocket-service\r\nspec:\r\n  selector:\r\n    app: websocket\r\n  ports:\r\n  - protocol: TCP\r\n    port: 80\r\n    targetPort: 8080\r\n  type: LoadBalancer\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p3\">\u003Cbr>Run the command.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">kubectl apply -f websocket-deployment.yaml\r\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Additional Techniques for Optimization\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">Use Sticky Sessions : Bind each connection to the same server to maintain user state.\u003C\u002Fli>\u003Cli class=\"li3\">Cache Data in Memory : Use Redis or Memcached for temporary data storage.\u003C\u002Fli>\u003Cli class=\"li3\">Monitor the System : Use Prometheus and Grafana to track server performance.\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>In Summary\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">Load Balancing helps distribute WebSocket connections across multiple servers.\u003C\u002Fli>\u003Cli class=\"li3\">Use NGINX or Kubernetes to support a large number of users.\u003C\u002Fli>\u003Cli class=\"li3\">Increase stability with Sticky Sessions and real-time system monitoring.\u003C\u002Fli>\u003C\u002Ful>","20_11zon_okv7xobp0u.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fxc7w3facngtdpyg\u002F20_11zon_okv7xobp0u.webp","2026-03-04 08:34:12.296Z","",{"keywords":15,"locale":103,"school_blog":113},[16,23,28,33,38,43,48,53,58,63,68,73,78,83,88,93,98],{"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:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:33:59.315Z","btmgtfwmgpke1aa","Go language","2026-04-10 16:08:04.625Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:34:03.856Z","9dujh23qyko22y0","Load Balancing","2026-04-10 16:08:06.326Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:34:00.920Z","ecac9y661or1xka","WebSocket","2026-04-10 16:08:05.227Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:34:06.624Z","xjxx81inhjp5ujb","Optimization","2026-04-10 16:08:07.289Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:34:08.492Z","bnjw1oba34e1ss1","Support for Many Users","2026-04-10 16:08:08.008Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:34:09.677Z","zy6p9bub451w3c8","NGINX","2026-04-10 16:08:08.440Z",{"collectionId":17,"collectionName":18,"created":59,"created_by":13,"id":60,"name":61,"updated":62,"updated_by":13},"2026-03-04 08:34:10.799Z","m3qoswhgnc4c38n","Kubernetes","2026-04-10 16:08:08.875Z",{"collectionId":17,"collectionName":18,"created":64,"created_by":13,"id":65,"name":66,"updated":67,"updated_by":13},"2026-03-04 08:32:51.346Z","tmzmy6jyz1n35rr","Go Programming","2026-04-10 16:08:01.434Z",{"collectionId":17,"collectionName":18,"created":69,"created_by":13,"id":70,"name":71,"updated":72,"updated_by":13},"2026-03-04 08:32:15.843Z","m0x7wo77i8iycf1","Programming Education","2026-04-10 16:07:51.675Z",{"collectionId":17,"collectionName":18,"created":74,"created_by":13,"id":75,"name":76,"updated":77,"updated_by":13},"2026-03-04 08:31:22.575Z","lfjse4xivbgg5wu","Practice programming","2026-04-10 16:07:39.541Z",{"collectionId":17,"collectionName":18,"created":79,"created_by":13,"id":80,"name":81,"updated":82,"updated_by":13},"2026-03-04 08:32:26.073Z","vnvj1oaxje9m1q8","programming for beginners","2026-04-10 16:07:54.133Z",{"collectionId":17,"collectionName":18,"created":84,"created_by":13,"id":85,"name":86,"updated":87,"updated_by":13},"2026-03-04 08:20:33.316Z","ln1ntwattzmxo0o","programming","2026-04-10 16:07:27.299Z",{"collectionId":17,"collectionName":18,"created":89,"created_by":13,"id":90,"name":91,"updated":92,"updated_by":13},"2026-03-04 08:31:49.362Z","2m9vv13etpn6zkx","programming language","2026-04-10 16:07:45.606Z",{"collectionId":17,"collectionName":18,"created":94,"created_by":13,"id":95,"name":96,"updated":97,"updated_by":13},"2026-03-04 08:31:54.955Z","264sfjffyhspetq","programmers","2026-04-10 16:07:47.221Z",{"collectionId":17,"collectionName":18,"created":99,"created_by":13,"id":100,"name":101,"updated":102,"updated_by":13},"2026-03-04 08:26:59.195Z","gab60xd583s3qaw","Superdev School","2026-04-10 16:07:37.087Z",{"code":104,"collectionId":105,"collectionName":106,"created":107,"flag":108,"id":109,"is_default":110,"label":111,"updated":112},"en","pbc_1989393366","locales","2026-01-22 11:00:02.726Z","twemoji:flag-united-states","qv9c1llfov2d88z",false,"English","2026-04-10 15:42:46.825Z",{"category":114,"collectionId":115,"collectionName":116,"expand":117,"id":131,"views":132},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":118},{"blogIds":119,"collectionId":120,"collectionName":121,"created":122,"created_by":13,"id":114,"image":123,"image_alt":13,"image_path":124,"label":125,"name":126,"priority":127,"publish_at":128,"scheduled_at":13,"status":129,"updated":130,"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":126,"th":126},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","sc44wz78zvi9foa",214,"xc7w3facngtdpyg",[20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100],"2025-01-27 04:41:12.867Z","Learn how to optimize your WebSocket Server using Load Balancing and Scaling to support a large number of users in Go.","load-balancing-websocket-go","2026-04-25 02:47:29.559Z",{"en":137}]