[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-en-1-1-all-go-stress-testing-websocket-all--*":3,"academy-blog-translations-eua5wmxw3za1457":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.29 Go and Stress Testing - Measure Your System’s Limits!","sclblg987654321","school_blog_translations","\u003Cp class=\"p1\">\u003Cstrong>Go and Stress Testing - Measure Your System’s Limits!\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p2\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">In this episode, we will look at how to conduct Stress Testing or performance testing of WebSocket to measure how many simultaneous users your system can handle, as well as identify bottlenecks for performance improvement!\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>What is Stress Testing?\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">Stress Testing simulates system usage in heavy conditions, such as many simultaneous connections or frequent message sending, to test whether the system can perform as expected.\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Objectives of Stress Testing\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. Measure the system's maximum capacity.\u003C\u002Fp>\u003Cp class=\"p3\">2. Identify bottlenecks such as CPU, RAM, or network.\u003C\u002Fp>\u003Cp class=\"p3\">3. Improve the performance and stability of the system.\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Tools for Stress Testing WebSocket\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. autocannon : An easy-to-use HTTP and WebSocket testing tool.\u003C\u002Fp>\u003Cp class=\"p3\">2. wrk : An efficient HTTP testing tool (supports WebSocket through scripts).\u003C\u002Fp>\u003Cp class=\"p3\">3. Custom Go Script : Use Go to create a WebSocket Client to simulate usage.\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>How to Use autocannon with WebSocket:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. Install autocannon.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">npm install -g autocannon\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">2. Run autocannon to test WebSocket.\u003C\u002Fp>\u003Cp class=\"p3\">Assuming the WebSocket Server is running at \u003Ca href=\"ws:\u002F\u002Flocalhost:8080\u002Fws:\">ws:\u002F\u002Flocalhost:8080\u002Fws:\u003C\u002Fa>\u003C\u002Fp>\u003Cp class=\"p3\">Explanation :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">c 100 : Number of simultaneous connections (100 connections).\u003C\u002Fli>\u003Cli class=\"li3\">d 30 : Duration of the test (30 seconds).\u003C\u002Fli>\u003Cli class=\"li3\">p 10 : Number of concurrent requests per connection (10 requests).\u003C\u002Fli>\u003C\u002Ful>\u003Cp class=\"p3\">Result: autocannon will display results such as the number of requests per second (Requests\u002Fsec) and latency.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">autocannon -c 100 -d 30 -p 10 ws:\u002F\u002Flocalhost:8080\u002Fws\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Creating Stress Testing with Go\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">For flexibility, we can write a Go program to simulate a large number of WebSocket connections. Example code for Stress Testing with Go.\u003C\u002Fp>\u003Cp class=\"p3\">Explanation :\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">clientCount : Number of connections to test.\u003C\u002Fli>\u003Cli class=\"li3\">testConnection : Function to simulate connections and send messages.\u003C\u002Fli>\u003Cli class=\"li3\">sync.WaitGroup : Used to wait for all connections to complete.\u003C\u002Fli>\u003C\u002Ful>\u003Cpre>\u003Ccode class=\"language-plaintext\">package main\n\nimport (\n    \"log\"\n    \"net\u002Furl\"\n    \"sync\"\n    \"time\"\n\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n)\n\nfunc testConnection(id int, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    u := url.URL{Scheme: \"ws\", Host: \"localhost:8080\", Path: \"\u002Fws\"}\n    conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)\n    if err != nil {\n        log.Printf(\"Client %d: Error connecting: %v\", id, err)\n        return\n    }\n    defer conn.Close()\n\n    for i := 0; i &lt; 10; i++ { \u002F\u002F ส่งข้อความ 10 ครั้ง\n        msg := []byte(\"Hello from client \" + string(id))\n        if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {\n            log.Printf(\"Client %d: Error writing message: %v\", id, err)\n            return\n        }\n        _, response, err := conn.ReadMessage()\n        if err != nil {\n            log.Printf(\"Client %d: Error reading response: %v\", id, err)\n            return\n        }\n        log.Printf(\"Client %d: Received: %s\", id, response)\n        time.Sleep(500 * time.Millisecond) \u002F\u002F เว้นช่วงเวลา\n    }\n}\n\nfunc main() {\n    var wg sync.WaitGroup\n    clientCount := 100\n\n    for i := 0; i &lt; clientCount; i++ {\n        wg.Add(1)\n        go testConnection(i, &amp;wg)\n    }\n\n    wg.Wait()\n    log.Println(\"Stress test completed\")\n}\n \u003C\u002Fcode>\u003C\u002Fpre>\u003Cp class=\"p3\">\u003Cstrong>Analyzing Results\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">After testing, you should analyze:\u003C\u002Fp>\u003Cp class=\"p3\">1. CPU and RAM usage : Check if resources are sufficient.\u003C\u002Fp>\u003Cp class=\"p3\">2. Latency : The time taken to respond to requests.\u003C\u002Fp>\u003Cp class=\"p3\">3. Failed connections : The number of unsuccessful or dropped connections.\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>Performance Improvements After Testing\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp class=\"p3\">1. Increase Cluster Size : If the system cannot support a large number of users, add servers to the Cluster.\u003C\u002Fp>\u003Cp class=\"p3\">2. Use Load Balancer : Such as NGINX or Kubernetes to distribute requests.\u003C\u002Fp>\u003Cp class=\"p3\">3. Implement Rate Limiting : Limit requests per user to reduce server load.\u003C\u002Fp>\u003Cp class=\"p4\">&nbsp;\u003C\u002Fp>\u003Cp class=\"p3\">\u003Cstrong>In Summary\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul class=\"ul1\">\u003Cli class=\"li3\">Stress Testing helps you understand the limits of your system.\u003C\u002Fli>\u003Cli class=\"li3\">Use tools like autocannon or write Go programs to test.\u003C\u002Fli>\u003Cli class=\"li3\">Analyze results to make decisions on performance improvements.\u003C\u002Fli>\u003C\u002Ful>","28_11zon_b2kt05mu0p.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F9g1q4fwper4nih9\u002F28_11zon_b2kt05mu0p.webp","2026-03-04 08:34:12.922Z","",{"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:32:51.346Z","tmzmy6jyz1n35rr","Go Programming","2026-04-10 16:08:01.434Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:33:59.808Z","qw7jy92h0uqd9wq","Go coding","2026-04-10 16:08:04.850Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:34:00.521Z","44l3qn47xjhwgf8","Stress Testing","2026-04-10 16:08:05.159Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:34:00.920Z","ecac9y661or1xka","WebSocket","2026-04-10 16:08:05.227Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:34:01.966Z","ghty2n4xg198of4","Performance Testing","2026-04-10 16:08:05.635Z",{"collectionId":17,"collectionName":18,"created":59,"created_by":13,"id":60,"name":61,"updated":62,"updated_by":13},"2026-03-04 08:34:02.872Z","xntux9h6g6sr5zv","Bottlenecks","2026-04-10 16:08:05.936Z",{"collectionId":17,"collectionName":18,"created":64,"created_by":13,"id":65,"name":66,"updated":67,"updated_by":13},"2026-03-04 08:34:05.331Z","4afb4o90hl68kk4","Connection Simulation","2026-04-10 16:08:06.877Z",{"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:20:33.316Z","ln1ntwattzmxo0o","programming","2026-04-10 16:07:27.299Z",{"collectionId":17,"collectionName":18,"created":84,"created_by":13,"id":85,"name":86,"updated":87,"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":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","eua5wmxw3za1457",226,"9g1q4fwper4nih9",[20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100],"2025-01-27 04:42:38.713Z","Learn how to conduct Stress Testing for WebSocket using Go to measure system limits and improve performance.","go-stress-testing-websocket","2026-04-25 02:47:29.975Z",{"en":137}]