ຕົວເລືອກພຣັອກຊີແບບວົງກົມຮ່ວມກັນໃນ Go
ຮັກສາຕົວເລືອກພຣັອກຊີ Go ໃຫ້ຄົງຢູ່ລະຫວ່າງຄຳຮ້ອງຂໍ, ປົກປ້ອງສະຖານະການເລືອກຮ່ວມ ແລະ ແຍກການເລືອກເສັ້ນທາງອອກຈາກການເຝົ້າເບິ່ງທາງອອກຂອງມັນ.
ຕົວເລືອກສາມາດໝູນວຽນໄດ້ຢ່າງສົມບູນແລ້ວຍັງເລືອກພຣັອກຊີທຳອິດຢູ່. ຄວາມຜິດແມ່ນການສ້າງຕົວເລືອກໃໝ່ໂດຍບັງເອີນສຳລັບທຸກຄຳຮ້ອງຂໍ, ເຊິ່ງຕັ້ງຕົວນັບຂອງມັນຄືນໃໝ່ກ່ອນທີ່ມັນຈະມີທາງເລືອກທີສອງ.
ສ້າງຕົວເລືອກພຽງເທື່ອດຽວແລະຮັກສາມັນໄວ້ກັບການຂົນສົ່ງ. ລາຍການພຣັອກຊີ HTTP ສາມາດໃຫ້ຜູ້ສະໝັກ HTTP ສາທາລະນະສຳລັບຊຸດ URL ເມື່ອຄຳຮ້ອງຂໍອະນຸຍາດໃຫ້ມີຕົວກາງສາທາລະນະ. ເລີ່ມຈາກລາຍການ URL ພຣັອກຊີທີ່ກວດສອບແລ້ວ ແລະ ບໍ່ຫວ່າງເປົ່າ:
func rotatingProxy(urls []*url.URL) func(*http.Request) (*url.URL, error) {
var mu sync.Mutex
next := 0
return func(*http.Request) (*url.URL, error) {
mu.Lock()
selected := urls[next]
next = (next + 1) % len(urls)
mu.Unlock()
return selected, nil
}
}
ແອັບພລິເຄຊັນທີ່ອ້ອມຮອບຕ້ອງປະຕິເສດລາຍການຫວ່າງເປົ່າ, ກວດສອບ URL ແລະ ໃຊ້ການນຳເຂົ້າປົກກະຕິ net/http, net/url ແລະ sync. ລາຍການຄວນຄົງທີ່ບໍ່ປ່ຽນແປງໃນຂະນະທີ່ຕົວເລືອກນີ້ໃຊ້ມັນ, ຫຼື ຖືກແທນທີ່ດ້ວຍການອອກແບບທີ່ຊິງຄ໌ແຍກຕ່າງຫາກ.
ຕິດຟັງຊັນທີ່ສົ່ງຄືນໃຫ້ກັບ http.Transport ທີ່ຖືກຮັກສາໄວ້ໜຶ່ງອັນ. Mutex ປົກປ້ອງລຳດັບການເລືອກລະຫວ່າງການເອີ້ນກັບທີ່ເກີດຂຶ້ນພ້ອມກັນ. ມັນບໍ່ຮຽກຮ້ອງໃຫ້ຖືກອນຂະນະທີ່ຄຳຮ້ອງຂໍເຄືອຂ່າຍຊ້າກຳລັງສຳເລັດ.
ຢ່າໃຊ້ເສັ້ນທາງພຽງເພື່ອພິມມັນອອກມາ
ການເອີ້ນຕົວເລືອກອີກຄັ້ງສຳລັບຂໍ້ຄວາມວິນິດໄສຈະເຮັດໃຫ້ຕົວນັບກ້າວໜ້າອີກ. ຜົນລັບນັ້ນອາດຈະອະທິບາຍຜູ້ສະໝັກຄົນຕໍ່ໄປ ແທນທີ່ຈະເປັນຜູ້ສະໝັກທີ່ຄຳຮ້ອງຂໍທີ່ທ່ານກຳລັງສືບສວນໃຊ້. ບັນທຶກການເລືອກໄວ້ພາຍໃນການເອີ້ນກັບຕົວຈິງດ້ວຍຕົວຊີ້ບອກຈຸດປາຍທາງທີ່ປອດໄພ.
ການເອີ້ນ callback ບໍ່ແມ່ນຫຼັກຖານວ່າຄຳຮ້ອງຂໍຖືກສົ່ງຢ່າງສຳເລັດ. ການປ່ຽນເສັ້ນທາງ ຫຼື ຄວາມພະຍາຍາມຂົນສົ່ງເພີ່ມເຕີມສາມາດເຮັດໃຫ້ສົມມຸດຕິຖານງ່າຍໆວ່າ «ເອີ້ນແອັບພລິເຄຊັນໜຶ່ງຄັ້ງ, ເລືອກໜຶ່ງຄັ້ງ» ສັບສົນຂຶ້ນ. ຖ້າຂະບວນການເຮັດວຽກຕ້ອງຮັກສາເສັ້ນທາງດຽວຕະຫຼອດຫຼາຍການດຳເນີນງານ, ເລືອກເສັ້ນທາງນັ້ນຢູ່ຂອບເຂດຂອງຂະບວນການ ແທນທີ່ຈະໃຊ້ callback ໝູນວຽນລະດັບໂລກ.
ການໝູນວຽນແບບວົງກົມກໍ່ບໍ່ໄດ້ສັນຍາວ່າຈະມີທາງອອກສາທາລະນະທີ່ແຕກຕ່າງກັນ. ມັນພຽງແຕ່ຈັດຕາຕະລາງຈຸດປາຍທາງ. ຕົວຕົນສຸດທ້າຍຍັງຄົງເປັນຄຸນລັກສະນະຂອງເສັ້ນທາງທີ່ແຕ່ລະຈຸດປາຍທາງໃຫ້.