Проектування масштабованої архітектури черги повідомлень


22

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

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

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

Останній спосіб, який я можу вирішити, щоб вирішити цю проблему - це кожен сервер черги повідомлень (і кожен потік на кожному сервері) матиме певне зміщення щодо того, де в черзі він шукає, але це може мати проблеми на основі тип програми, особливо якщо обробку потрібно виконати в певному порядку.

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


2
Це масове питання. Якби я був ти, я б звернувся до ibm.com і шукав червоні книги, в яких детально описується, що робить mq і (якщо пощастить), як це працює. Звичайно, ці книги не дадуть усіх відповідей для вас, але вони дадуть уявлення про масштабність питання. MQ надзвичайно складний - я над цим працював деякий час 15 років тому.
PeteH

Інші архітектури, на які варто звернути увагу, включають Tibco Rendezvous ( tibco.com/products/automation/messaging/low-latency/rendezvous/… ), Apache ActiveMQ та Spread ( spread.org ).
Аксель Кемпер

1
Не винаходити колесо. ZeroMQ, RabbitMQ, Redis тощо
djechlin

1
@djechlin колесо - це найбільш винахідлений предмет усіх часів.
ВИНАГО

@cgoddard спробуйте зануритися в кодові бази за однією з цих технологій.
djechlin

Відповіді:


14

Коротко:

Це важка проблема. Не винаходити колесо.

Існує багато технологій, що вирішують рівень черги повідомлень. Вони включають

  • ZeroMQ
  • КроликMQ
  • Апач Кафка
  • Redis, з BLPOP або PUBSUB (я запитав, як це зробити тут ).
  • Інші реалізації AMQP, крім RabbitMQ

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

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

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

Дізнайтеся про модель черги обміну RabbitMQ / AMQP. Маршрутизація може підійти для вас - це підтримується Redis PUBSUB, але я не пам'ятаю, щоб його підтримував ZeroMQ - і вентилятори - це те, що мій магазин використовує, хоч і погано реалізований протягом опитування Memcached (yuck!), Протягом досить тривалого часу .

Як вибрати його?

Я працюю при запуску, SLA, який характерний для веб-додатків - деякі помилки в порядку, якщо ми можемо швидко відновити сервіс з невеликою втратою даних. Нам не довелося думати про проблеми масштабування, як, наприклад, Twitter або Tumblr, тому нам не довелося думати про об'єм пропускної здатності. Якщо говорити, якщо ви впроваджуєте SLA, подібний моєму, ці міркування прийдуть на думку:

  • чи справді працюють бібліотеки клієнтів ? Чи легко підтримувати в них зв’язок? (ZeroMQ, Redis: так. КроликMQ: ні).
  • чи легко моніторинг та управління з консолі сервера? (Redis: так, RabbitMQ: так, ZeroMQ: не те, що я пам'ятаю, але ми не використовували його так довго)
  • чи підтримують клієнти внутрішні черги, тому невеликі втрати даних трапляються в умовах короткого відключення? (ZeroMQ, Redis: так. КроликMQ: ні.)

Звичайно, якщо ви працюєте в, скажімо, високочастотному торговому магазині, це буде вашими меншими проблемами. Ви будете готові помістити час розробки в бібліотеку на стороні клієнта в обмін на більш високу пропускну здатність врешті-решт. Але я пишу це більше, щоб попередити вас, що ці технології, як правило, продаються на основі їхньої продуктивності, а не їх функціональності. Якщо ви веб-стартап, вас набагато більше цікавить останній, ніж колишній, і, отже, щось на зразок Redis, який більш оптимізований для зручності використання при гарній продуктивності, ніж труднощі використання при великій продуктивності, ймовірно, кращий вибір, ніж RabbitMQ. (Мені дуже не подобається RabbitMQ).


8
Не винаходити колесо !!! ??? Якби Лінус думав так, ви зараз використовуєте Windows. Він винаходив MINIX для розваги "тому, що йому це не сподобалось", і подивіться, що ми маємо зараз.
chrisapotek

9
@chrisapotek Linus зрозумів внутрішню частину операційної системи, перш ніж знімати проблему. На цьому етапі ОП формує свій словниковий запас. Різниця.
erbdex

2
@chrisapotek він теж хотів. Якщо ви хочете створити кращу шину повідомлень, продовжуйте роботу, але ви, мабуть, не хочете цього робити, поки ви намагаєтеся створити веб-додаток чи що завгодно. Я також рекомендую пройти кваліфікацію. Я особисто не кваліфікований для винаходи операційної системи, коли хочеться написати код.
djechlin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.