Зачем нам нужны брокеры сообщений, такие как RabbitMQ, через базу данных, такую ​​как PostgreSQL?

215

Я новичок в брокерах сообщений, таких как RabbitMQ, которые мы можем использовать для создания задач / очередей сообщений для системы планирования, такой как Celery .

Теперь вот вопрос:

  • Я могу создать таблицу в PostgreSQL, к которой можно добавлять новые задачи и использовать такую ​​потребительскую программу, как Celery.

  • С какой стати я хочу установить для этого совершенно новую технологию, такую ​​как RabbitMQ?

Теперь я считаю, что масштабирование не может быть ответом, поскольку наша база данных, такая как PostgreSQL, может работать в распределенной среде.

Я погуглил, какие проблемы создает база данных для конкретной проблемы, и обнаружил:

  • опрос поддерживает занятость базы данных и низкую производительность
  • блокировка стола -> опять низкая производительность
  • миллионы строк задач -> опять же, опрос неэффективен

Теперь, как RabbitMQ или любой другой подобный брокер сообщений решает эти проблемы?

Кроме того, я узнал, что AMQPпротокол это то, что следует. Что в этом хорошего?

Может ли Redis также использоваться в качестве брокера сообщений? Я нахожу это более аналогичным Memcached, чем RabbitMQ.

Пожалуйста, пролите немного света на это!

Югаль Джиндл
источник
9
В PostgreSQL влияние блокировок должно быть намного меньше, потому что он реализует MVCC, где читатели не блокируются писателями, и наоборот. Большинство статей, в которых я критиковал использование баз данных в качестве очередей сообщений, имеют в виду MySQL.
CadentOrange
Посредник сообщений перемещает данные между узлами, а база данных хранит данные в одном месте. Тот факт, что вы можете получить доступ к данным в базе данных с нескольких узлов, сам по себе не делает его хорошим инструментом для быстрой передачи данных между узлами.
The Mayer
2
«Система планирования, как celery» - я только что узнал кое-что, что будет полезно в моем дизайне, из вопроса . Теперь, чтобы прочитать ответы ...
Марк К Коуэн
с помощью посредника сообщений производитель и потребитель разъединены.
Георгий Двалишвили
Вы можете посмотреть ниже ссылку. У этого есть широкое описание: stackoverflow.com/a/51377756/3073945
Md. Sajedul Karim

Ответы:

110

Очереди кролика находятся в памяти и поэтому будут намного быстрее, чем реализовывать это в базе данных. (Хорошая) выделенная очередь сообщений должна также обеспечивать важные связанные с очередью функции, такие как регулирование потока / потока и возможность выбора различных алгоритмов маршрутизации, чтобы назвать пару (кролик предоставляет эти и другие). В зависимости от размера вашего проекта, вы можете также хотеть, чтобы компонент передачи сообщений был отделен от вашей базы данных, поэтому, если один компонент испытывает большую нагрузку, он не должен мешать работе другого.

Что касается проблем, которые вы упомянули:

  • опрос по поддержанию базы данных Buzy и низкие исполнительский : Использование RabbitMQ, производители могут подтолкнуть обновления для потребителей , которые гораздо более производительными , чем опрос. Данные просто отправляются потребителю, когда это необходимо, устраняя необходимость в расточительных проверках.

  • блокировка таблицы -> опять низкая производительность: нет таблицы для блокировки: P

  • миллионы строк задачи -> опять-таки опрос неэффективен: как упоминалось выше, Rabbitmq будет работать быстрее, поскольку он находится в оперативной памяти и обеспечивает управление потоком. При необходимости он также может использовать диск для временного хранения сообщений, если у него заканчивается ОЗУ. После 2.0 Rabbit значительно улучшил использование ОЗУ. Варианты кластеризации также доступны.

Что касается AMQP, я бы сказал, что действительно крутой функцией является «обмен» и возможность его перенаправления на другие обмены. Это дает вам больше гибкости и позволяет создавать широкий спектр сложных типологий маршрутизации, которые могут оказаться очень полезными при масштабировании. Для хорошего примера смотрите:


(источник: springsource.com )

