Коли кілька воркерів спільно використовують пул через Redis, впорядкована множина може реалізувати просту політику: обирати придатний проксі з найменшою кількістю записаних призначень. Зберігайте ідентифікатор проксі як елемент, а кількість його призначень як бал.

Для пулу, що обслуговує дозволені публічні запити, список безкоштовних проксі може надати кандидатів у кінцеві точки для оцінювання за правилами придатності цього пулу. Ініціалізуйте придатні елементи узгодженим початковим числом. Потім зробіть вибір і збільшення однією серверною операцією:

local chosen = redis.call('ZRANGE', KEYS[1], 0, 0)[1]
if not chosen then
    return nil
end

redis.call('ZINCRBY', KEYS[1], 1, chosen)
return chosen

Передайте ключ впорядкованої множини як єдиний ключовий аргумент скрипту через інтерфейс EVAL вашого клієнта Redis. Порожній пул дає результат null, який застосунок має обробити, не надсилаючи запиту.

Навіщо об'єднувати дві команди?

Окремі читання та збільшення дозволяють двом воркерам побачити той самий мінімум до того, як хтось його оновить. Redis виконує скрипт Lua атомарно, тому інший воркер не може вставити вибір між читанням і збільшенням цього скрипту. Тримайте скрипт коротким, бо його виконання блокує іншу роботу Redis.

ZRANGE повертає найнижчий бал першим; рівні бали вирішуються порядком елементів, а не випадково. ZINCRBY збільшує бал вибраного елемента на одиницю для наступного призначення.

Визначте, що означає бал

Це рахує призначення, включно з призначенням, мережевий запит якого згодом зазнає невдачі. Він не вимірює затримку, успішні запити чи роботу, що триває. Повторний вибір єдиного придатного елемента все ще можливий; скрипт не резервує його виключно.

Підтримуйте придатність за правилами здоров'я та політики пулу. Якщо ви видалите елемент і згодом відновите його, вирішіть, чи зберігати його історичне число. Запуск відновленого проксі з нуля може зосередити на ньому призначення, поки він наздоганяє.

Політика найменшої одночасності потребує іншого життєвого циклу, включно із завершенням і обробкою покинутих завдань. Не тлумачте цей накопичувальний лічильник як той життєвий цикл.

Схожі статті