Pada tingkat permukaan, satu-satunya hal yang saya punya pertanyaan adalah memesan grup tunggu yang bertambah dan mengquery pekerjaan:
func (s *Scheduler) Enqueue(req interface{}) {
select {
case s.reqChan <- req:
s.wg.Add(1)
}
}
Saya tidak berpikir hal di atas akan menyebabkan banyak masalah dalam praktik dengan beban kerja yang besar ini, tetapi saya pikir itu mungkin kondisi balapan yang logis. Pada tingkat konkurensi yang lebih rendah dan ukuran kerja yang lebih kecil, ini mungkin mengantrekan pesan, beralih ke goroutine yang mulai bekerja pada pesan itu, MAKA pekerjaan di grup tunggu.
Selanjutnya apakah Anda yakin process
metode threadsafe?? Saya berasumsi demikian berdasarkan dokumentasi redis go, apakah berjalan dengan go run -race
punya keluaran?
Pada titik tertentu Ini benar-benar masuk akal dan diharapkan kinerja menurun. Saya akan merekomendasikan memulai tes kinerja untuk melihat di mana latensi dan throughput mulai menurun:
mungkin kumpulan 10, 100, 500, 1000, 2500, 5000, 10000, atau apa pun yang masuk akal. IMO sepertinya ada 3 variabel penting untuk disetel:
- Ukuran kumpulan pekerja
- Ukuran Penyangga Antrian Kerja
- Meredis
MaxActive
Hal terbesar yang muncul adalah tampilannya seperti redis.Pool dikonfigurasi untuk memungkinkan jumlah koneksi yang tidak terbatas:
pool := &redis.Pool{
MaxIdle: 50,
IdleTimeout: 240 * time.Second,
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
Dial: func() (redis.Conn, error) {
return dial("tcp", address, password)
},
}
// Jumlah maksimum koneksi yang dialokasikan oleh kumpulan pada waktu tertentu.// Ketika nol, tidak ada batasan jumlah koneksi di kumpulan.MaxActive int
Saya pribadi akan mencoba memahami di mana dan kapan kinerja mulai menurun sehubungan dengan ukuran kumpulan pekerja Anda. Hal ini dapat mempermudah untuk memahami batasan program Anda.