Написати базову систему черг досить просто, але як ви вже відзначали вище з усіма проблемами, зробити це правильно - це інша справа. Я використовував домашні системи, для яких написав вихідний код, сторонні системи та різні постачальники послуг 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 повідомлень / с. Велика крапля.