Які рішення проблеми розподіленої черги?


23

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

Реалізація зіткнеться з багатьма проблемами і буде змушена робити компроміси:

  • У неї сильне чи слабке впорядкування?
  • Чи є в ній невміла поставлена ​​??
  • Чи можемо ми мати більше черг, ніж те, що може вміститися на одній машині?
  • Чи можемо ми мати більше даних у черзі, ніж те, що може вміститися на одній машині?
  • Скільки машин може вийти з ладу, перш ніж ми потенційно втратимо дані?
  • Чи може він терпіти чисті розколи?
  • Чи може він автоматично узгоджувати дані, коли фіксований спліт-фільтр?
  • Чи може це гарантувати доставку, коли клієнти можуть вийти з ладу?
  • Чи може це гарантувати, що одне й те саме повідомлення буде доставлено не один раз?
  • Чи може вузол вийти з ладу в будь-який момент, повернутися назад і не надсилати мотлох?
  • Чи можете ви додати вузли до або виконувати видалення вузлів із запущеного кластера без простою часу?
  • Чи можете ви оновити вузли в запущеному кластері без простою часу?
  • Чи може це працювати без проблем на неоднорідних серверах?
  • Чи можете ви "приклеювати" черги до групи серверів? (наприклад: "ці черги дозволені лише в європейському центрі обробки даних")
  • Чи можна переконатися, що репліки даних розміщуються принаймні у двох центрах обробки даних, якщо такі є?

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

Також якщо є якісь проблеми, які я, можливо, пропустив у наведеному вище списку.

Відповіді:


13

Написати базову систему черг досить просто, але як ви вже відзначали вище з усіма проблемами, зробити це правильно - це інша справа. Я використовував домашні системи, для яких написав вихідний код, сторонні системи та різні постачальники послуг JMS. На сьогоднішній день JMS (служба обміну повідомленнями Java) - це найповніше рішення, з яким я стикався до цих пір. Багато з того, що ви запитуєте, доступне в JMS. Мій улюблений постачальник послуг JMS - ActiveMQ. Безкоштовно, швидкодіючий, простий в установці, і що ще важливіше легко вбудовувати у свій додаток разом із Spring. Провайдери JMS не надають все, про що ви просили, не вкладаючи коробки, але вони надають набір інструментів для обробки більшої частини того, про що ви просили, якщо ваша програма потребує цього. Я не знайшов багато додатків, потрібне все, що ви перерахували. Замовлення може бути не важливим (найкраще, якщо його немає),

http://activemq.apache.org/what-open-source-integration-solution-works-best-with-activemq-.html

Це сильний або втрачає замовлення? Так. Він має як залежно від потреб ваших програм. Ось деталі: http://activemq.apache.org/total-ordering.html .

Чи є в ній встановлений імепотент? Ні, але це тривіально для реалізації у вашому шарі додатків, якщо вам це потрібно.

Чи можемо ми мати більше черг, ніж те, що може вміститися на одній машині? Так. Ви можете мати кластеризовані сервери, і якщо ви хочете налаштувати кілька машин з різними чергами, ви можете, і витягніть їх із будь-якого.

Чи можемо ми мати більше даних у черзі, ніж те, що може вміститися на одній машині? Так, більшості постачальників послуг JMS доводиться використовувати якийсь БД / стійкий сховище, щоб гарантувати, що повідомлення не падають і не втрачаються, якщо постачальник JMS знижується.

Скільки машин може вийти з ладу, перш ніж ми потенційно втратимо дані? На це трохи важче відповісти, оскільки це пов'язано з термінами. Однак ви можете зірвати постачальника послуг JMS і за умови, що диск не пошкоджений, він повернеться та розпочнеться там, де він отримав останнє зобов’язання. Це означає, що повідомлення можуть надсилатися двічі, але якщо ви кодуєте свою програму для вирішення цього, це не проблема. Поки у вас є принаймні один з кожного типу (виробники, споживачі або сервери JMS), він завершиться. Ви також можете мати завантаження / баланс / відмову від резервування, якщо диск вийде на вас.

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

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

Чи може це гарантувати доставку, коли клієнти можуть вийти з ладу? Так, це одна з головних цілей СУО. Гарантована доставка означає, що якщо повідомлення в черзі, воно гарантовано обробляється клієнтом.

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

Чи може вузол вийти з ладу в будь-який момент, повернутися назад і не надсилати мотлох? У випадку, коли у вас міцні кластерні черги. Так, він не викличе "мотлоху", якщо інший вузол кластеру доставив повідомлення. Він все ще може повторно доставити все, що не було визнано.

Чи можете ви додати вузли до або виконувати видалення вузлів із запущеного кластера без простою часу? Так.

Чи можете ви оновити вузли в запущеному кластері без простою часу? Це мені трохи складніше, але я вважаю, що так, ви можете це зробити.

Чи може це працювати без проблем на неоднорідних серверах? Що це означає саме? Я знайшов, що більшість постачальників послуг JMS дуже легко запускатись у середовищах, використовуючи різні апаратні засоби, ОС тощо. Хоча, якщо ви маєте на увазі продуктивність, це зовсім інша справа. Повільний вузол може негативно впливати на будь-яку розподілену систему обробки. У мене було 8 основних серверів Intel, які працюють у черзі та споживачах. Це 16 ядер разом, і я отримав кращі показники використання лише цих двох ящиків, ніж коли я додав одноядерну машину як споживача. Ця одноядерна машина була настільки повільніше, що вона уповільнила всю сітку в 2 рази. Це не мало нічого спільного з JMS.

Чи можете ви "приклеювати" черги до групи серверів? Коротка відповідь "так". Я можу придумати спосіб, коли можна запустити кластер, який є лише в європейському центрі обробки даних, і налаштувати там чергу. Потім у весняній конфігурації ваші споживачі споживають цю чергу, а також інші черги в інших кластерах. Ви можете проконсультуватися з документами:

http://activemq.apache.org/clustering.html

Чи можна переконатися, що репліки даних розміщуються принаймні у двох центрах обробки даних, якщо такі є? Знову я вірю в це, але найкраще проконсультуватися з документами кластеризації.

Знову ж, у JMS є безліч варіантів, які ви можете налаштувати, як підказує ваша потреба. Використання транзакційних сеансів та довговічних черг поставляється із вартістю продуктивності. Я бачив, як включення всіх дзвіночків впливає на продуктивність аж у 10 разів. Коли я використовував JBossMQ, якщо ми вимкнули деякі з цих функцій, ми могли отримати близько 10 000 повідомлень / с, але ввімкнення їх знизило нас до 1000 повідомлень / с. Велика крапля.


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

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

Немає жодних вимог щодо того, щоб машини були ідентичними, будь то RAM, Hardware або OS. Ви можете запустити змішаний мішок машин, якщо вам потрібно. Єдине занепокоєння - це те, що я зазначив, що пов'язано з продуктивністю в тому, що машини, які не однакові, оброблять повідомлення з різною швидкістю, що може призвести до зниження пропускної здатності. Однак модель JMS дещо пом'якшує це тим, що вона є "тягкою" замість моделі push. Push-моделі значно чутливіші до подібних питань.
кругляки
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.