Your question is High-Concurrency Performance Fix. Take a moment with it on the right.
Talk me through your thinking if you like. When you're confident, submit your answer and I'll grade it like a real screen (7/10 or better passes).
You're a backend engineer at Aubay Spain, staffed on a client project for a concert ticketing platform. This Go snippet reserves seats when a booking burst comes in right as tickets go on sale, and under real load it panics and oversells seats.
package main
import "fmt"
import "sync"
import "time"
var seatsRemaining = map[string]int{
"A1": 5,
"A2": 3,
}
func reserveSeat(seatID string, wg *sync.WaitGroup) {
defer wg.Done()
remaining := seatsRemaining[seatID]
time.Sleep(10 * time.Millisecond)
if remaining > 0 {
seatsRemaining[seatID] = remaining - 1
fmt.Println("reserved", seatID)
} else {
fmt.Println("sold out", seatID)
}
}
func handleBookingBurst(requests []string) {
var wg sync.WaitGroup
for _, seatID := range requests {
wg.Add(1)
go reserveSeat(seatID, &wg)
}
wg.Wait()
}
Fix this snippet to be correct and to perform well under a high-concurrency burst of booking requests. Explain what you would change and why, without needing to submit a full patch.