Уведомление приложений на БД INSERT - PullRequest
1 голос
/ 22 июля 2010

Рассмотрим приложение с двумя компонентами, возможно, работающее на разных машинах:

  • Producer - Вставляет записи в базу данных, но практически ничего не читает из базы данных.Несколько экземпляров могут работать одновременно.
  • Потребитель - Должен быть уведомлен, когда запись вставлена ​​в базу данных экземпляром компонента A. Может также иметь несколько экземпляров.

Каков наилучший способ выполнения уведомлений , при условии, что производители будут вставлять 10-100 записей в базу данных в секунду в пиковые моменты времени?Технология базы данных в настоящее время - MySQL, но это не обязательно задуман.Я вижу несколько разных способов:

  • Использовать что-то вроде MySQL очереди сообщений , чтобы «проталкивать» INSERT-уведомления подписчикам (потребителям).Производители не будут знать, что это происходит.
  • Пусть производители взаимодействуют с промежуточным уровнем, который выполняет INSERT и отправляет уведомления в очередь сообщений, на которую подписаны потребители.
  • Опрос потребителейчасто проверять базу данных на наличие новых дополнений (кажется плохой идеей)
  • и т. д.

Что касается связи: хорошая идея иметь два относительно отдельныхКомпоненты приложения выполняют прямые запросы к общей базе данных, или один компонент должен «владеть» базой данных, в то время как другой компонент косвенно взаимодействует с БД посредством обращений к компоненту-владельцу?

1 Ответ

1 голос
/ 22 июля 2010

Мне нравится второе предлагаемое решение (промежуточный уровень), так как оно отделяет уведомление от работы с базой данных и может быть частью транзакции XA двухфазного принятия.Если потребителям нужен контент базы данных в дополнение к уведомлению, это можно сделать с помощью репликации MySQL.Это также может решить вопрос связывания, поскольку компоненты-потребители могут иметь доступ только для чтения к своим реплицированным экземплярам.

Использование решения для обмена сообщениями также устранит любые потенциальные узкие места в решении только для базы данных, поскольку оно будетуведомление и хранение в отдельных процессах.

В зависимости от языка, у вас есть несколько вариантов распространения сообщений.Если вы используете Java, я бы порекомендовал JGroups , а не JMS, так как это несколько проще в настройке.

Если Java не является вашим предпочтительным языком, Apache Active MQ поддерживает несколько языков для взаимодействия.Apache Qpid - это реализация AMQP, которая также поддерживает ряд языков (Java, C ++, Python, Ruby и т. Д.)

...