Handling 1 Million Requests per Minute with Go

Get Started. It's Free
or sign up with your email address
Rocket clouds
Handling 1 Million Requests per Minute with Go by Mind Map: Handling 1 Million Requests per Minute with Go

1. parallelize the job processing into a single Go routine

1.1. Chạy vòng lặp for qua một mảng các payloads

1.2. Với mỗi payload, chạy một goroutine để upload payload đó lên S3

1.3. Upload có thể mất nhiều thời gian, do đó các goroutine sẽ phải "xếp hàng" và chạy xen kẽ nhau

1.4. Sau khi tất cả các payload được upload hết, server trả về status 200

2. The problem

2.1. Handle millions of POST requests

2.1.1. JSON: {payload_1, payload_2, ..., payload_n}

2.1.2. Payload structure in Go

3. Naive approach to Go routines

3.1. Problem

3.1.1. Không thể kiểm soát số lượng Goroutines được sinh ra để handle số lượng payload

4. Trying again

4.1. Use buffered channel

4.1.1. Tạo một channel Queue chứa các payload

4.1.2. Channel Queue chứa tối đa MAX_QUEUE payload

4.1.3. Chạy vòng lặp qua mảng Payloads

4.1.4. Lần lượt nhét từng payload vào channel Queue

4.1.5. Lần lượt lấy từng payload ra khỏi channel để xử lý

4.2. Problem

4.2.1. Single synchronous processor chỉ có thể upload 1 payload mỗi lần

4.2.2. Tốc độ upload < Tốc độ nhận payload từ client gửi lên

4.2.3. Buffered channel quickly reach MAX_QUEUE limit

4.2.4. Request handler sẽ bị block cho đến khi có một payload được upload lên

5. The Better Solution

5.1. Job

5.1.1. Là một struct chứa 1 trường

5.1.1.1. Payload

5.1.1.1.1. Có kiểu dữ liệu là một struct: Payload

5.2. Worker

5.2.1. Là một struct

5.2.1.1. 3 trường:

5.2.1.1.1. WorkerPool

5.2.1.1.2. JobChannel

5.2.1.1.3. quit

5.2.1.2. 2 methods

5.2.1.2.1. Start

5.2.1.2.2. Stop

5.3. JobQueue

5.3.1. Một biến có kiểu dữ liệu là một channel chứa các Job

5.4. payloadHandler

5.4.1. Là một hàm được thực thi khi user gọi đến API /payload

5.4.1.1. Đọc dữ liệu payload do client gửi lên

5.4.1.2. Với mỗi payload, tạo một struct Job và đẩy struct đó vào trong JobQueue

5.5. Dispatcher

5.5.1. Là một struct

5.5.1.1. chứa 2 trường

5.5.1.2. 2 methods

5.5.1.2.1. Run

5.5.1.2.2. dispatch

5.6. NewDispatcher

5.6.1. Là một function trả về một giá trị có kiểu Dispatcher

5.6.1.1. nhận một biến maxWorker kiểu int

5.6.1.2. Tạo một biến pool

5.6.1.2.1. nhận một giá trị là một buffered channel chứa các channel của các Job. Buffered channel này có capacity là maxWorker

5.6.1.3. Gán biến pool cho trường workerPool của struct Dispatcher