# golang traffic shaving ![](https://i.imgur.com/5xlMxTj.png) ![](https://i.imgur.com/zbmiDoy.png) 模擬 time.Sleep(2 * time.Second)模擬server來不及處理這個request 假設 ddos 攻擊runtime.NumGoroutine() 可以做削峰,也可以防止ddos smallPool = make(chan struct{}, 100) 也可為我們的server做buffer ![](https://i.imgur.com/BkNvHCn.png) ![](https://i.imgur.com/EmicRQq.png) ```go= package main import ( "fmt" "io/ioutil" "net/http" "runtime" "strconv" "time" ) var largePool chan struct{} var smallPool chan struct{} var a = 0 //http://localhost:8000/?parameter=value&also=another func main() { smallPool = make(chan struct{}, 100) http.HandleFunc("/endpoint-1", handler) http.ListenAndServe(":8080", nil) } func handler(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Println("all nowgoroutine :", runtime.NumGoroutine()) go func() { smallPool <- struct{}{} defer func() { <-smallPool }() // Let everyone that we are done fmt.Println("working!") time.Sleep(2 * time.Second) fmt.Println("work done") processImage(b) }() a += 1 if runtime.NumGoroutine() < 20 { w.Write([]byte("msg" + strconv.Itoa(a))) w.WriteHeader(http.StatusAccepted) } else { w.WriteHeader(http.StatusNotFound) return } } ```