Подтвердить что ты не робот

Анатомия распределенной системы в PHP

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

У меня есть сервер, который получит заказы от нескольких клиентов. Каждый клиент будет представить набор повторяющихся задач, которые должны выполняться в определенных интервалы, например: клиент A выполняет задачу AA, который должен выполняться каждый минута между 2009-12-31 и 2010-12-31; так что если моя математика правильная что около 525 600 операций в год, учитывая больше клиентов и задач было бы невозможно разрешить серверу выполнять все эти задачи, поэтому я придумал идею рабочего машины. Сервер будет разработан на PHP.

Рабочие машины просто обычны дешево Компьютеры на базе Windows, которые я буду принимающей в моем доме или на моем рабочем месте, у каждого работника будет Подключение к Интернету (с динамическими IP-адресами) и ИБП, чтобы избежать перебоев в подаче электроэнергии. каждый работник также будет запрашивать сервер каждый 30 секунд или около того через вызовы веб-службы, выберите следующее незавершенное задание и обработайте его. Как только работа будет завершена, работник будет отправлять выходные данные на сервер и запрашивать новая работа и т.д. до бесконечности. Если необходимо масштабировать систему я должен просто создать нового работника и целая вещь должна работать бесперебойно. Рабочий клиент будет разработан в PHP или Python.

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

Теперь вот где сложная часть пинает:

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

У меня есть некоторые сомнения относительно общей структуры базы данных и какие технологии использовать.

Первоначально я подумал об использовании нескольких SQLite баз данных и , объединивших их всех на сервере, но я не могу понять, как я буду группировать клиенты для создания отчетов о работе.

Я никогда не работал ни с одной из следующих технологий: memcached, CouchDB, Hadoop и все подобное, но я бы как знать, подходит ли какая-либо из них для моей проблемы, и если да, которую вы рекомендуете для новичков, это "распределенные вычисления" (или эта параллель?), как я. Пожалуйста, имейте в виду, что у рабочих есть динамические IP-адреса.

Как я уже говорил, у меня также возникают проблемы с общим дизайном базы данных, отчасти потому, что я до сих пор не выбрал какую-либо конкретную СУБД R (D), но один из вопросов, который у меня есть, и я думаю, что он не агностик для СУБД я select относится к системе очередности. Если я предваряю все абсолютные метки времени для определенного задания и имею большой набор временных меток, выполните и отметьте их как завершенные в по возрастанию или мне нужно иметь более умную систему типа , когда модуль временной метки 60 == 0 → выполнить ". Проблема с этой" умной" системой заключается в том, что некоторые задания не будут выполняться по порядку, потому что некоторые рабочие могут ждать ничего, пока другие перегружены. Что вы предлагаете?

PS: Я не уверен, что заголовок и теги этого вопроса правильно отражают мою проблему и то, что я пытаюсь сделать; если нет, отредактируйте соответствующим образом.

Спасибо за ваш вклад!

@timdev:

  • Вход будет очень маленькой строкой, кодированной JSON, вывод также будет строкой JSON, но немного больше (в порядке 1-5 КБ).
  • Результат будет вычислен с использованием нескольких доступных ресурсов из Интернета, поэтому основным узким местом, вероятно, будет пропускная способность. Запись базы данных также может быть одной - в зависимости от СУБД R (D).
4b9b3361

Ответ 1

Похоже, вы на пороге воссоздания Gearman. Здесь введение для Gearman:

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

Вы можете написать как ваш клиент, так и код рабочего сервера в PHP.


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

Сотрудники Sun/MySQL Эрик Дей и Брайан Акер дали учебник для Gearman в OSCON в июле 2009 года, но в их слайдах упоминаются только пакеты Linux.

Здесь ссылка на проект Perl CPAN Testers, который указывает, что Gearman-Server может быть построен на Win32 с использованием компилятора Microsoft C (cl.exe), и он проходит тесты: http://www.nntp.perl.org/group/perl.cpan.testers/2009/10/msg5521569.html Но я думаю, вам нужно скачать исходный код и самостоятельно создать его.

Ответ 2

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

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

Разработка пользовательского решения может работать, но преимущества механизма, особенно стойкой очереди, кажутся мне, что это может быть наилучшим решением для вас на данный момент. Я не знаю о двоичном коде Windows для редуктора, но я думаю, что это должно быть возможно.

Ответ 3

