Как достичь максимального параллелизма для распределенного приложения, использующего базу данных в качестве средства связи - PullRequest
1 голос
/ 24 января 2011

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

1002 * Процесс A: вставляет строку в таблицу в базе данных (производители)

Процесс B: читает M строк из таблицы, удаляет прочитанные M строк после обработки.

Задачи в процессе B: 1. Чтение M строк 2. Обработка этих строк 3. Удаление этих строк

N1 экземпляров процесса A, N2 экземпляров процесса B выполняется одновременно.

Каждый экземпляр запускается в отдельном окне.

Некоторые требования: Если процесс p1 читает (0, M-1) строк.процесс p2 не должен ждать p1, пока не снимет блокировку этих строк, вместо этого он должен прочитать (M, 2M-1) строк.

Ответы [ 4 ]

0 голосов
/ 24 января 2011

Вы также можете взглянуть на Amazon Elastic Map Reduce

http://aws.amazon.com/elasticmapreduce/

0 голосов
/ 24 января 2011

Аналогичная концепция используется в ConcurrentHashMap Java.15.Список обрабатываемых строк следует вести отдельно.Когда любому процессу необходимо взаимодействовать с БД, он должен проверить, обрабатываются ли эти строки другим процессом.Если это так, он должен ждать этого условия, иначе он может обработать.поддержание индексов может помочь в таком случае

0 голосов
/ 24 января 2011

Я думаю, что если это приложение реализовано, оно фактически использует очередь, созданную вручную. Я считаю, что JMS намного лучше в этом случае. Доступно много реализаций JMS. Большинство из них с открытым исходным кодом.

В вашем случае процесс А должен вставить задачи в очередь. Процесс B должен быть заблокирован на receive(), получить N сообщений и затем обработать их. У вас, вероятно, есть причины получать большую часть задач из своей очереди, но если вы измените реализацию на JMS на основе, вам, вероятно, это вообще не понадобится, поэтому вы можете просто прослушать очередь и немедленно обработать сообщение. Реализация становится почти тривиальной, очень гибкой и масштабируемой. Вы можете запустить столько процессов A и B, сколько захотите, и распределить их по отдельным блокам.

0 голосов
/ 24 января 2011

Могу поспорить, что есть лучшие способы параллельной обработки, чем использование БД в качестве источника связи между производителем и потребителем. Почему бы не очереди ? Вы проверили инструменты / рамки, предназначенные для Map / Reduce . Hadoop, GridGain, JPPF - все это может сделать.

...