commit 07c3e411e9c7e52c4c6777e79564fafbfd99989c Author: Arne Maier Date: Sun Nov 10 20:55:10 2024 +0100 Throttling with bug diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5ce793b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/kordondev/meeting + +go 1.22.0 diff --git a/main.go b/main.go new file mode 100644 index 0000000..88b6bae --- /dev/null +++ b/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + "fmt" + "github.com/kordondev/meeting/throttling" + "net/http" + "slices" + "time" +) + +const burstLimit = 2 + +func main() { + throttles := make(map[string]<-chan time.Time) + calledLastHour := make([]string, 0) + + http.HandleFunc("/", serveIndexFile) + http.HandleFunc("/input.txt", serveInputFile) + http.HandleFunc("/result", func(w http.ResponseWriter, r *http.Request) { + tryResult(w, r, throttles, calledLastHour) + }) + + err := http.ListenAndServe(":3333", nil) + if err != nil { + fmt.Printf("http.ListenAndServe() failed with %s\n", err) + } +} + +func serveIndexFile(w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, "static/index.html") +} + +func serveInputFile(w http.ResponseWriter, r *http.Request) { + fmt.Println(r.RemoteAddr) + http.ServeFile(w, r, "static/input.txt") +} + +func tryResult(w http.ResponseWriter, r *http.Request, throttles map[string]<-chan time.Time, calledLastHour []string) { + clientIP := r.RemoteAddr + clientResult := r.URL.Query().Get("result") + fmt.Println(clientIP, clientResult) + if slices.Contains(calledLastHour, clientIP) { + calledLastHour = append(calledLastHour, clientIP) + } + throttle, ok := throttles[clientIP] + if !ok { + fmt.Println("Creating new throttle") + throttle = throttling.CreateThrottle(r.Context(), burstLimit) + throttles[clientIP] = throttle + } + payload := throttling.Payload{ + R: r, + W: w, + ClientResult: clientResult, + } + + throttling.CallFunction(context.TODO(), &CheckResult{}, &payload, throttle) +} + +type CheckResult struct { +} + +func (*CheckResult) Call(payload *throttling.Payload) { + w := payload.W + r := payload.R + + fmt.Println("Serve now") + if payload.ClientResult == "12" { + http.ServeFile(w, r, "static/success.html") + } + http.ServeFile(w, r, "static/fail.html") +} diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..e69de29 diff --git a/static/fail.html b/static/fail.html new file mode 100644 index 0000000..e3a9d85 --- /dev/null +++ b/static/fail.html @@ -0,0 +1,11 @@ + + + + + + Nicht so schnell + + +fail + + \ No newline at end of file diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..e121743 --- /dev/null +++ b/static/index.html @@ -0,0 +1,19 @@ + + + + + + Informatikertreffen + + + +
+ + +
+ +
+ + + + \ No newline at end of file diff --git a/static/input.txt b/static/input.txt new file mode 100644 index 0000000..fb2a74a --- /dev/null +++ b/static/input.txt @@ -0,0 +1,2500 @@ +A C +C A +A C +A C +C B +C B +A C +A B +C B +A B +A C +A C +A C +A B +A C +A B +C B +C A +A B +C B +C B +C A +A C +C B +C A +A A +A B +A C +A B +A B +C A +C A +B B +C A +C A +A B +A C +A C +A A +A C +A C +C B +A C +A C +A B +C A +C B +C A +B A +C C +A B +A C +A C +A C +A B +A B +C A +A B +A C +C B +A B +A B +A C +A C +C B +A C +C B +A B +A C +A C +C B +B C +A C +A C +A C +A C +C A +C A +A B +A A +A B +A C +A C +C A +A C +C A +A C +C B +C A +A C +A C +A C +A C +C A +C B +A C +A C +C B +A C +B C +C A +A C +A A +C A +A C +C C +A C +C A +A C +A B +C A +C C +A C +C A +C B +A C +B C +B B +A A +A A +A A +A C +A C +A A +A C +A A +A C +A C +C A +C A +B C +A C +A B +A C +A C +A C +A C +C A +C A +C A +A C +A C +A C +A C +A A +A B +A B +C A +C A +B C +C A +A A +A C +A C +C A +C C +A C +A C +C B +A A +A C +C B +A A +A B +A B +A B +C B +A C +A C +C A +C A +C A +C A +B C +C B +C A +C A +A B +A B +A C +A C +A A +C A +A C +B C +A C +C A +A B +A C +A C +A B +A B +A C +C A +A B +C A +C A +A C +A B +C A +A C +A C +A B +A C +A C +C B +C C +A B +A C +C A +C A +A C +A C +C B +A B +A C +A B +A C +C A +A C +A C +C A +A B +A B +C B +A C +C B +A C +A C +C B +A B +B C +C B +C A +C A +A C +C B +A A +C B +A C +A B +A C +C A +C A +C B +C B +A B +A C +C A +C A +A B +A A +A B +B C +A B +C B +C A +C A +A A +C A +B C +A A +C B +C A +C A +A A +A C +B C +A C +A C +A B +A A +A C +C A +A A +C B +A C +A C +A A +A C +A C +C A +C A +A C +A C +A C +A A +A C +A A +B B +A C +A B +C B +A C +C A +A C +C A +A B +A C +C A +C B +A B +C B +A C +C A +A C +A C +C A +A B +A C +A A +A C +A C +A C +B B +C A +A A +A C +A C +C B +C B +C A +C A +C A +A A +A A +A C +A A +A B +A C +A B +A C +C B +C C +A B +A C +A C +A A +A C +A C +C A +C B +A B +C A +C A +A C +C A +C A +C A +A A +A C +A C +A C +A C +B B +A B +A B +A C +C A +A B +A C +C A +A C +C C +A B +C A +A C +B C +A B +A A +A C +C A +A C +A C +A C +A C +A C +B C +A C +C A +A B +C A +A C +A C +A B +A C +B C +C A +A B +C B +A C +A C +C A +C A +A B +C A +C B +B C +A B +C A +A B +C A +A A +A B +A C +A C +A B +C A +A A +C A +B B +A C +A B +B B +A B +C A +A C +A C +C A +C B +A B +C A +C B +A B +A C +A A +B C +C A +A C +A B +A C +B C +A C +A A +C B +A A +A C +A B +C B +A C +C B +A C +C A +C A +A B +C A +C A +A B +A C +A C +A B +A A +C B +A C +A C +C A +A A +A C +C C +A C +C B +A C +C A +A C +A C +A A +C A +C A +C B +B C +B B +C B +A B +A A +A C +C A +A B +A B +A C +A C +C C +C A +C A +C A +A C +C A +A C +A C +A B +C B +C A +C A +C A +A B +C A +B C +C A +A C +C B +A B +C B +A C +A C +C A +A A +A C +A B +A C +B A +C C +A C +C C +A A +C A +C A +C A +C A +A C +A B +A C +A C +A C +A C +A C +C C +C B +C B +C A +C B +A C +C A +C A +A C +A C +C A +C B +C B +A C +A A +C B +C B +C A +A B +C A +A C +A C +A B +C B +A B +C A +C A +A C +A C +C B +A C +C A +A B +A B +A C +C B +A C +C A +A B +A C +A C +A C +A C +C B +A B +C B +A C +A C +A A +A B +A B +A C +C B +A C +A A +A C +B C +C A +C A +C B +A C +A C +C A +C C +A C +C A +C B +A C +B C +A C +B C +A A +A B +A C +A C +A C +A C +C B +A C +A C +A C +B C +A C +C A +C A +A C +C A +A A +A C +A B +A B +A A +A C +A C +A C +A C +B C +A C +C B +C B +C A +C A +B C +C B +A C +C B +A C +A B +C B +A A +A B +C A +A B +C A +A C +A C +B C +A B +C B +C A +A C +A C +C A +A B +A C +A C +A A +A B +A B +A B +A C +A B +A C +C A +A A +A C +A C +C B +A C +C A +A C +C B +A B +A C +A C +A C +A C +C B +A A +A C +A C +A B +A C +B C +A A +A B +C A +C A +A B +A C +C B +A C +A B +A B +A C +A B +A B +A C +A C +A C +C A +A C +A B +A C +A C +C B +A C +C A +A B +C A +C B +A C +C B +A C +A B +C B +C B +A C +C A +C A +C A +A C +A C +A B +C A +A C +A A +A C +A C +C A +A C +C B +A B +A C +A B +A C +A C +C B +A C +C A +A C +A A +A C +A C +C A +A C +A C +C B +C A +A C +C B +C A +C A +A C +A C +A C +A A +C A +A C +A C +C B +A B +C A +A B +C A +C B +A B +A C +C A +A C +B B +A A +B C +A B +A A +C B +A C +A A +A C +A C +C B +A C +B C +C A +C A +B B +A C +A C +A C +C B +C A +A C +A B +A B +A B +C B +C A +A C +A A +A A +A A +A C +A C +A C +A C +C A +C A +A C +C A +A B +C A +B C +A C +A C +C A +A C +C A +C A +C A +A B +C B +C A +A B +C A +C B +B C +A C +C A +A C +A A +B C +A B +B B +A C +A C +A A +A C +A A +A C +A C +C A +C B +A A +C B +C A +A C +A C +A C +C B +A A +A B +A C +A B +C A +B C +A C +A B +C C +C A +A C +A C +A C +B C +A A +C A +A C +A C +B C +A C +A C +B C +A C +C A +A C +C A +A C +C A +A C +C B +A C +A A +A B +A B +C A +A B +C A +B C +A C +A C +A C +A C +C A +A C +C A +A C +A B +A C +B C +A B +C C +A B +C A +A C +A C +A B +B C +A A +C B +A C +A B +A C +A B +A B +A C +A C +A C +A A +A C +C B +A B +A A +A B +C A +A B +C A +A A +C A +A C +C B +A B +A C +A C +A A +A B +C A +C A +A B +A A +A C +B C +A B +A C +A A +A C +B B +A B +A B +A C +C A +A C +A C +A B +A C +C C +A C +A C +A C +A C +C B +C B +A B +B C +C B +A B +C B +A C +A C +A C +A C +C B +A C +A C +C B +C A +A B +A B +A C +C A +C C +C A +C A +A C +A C +A B +A C +A A +C B +A C +A C +C B +C A +A A +A C +A C +A A +C A +C A +C A +A C +A A +C A +C B +A A +A C +C A +A C +A C +C A +A B +A C +A C +A B +A C +C A +A C +A C +C A +A B +A C +A C +C A +A C +A B +A C +C B +A A +A C +A C +C A +A C +A B +C B +B C +A C +A B +C A +A C +B C +A C +C C +A A +A C +A C +C B +A C +A B +C A +C B +A C +A C +A B +A A +C B +A B +C A +C B +A C +C B +A C +C A +A C +A C +A A +A C +A C +B A +A A +A C +C B +A C +A A +C A +A C +A C +C A +C B +C B +A A +A B +C B +A B +A C +A C +A C +A C +A B +C A +C A +C B +C A +A C +A A +B C +B B +C A +C B +A B +A C +A B +C A +C C +A C +A B +C B +C A +A C +A C +A B +C A +C C +C B +A C +C A +C B +A A +A A +A B +A C +B C +A A +A B +A B +C A +C B +A C +A A +A C +A A +A B +A C +A C +A C +C A +A C +A C +A C +C C +C B +C B +A C +C B +C B +C B +C A +A C +C A +C A +A C +A B +A C +A C +A A +A B +A B +C A +C A +A C +A C +A C +A C +A B +A C +A C +A C +A C +A A +A A +A B +A A +C B +A B +A C +C A +A B +A B +A C +A C +A C +C A +A C +C A +C A +C B +A B +A C +A B +A C +C A +C A +A C +A C +A C +C A +A A +A C +A C +C B +C B +A B +A B +A C +A C +C B +C A +C B +A A +C B +C A +C B +A C +A C +A A +C B +C B +A C +A B +C A +A A +B C +A C +C A +A B +A A +A C +A C +A C +C B +C A +A C +C A +A C +A C +A B +A C +A B +A A +A C +C C +A C +A C +A C +A A +A C +A A +C A +A C +A C +C B +A A +A C +C A +C A +A B +A C +A C +C A +B A +A C +C B +A C +C A +A B +A C +C A +A A +A C +A A +A C +C A +A C +A A +A C +C A +C B +A B +A A +A A +A C +C B +C B +A B +A B +A B +A A +A C +A C +A C +C B +C B +A B +B A +B A +A C +C A +C A +A C +C B +C A +A C +A C +A C +A C +C A +A C +A C +C B +A B +C B +A C +C B +C B +A C +C A +A C +A A +A C +C A +C A +A B +B C +A B +C B +A C +C B +A A +C A +A B +C A +A C +C C +C B +A C +C A +C B +A C +A A +A C +A C +A C +C A +A C +A C +A C +A C +A C +A C +A C +A C +A C +A B +A C +A A +A B +C B +B B +C A +B C +A C +A C +A B +B C +A C +A C +C A +C B +C A +A B +A A +C A +C B +A B +C A +C B +A C +A C +A C +A B +C A +A B +C A +B C +A C +A B +A C +A C +A B +C A +A C +C A +C B +A B +A C +B C +C A +A B +C A +A B +A C +C A +A A +C A +B B +C A +A C +A B +A C +A B +A A +C A +C A +A B +C A +A B +A B +A A +B B +A B +C A +C A +A B +B C +B A +B C +A B +A C +C B +A B +B B +A C +C A +A C +A C +A C +A C +B C +C A +C B +A C +C B +C B +A A +C A +A C +A C +A C +C A +C A +C A +A B +C C +C C +A C +C A +A B +A C +A C +A C +C A +A C +A A +A C +A C +A C +A C +A B +C B +C A +A A +A B +C A +A A +A C +A C +C A +A C +A A +A C +A C +A A +A C +A C +A A +A C +A A +B B +A B +A B +C B +A C +A B +C A +A C +A B +A A +C B +B A +C B +A C +C A +A B +A C +A B +A A +C B +A C +A C +C B +C A +A C +C A +A B +C A +A C +A B +A C +A C +A C +A B +A C +C A +C A +A A +C A +C A +A C +C A +A C +C B +C A +A C +A C +A C +C A +A A +C B +A C +C B +A A +A C +C A +A C +A C +A A +A C +C A +B A +A C +A C +A C +C A +A B +A B +A A +C B +C B +A C +A B +A C +A C +C A +A A +A B +A C +A C +A C +A C +B C +C A +C A +C A +A C +C C +A A +C A +A C +C B +A C +A C +A B +A B +C A +A C +A A +A C +A C +A C +A C +C B +A C +A B +A A +A A +A C +C A +A A +A A +A C +A B +C A +A C +A C +A B +A C +B C +C A +C A +C C +C B +C A +A C +C B +A C +C C +A C +A B +A B +A A +A A +A C +A B +A B +A B +A B +A C +C B +A C +A C +C A +A C +A C +C B +A B +C A +A B +C A +A C +B C +A A +B A +A B +A A +A B +B C +A B +A C +C B +C B +A C +A A +A C +A C +C C +A C +A B +C A +A B +C A +A A +A B +C B +A B +A C +A C +C A +C A +B C +A C +A C +A A +C A +C B +A C +A C +A A +C A +C C +A C +C B +A B +B C +C B +A C +C A +A A +A C +A C +A C +A B +C B +A C +C B +A C +A C +A C +A C +A B +C A +A B +C B +B C +A C +C A +C B +A C +C A +A C +C A +C C +A C +C A +C A +A C +A C +A B +A B +A B +C A +A B +A C +A C +A C +A C +A C +A C +A B +A C +A A +C B +A C +A C +A C +A B +A C +A C +A C +A C +C A +B C +A C +A B +A B +A A +A C +A C +C C +A C +C A +A B +A A +B C +A C +A C +A C +C B +C C +C A +A C +C B +C B +C B +C A +B C +A C +A C +C C +A A +A C +A C +A C +C A +A C +A C +C B +C B +A C +A C +C A +A B +C B +C B +A C +A C +A A +A C +A C +A A +A A +C A +A C +A A +C A +C A +A C +A A +A C +C A +C A +C A +C B +A C +A C +A A +A C +A B +A C +A C +C B +A C +A C +A C +A A +A C +C A +A A +A C +A C +A C +A C +A C +A C +A C +A B +A A +A B +A A +C B +A C +A C +C A +A C +A C +A C +A A +A C +A C +A B +C A +A B +A C +C A +A A +A B +A C +A C +A A +A C +A B +C A +A B +A C +A C +A C +A C +C A +C B +A C +B C +C A +A C +A C +C B +C B +C A +A A +C B +B B +A C +A C +A C +C B +A C +A A +A B +A C +A C +A C +C B +A C +C B +C A +A C +A C +A C +A C +A C +A A +A C +A C +C A +A C +A B +C C +A C +A C +A C +B A +C A +A C +A C +A C +A C +C A +A C +A C +A B +A A +C A +C B +A A +A B +C A +A C +A C +C A +C A +A C +C A +A C +A B +C A +A C +B A +B B +A A +C B +A A +A B +C B +A C +A C +A C +C A +A C +A A +A C +C B +A C +A C +C A +A C +A C +A B +A C +A A +A B +A C +C A +C B +B A +C B +A B +A C +C A +A C +C A +C B +A A +A A +A C +A C +C B +A B +A B +A C +A C +C A +A A +C A +A A +A B +C A +A C +A C +B B +A C +A C +A C +A C +A C +A A +A B +A A +A C +A C +C A +A B +A C +C B +C A +C A +C A +C A +C B +A A +A A +C B +A A +A B +A B +B C +A C +B B +C B +A A +A B +A C +A C +A C +A A +C A +A C +A C +A C +A C +A C +A B +A C +B C +A C +A C +A B +C B +C B +C A +A C +A A +C A +A B +B C +C A +A C +C A +C B +C B +A A +A A +C A +A C +A C +A B +A A +A A +A C +C B +B A +A C +A C +A C +A C +A B +A B +A C +C B +C B +A A +A C +A C +C B +A B +A B +A A +A B +A A +A A +A A +A C +A C +A B +A C +C A +A C +A B +A C +A C +A B +A C +A C +C A +A C +A B +A C +A C +A C +A C +A C +A C +A B +C A +B C +C C +A C +A B +A A +A A +C B +C B +A A +C A +B C +A C +C A +A C +A C +A C +A C +A C +A C +A C +A B +A C +A C +A B +A C +A B +A B +A C +A C +A B +A C +C B +A C +A C +A C +C A +C A +A C +C B +A C +A C +C A +A C +C A +A B +A C +C B +A C +A C +C A +C B +A C +C A +C A +A A +A B +C B +A B +A C +C A +A C +A C +A A +A C +C B +A C +C A +A C +C A +A C +C A +A B +C B +A A +A C +A C +C B +A A +A C +A B +B C +A C +A A +A C +A C +A A +C A +A C +A C +C B +A C +A B +A C +C B +A C +A B +A C +C C +A B +A C +A B +C B +A C +C A +A A +B C +C A +C A +A C +A C +A B +A A +A C +A C +B C +A C +C C +A A +A C +A C +A C +A C +A A +A A +A C +A A +A C +A C +A C +A A +C A +C B +A A +C A +C A +A C +A A +C B +B C +A C +A C +C A +B A +A C +A C +C A +C A +B C +C B +A C +A C +C A +A A +A B +C B +C B +B C +A B +C A +A C +A C +A B +C A +A C +A C +C A +C B +A C +C A +C B +C B +C A +C B +A C +C B +A C +C A +A C +C B +C C +A C +B C +A C +C A +C A +B B +B C +C B +C A +C A +A B +C A +C A +A C +A B +A C +C A +A A +A C +A C +A C +A C +A C +A C +A C +C A +C A +A C +C B +C A +A C +B C +A C +A C +A A +C A +A B +A C +A C +A B +A A +C B +B A +A C +A A +C B +C A +C A +C B +C B +A C +A C +C B +A C +A B +C B +A B +C A +A C +C A +C B +C B +A C +A C +A A +A B +A C +A A +A C +A C +A C +C B +A C +A C +C A +C B +A C +A C +A C +C B +C A +A C +C A +A C +A C +A C +A A +A C +A C +A B +B C +A C +A C +A C +C B +A C +B C +A C +C C +A C +A B +C A +C B +C A +C A +A C +A C +A B +A B +A C +A B +B C +C B +A B +A C +C A +A C +A C +C B +A B +A C +A B +C B +A C +A C +A A +B C +A C +A A +C A +A C +C B +C B +A C +B B +A B +A C +A C +A C +A C +C A +C A +A C +C A +A B +A C +A C +C B +A C +A C +C B +C A +B C +A B +A B +C A +C A +A C +A A +B C +A C +C B +A C +A B +A C +A C +A B +C B +C A +A C +C A +A C +C B +A C +C B +A B +A C +A B +A C +C A +A C +A C +C A +A C +B B +A C +A C +C B +C A +C A +A C +A C +C A +B C +A B +A C +A B +A C +A C +A B +A A +C A +C A +A A +A C +A B +A B +A C +A B +A C +A C +C B +A A +A C +A C +C A +A C +A A +B A +C A +A C +A B +B C +C A +C B +A C +B C +C B +A C +A C +A A +A C +A C +A C +A C +A C +A C +A C diff --git a/static/success.html b/static/success.html new file mode 100644 index 0000000..98f125b --- /dev/null +++ b/static/success.html @@ -0,0 +1,11 @@ + + + + + + Willkommen + + +Success + + \ No newline at end of file diff --git a/text.txt b/text.txt new file mode 100644 index 0000000..05a1cf7 --- /dev/null +++ b/text.txt @@ -0,0 +1,31 @@ +Die Türsteher veranstallten ein Schere-Stein-Papier-Turnier zwischen den Wartenden. Nur die Besten dürfen zu dem Treffen. + +Schere-Stein-Papier ist ein Spiel zwischen zwei Spielern. Jedes Spiel besteht aus mehreren Runden; in jeder Runde wählen die Spieler gleichzeitig eine der Optionen Stein, Papier oder Schere durch eine Handgeste. Dann wird ein Gewinner für die Runde bestimmt: Stein schlägt Schere, Schere schlägt Papier und Papier schlägt Stein. Wählen beide Spieler die gleiche Form, endet die Runde unentschieden. + +Plötzlich bekommst du von einer unbekannten Nummer: Einen verschlüsselten Strategie-Leitfaden (deine Puzzle-Eingabe), von dem gesagt wird, dass er dir sicher helfen wird zu gewinnen. „Die erste Spalte zeigt, was dein Gegner spielen wird: A steht für Stein, B für Papier und C für Schere. Die zweite Spalte—“ Plötzlich ein Funkloch und der Rest der Nachricht fehlt. + +Du folgerst, dass die zweite Spalte das zeigt, was du als Reaktion spielen solltest: A für Stein, B für Papier und C für Schere. Immer zu gewinnen wäre verdächtig, also müssen die Antworten sorgfältig gewählt worden sein. + +Der Gewinner des gesamten Turniers ist der Spieler mit der höchsten Punktzahl. Deine Gesamtpunktzahl ist die Summe deiner Punkte für jede Runde. Die Punktzahl für eine einzelne Runde setzt sich zusammen aus der Punktzahl für die gewählte Form (1 für Stein, 2 für Papier und 3 für Schere) plus der Punktzahl für das Ergebnis der Runde (0, wenn du verloren hast, 3, wenn die Runde unentschieden endete, und 6, wenn du gewonnen hast). + +Da du dir nicht sicher sein kannst, ob dir die unbekannte Person wirklich helfen will oder dich täuschen möchte, solltest du die Punktzahl berechnen, die du erreichen würdest, wenn du den Strategie-Leitfaden befolgst. + +Zum Beispiel, nehmen wir an, du bekommst den folgenden Strategie-Leitfaden: + +A B +B A +C C + +Dieser Strategie-Leitfaden sagt Folgendes voraus und empfiehlt: + + • In der ersten Runde wird dein Gegner Stein (A) wählen, und du solltest Papier (B) wählen. Dies führt zu einem Sieg für dich mit einer Punktzahl von 8 (2 Punkte, weil du Papier gewählt hast + 6 Punkte für den Sieg). + • In der zweiten Runde wird dein Gegner Papier (B) wählen, und du solltest Stein (A) wählen. Dies führt zu einer Niederlage für dich mit einer Punktzahl von 1 (1 Punkt + 0 Punkte). + • Die dritte Runde ist ein Unentschieden, da beide Spieler Schere wählen, was dir eine Punktzahl von 6 gibt (3 Punkte für die Wahl von Schere + 3 Punkte für das Unentschieden). + +In diesem Beispiel würdest du, wenn du dem Strategie-Leitfaden folgst, eine Gesamtpunktzahl von 15 erreichen (8 + 1 + 6). + +Was wäre deine Gesamtpunktzahl, wenn alles genau nach dem Strategie-Leitfaden verläuft? + +
+ +Ich hoffe, diese Übersetzung hilft dir weiter! diff --git a/throttling/rateLimit.go b/throttling/rateLimit.go new file mode 100644 index 0000000..6a10de2 --- /dev/null +++ b/throttling/rateLimit.go @@ -0,0 +1,56 @@ +package throttling + +import ( + "context" + "fmt" + "net/http" + "time" +) + +const rateLimit = time.Second * 3 // a call each 3 second + +// Client is an interface that calls something with a payload. +type Client interface { + Call(*Payload) +} + +// Payload is some payload a Client would send in a call. +type Payload struct { + ClientResult string + W http.ResponseWriter + R *http.Request +} + +// CallFunction allows burst rate limiting client calls with the +// payloads. +func CallFunction(ctx context.Context, client Client, payload *Payload, throttle <-chan time.Time) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + <-throttle // rate limit our client calls + client.Call(payload) +} + +func CreateThrottle(ctx context.Context, burstLimit int) <-chan time.Time { + throttle := make(chan time.Time, burstLimit) + for i := 0; i < burstLimit; i++ { + throttle <- time.Now() + } + + go func() { + ticker := time.NewTicker(rateLimit) + defer ticker.Stop() + for t := range ticker.C { + select { + case throttle <- t: + case <-ctx.Done(): + { + fmt.Println("Ticker done") + return // exit goroutine when surrounding function returns + } + } + } + }() + + return throttle +} diff --git a/throttling/rateLimit_test.go b/throttling/rateLimit_test.go new file mode 100644 index 0000000..32af964 --- /dev/null +++ b/throttling/rateLimit_test.go @@ -0,0 +1,32 @@ +package throttling + +import ( + "context" + "fmt" + "testing" + "time" +) + +func TestCallFunction(t *testing.T) { + client := &Callable{} + // create context for app + ctx := context.Background() + + fmt.Println("Starting") + throttle := CreateThrottle(ctx, 2) + CallFunction(ctx, client, &Payload{}, throttle) + CallFunction(ctx, client, &Payload{}, throttle) + CallFunction(ctx, client, &Payload{}, throttle) + time.Sleep(2 * time.Second) + fmt.Println("Continuing") + CallFunction(ctx, client, &Payload{}, throttle) + CallFunction(ctx, client, &Payload{}, throttle) + CallFunction(ctx, client, &Payload{}, throttle) +} + +type Callable struct { +} + +func (c *Callable) Call(p *Payload) { + fmt.Println("Called with payload") +}