Более простым решением было бы иметь единственную базу данных с несколькими связанными php-узлами. Если вы используете правильную RDBMS (MSql + InnoDB будет делать), вы можете заставить одну таблицу действовать как очередь. Затем каждый работник вытаскивает задачи из этого для работы и записывает их обратно в базу данных по завершении, используя транзакции и блокировку для синхронизации. Это немного зависит от размера входных/выходных данных. Если он большой, это может быть не самая лучшая схема.

Ответ 4

Я бы избежал sqlite для такого рода задач, хотя это очень замечательная база данных для небольших приложений, она отлично справляется с concurrency, у нее есть только одна блокировка strategey, которая предназначена для блокировки всей базы данных и ее сохранения заблокирован до завершения транзакции sinlge.

Рассмотрим Postgres, который имеет промышленную прочность concurrency и управление блокировкой, и может прекрасно справляться с несколькими одновременными транзакциями.

Также это звучит как работа для очередей! Если бы вы были в hte Java world, я бы порекомендовал архитектуру JMS для вашего решения. Существует проект 'dropr', чтобы сделать что-то подобное в php, но его все довольно новое, поэтому оно может не подойти для вашего проекта.

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

Ответ 5

Настройка главного сервера и нескольких рабочих выглядит правильно в вашем случае.

На главном сервере я бы установил MySQL (Percona InnoDB version стабильно и быстро) master, поэтому у вас не будет единой точки отказа. Главный сервер будет располагать API, который работники будут тянуть через каждые N секунд. Мастер проверяет, есть ли доступное задание, если это необходимо, чтобы отметить, что задание было назначено рабочему X и вернуть соответствующий вход работнику (все это через HTTP). Кроме того, здесь вы можете хранить все файлы script рабочих.

На рабочих я настоятельно рекомендую вам установить дистрибутив Linux. В Linux проще настроить запланированные задачи, и в целом я считаю, что это более подходит для работы. С помощью Linux вы можете даже создать живое изображение cd или iso с прекрасно настроенным рабочим и установить его быстро и легко на всех машинах, которые вы хотите. Затем настройте задание cron, которое будет RSync с основным сервером для обновления/изменения скриптов. Таким образом вы измените файлы только в одном месте (главный сервер), и все рабочие получат обновления.

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

Рабочее задание довольно просто: попросите API для задания, сделайте это, отправьте результат через API. Промыть и повторить: -)

Ответ 6

Вместо того, чтобы повторно изобретать колесо очередей через SQL, вы можете использовать систему обмена сообщениями, такую ​​как RabbitMQ или ActiveMQ как ядро ​​вашей системы. Каждая из этих систем обеспечивает протокол AMQP и имеет резервные очереди на жестком диске. На сервере у вас есть одно приложение, которое подталкивает новые задания в "рабочую" очередь в соответствии с вашим расписанием, а другое, которое записывает результаты из очереди "результата" в базу данных (или действует на нее каким-то другим способом).

Все рабочие подключаются к RabbitMQ или ActiveMQ. Они выходят из рабочей очереди, выполняют задание и помещают ответ в другую очередь. После того, как они это сделали, они ПРИЗЫВАЮТ первоначальную заявку на задание, чтобы сказать "ее сделано". Если рабочий отключит свое соединение, задание будет восстановлено в очередь, чтобы другой рабочий мог это сделать.

В базе данных могут храниться все, кроме очередей (описания должностных обязанностей, детали клиента, завершенная работа). Но что-то в реальном времени нужно ставить где-то в другом месте. В моей собственной работе я транслирую данные о реальном энергопотреблении, и многие люди попадают в базу данных, чтобы опросить ее, это плохая идея. Я написал о живых данных в моей системе.

Ответ 7

Я думаю, вы идете в правильном направлении с главным дистрибьютором вакансии и рабочими. Я бы связался с ними через HTTP.

Я бы выбрал C, С++ или Java для клиентов, поскольку у них есть возможности запускать скрипты (execvp in C, System.Desktop.something в Java). Задания могут быть просто именем script и аргументами для этого script. Вы можете вернуть клиентам статус на рабочие места. Если задания не удались, вы можете повторить их. Вы можете опросить клиентов каждую минуту (или каждые х секунд и сделать сервер сортировкой заданий)

PHP будет работать на сервере.

MySQL будет работать отлично для базы данных. Я бы просто сделал две метки времени: начало и конец. На сервере я бы поискал WHEN SECONDS == 0