Чому Redis для черги?
Мені здається, що Redis може стати хорошим кандидатом для впровадження системи черги. До цього моменту ми використовували нашу базу даних MySQL з опитуванням або RabbitMQ. З RabbitMQ у нас виникло багато проблем - клієнтські бібліотеки дуже бідні і невдалі, і ми хотіли б не вкладати занадто багато годин для розробників на їх виправлення, кілька проблем з консоллю управління сервером тощо. І, до цього часу принаймні, ми не хапаємося на мілісекунди або серйозно підштовхуємо продуктивність, так що поки система має архітектуру, яка інтелектуально підтримує чергу, ми, мабуть, у хорошій формі.
Гаразд, так це тло. По суті, у мене дуже класична, проста модель черги - кілька виробників, які виробляють роботу, і кілька споживачів, що споживають роботу, і виробникам, і споживачам потрібно вміти інтелектуально масштабувати. Виявляється, наївний PUBSUB
не працює, оскільки я не хочу, щоб усі підписники споживали роботу, я просто хочу, щоб один абонент отримав роботу. На перший прохід мені BRPOPLPUSH
здається, що це розумна конструкція.
Чи можемо ми використовувати BRPOPLPUSH?
Основна конструкція, з BRPOPLPUSH
якої ви маєте одну чергу роботи та чергу прогресу. Коли споживач отримує роботу, він атомарно штовхає товар у чергу виконання, а коли він закінчує роботу, він LREM
- це. Це запобігає обробці роботи, якщо клієнти помирають, а моніторинг робить досить легким - наприклад, ми можемо сказати, чи є проблема, через яку споживачі потребують тривалого часу для виконання завдань, крім того, щоб повідомити про наявність великого обсягу завдань.
Це забезпечує
- робота доставляється рівно одному споживачеві
- Робота закінчується чергою прогресу, тож вона не може забитися, якщо споживач
Недоліки
- Мені здається досить дивним, що найкращий дизайн, який я знайшов, насправді не використовує,
PUBSUB
оскільки, як видається, саме на цьому більшість публікацій у блогах щодо черги над Redis зосереджуються. Тож я відчуваю, що пропускаю щось очевидне. Єдиний спосіб, який я бачу використовуватиPUBSUB
без використання завдань двічі, - це просто натиснути на повідомлення про те, що робота надійшла, і споживачі можуть потім не блокуватиRPOPLPUSH
. - Неможливо вимагати одночасно декілька робіт, що, здається, є проблемою ефективності. Це не величезна ситуація для нашої ситуації, але, очевидно, говорить, що ця операція не була розрахована на високу пропускну здатність або ситуацію
- Коротше кажучи: я пропускаю щось дурне?
Також додаю тег node.js, тому що це мова, якою я маю справу переважно. Вузол може запропонувати деякі спрощення в застосуванні, враховуючи його однопоточний та неблокуючий характер, але крім того, я використовую бібліотеку вузла-переділу і рішення повинні або можуть бути чутливими до її сильних і слабких сторін.