и: http://blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

Наконец, что касается redis, то да, его можно использовать как брокер сообщений, и он может преуспеть. Однако Rabbitmq имеет больше возможностей очереди сообщений, чем redis, поскольку rabbitmq изначально создавался как полнофункциональная выделенная очередь сообщений корпоративного уровня. Redis, с другой стороны, был изначально создан, чтобы быть хранилищем ключей в памяти (хотя он делает гораздо больше, чем сейчас; его даже называют швейцарским армейским ножом). Тем не менее, я читал / слышал, что многие люди добились хороших результатов с Redis для проектов меньшего размера, но мало что слышали об этом в больших приложениях.

Вот пример использования redis в длинном опросе: http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/

Jaigus
источник
2
Я реализовал реализацию JMS (то есть систему передачи сообщений) поверх базы данных. Я могу вам сказать , что это возможно, но это не весело , и это обычно не окупаются , чтобы сделать это. С некоторыми из упомянутых проблем можно обойти, но это значительно усложняет задачу. В общем, я согласен: используйте выделенную систему MQ, если она вам нужна. Тем не менее, для небольших рабочих нагрузок вы можете избежать необходимости иметь его в БД.
Иоахим Зауэр
1
Вы просто покрыли все проблемы / сомнения. Отличный ответ!
Югаль Джиндл
Это интересно. Как насчет последовательности между прочим? Что делать, если в очереди находятся сотни заданий, а узел, удерживающий их в баране, дает сбой?
Ман
22
На самом деле, в PostgreSQL нет опроса (см. NOTIFY) и нет блокировки таблиц (см. MVCC). Хотя PostgreSQL по-прежнему не предназначен для организации очередей сообщений, он не является полностью неподходящим.
JKJ
3
Как и то, что сказал @jkj, есть NOTIFY и нет блокировок таблиц. Единственная проблема - высокая пропускная способность сообщений. Не могли бы вы иметь выделенный экземпляр PostgreSQL вместо поддержки совершенно новой системы, такой как Rabbit? Вы можете 1) использовать один экземпляр PostgreSQL, пока не достигнете узкого места, затем 2) использовать выделенный Postgres, а затем 3) легко переключиться на Rabbit в качестве вашего брокера. Похоже, начинать с Кролика предварительно оптимизировать.
Джо
72

PostgreSQL 9.5

PostgreSQL 9.5 включает в себя SELECT ... FOR UPDATE ... SKIP LOCKED. Это делает реализацию рабочих систем очередей намного проще и проще. Возможно, вам больше не потребуется внешняя система организации очередей, поскольку теперь просто извлечь n строк, которые не заблокированы ни в одном другом сеансе, и сохранять их заблокированными, пока вы не подтвердите, что работа выполнена. Он даже работает с двухфазными транзакциями, когда требуется внешняя координация.

Внешние системы очередей остаются полезными, предоставляя постоянную функциональность, проверенную производительность, интеграцию с другими системами, опции горизонтального масштабирования и федерации и т. Д. Тем не менее, для простых случаев они вам больше не нужны.

Старые версии

Вам не нужны такие инструменты, но их использование может облегчить жизнь. Организация очередей в базе данных выглядит легко, но на практике вы обнаружите, что высокопроизводительную, надежную параллельную организацию очередей действительно трудно сделать правильно в реляционной базе данных.

Вот почему существуют такие инструменты, как PGQ .

Вы можете избавиться от опроса в PostgreSQL, используя LISTENи NOTIFY, но это не решит проблему надежной раздачи записей из верхней части очереди ровно одному потребителю, при этом сохраняя высококонкурентную операцию и не блокируя вставки. Все простые и очевидные решения, которые, по вашему мнению, решат эту проблему, на самом деле не решают ее в реальной жизни, и, как правило, вырождаются в менее эффективные версии извлечения очереди из одного рабочего.

Если вам не нужны высококонкурентные выборки из нескольких рабочих очередей, тогда использование единой таблицы очередей в PostgreSQL вполне разумно.

Крейг Рингер
источник
11
строка reliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts. резюмирует это - верно?
Югаль Джиндл