У меня есть проблема, из-за которой мне трудно найти идеальное решение, и, чтобы лучше объяснить это, я собираюсь изложить свой сценарий здесь.
У меня есть сервер, который будет принимать заказы
от нескольких клиентов. Каждый клиент будет
представить набор повторяющихся задач, которые
должно быть выполнено в некоторых указанных
интервалы, например: клиент A отправляет задачу
АА, который должен выполняться каждый
минута между 2009-12-31 и
2010-12-31 ; так что если моя математика верна
это около 525 600 операций в
год, учитывая больше клиентов и задач
было бы невозможно позволить серверу обрабатывать все эти задачи , поэтому я
придумал идею рабочего
машины. Сервер будет разрабатываться
на PHP.
рабочие машины просто обычные дешевые
компьютеров на базе Windows , которые я
хозяин у меня дома или на работе,
у каждого работника будет свой
Интернет-соединение ( с динамическими IP-адресами )
и ИБП, чтобы избежать перебоев в подаче электроэнергии. каждый
работник также будет запрашивать сервер каждый
30 секунд или около того через вызовы веб-службы,
получить следующую ожидающую работу и обработать ее.
Как только работа будет завершена, работник
отправить вывод на сервер и запросить
новая работа и так далее до бесконечности. Если
есть необходимость масштабировать систему I
следует просто настроить нового работника и
все должно работать без проблем.
Рабочий клиент будет развиваться
в PHP или Python.
В любой момент времени мои клиенты должны быть
возможность войти на сервер и проверить
статус задач, которые они заказали.
Теперь вот где начинается сложная часть:
- Я должен быть в состоянии восстановить
уже обработанные задачи, если для некоторых
причина, по которой сервер не работает.
- Работники не зависят от клиента,
один работник должен обрабатывать рабочие места для
любое количество клиентов.
У меня есть некоторые сомнения относительно общего дизайна базы данных и какие технологии использовать.
Первоначально я думал об использовании нескольких SQLite баз данных и , объединяющих их все на сервере, но я не могу понять, как я буду группировать по клиентам для генерации отчетов о заданиях .
Я никогда не работал ни с одной из следующих технологий: memcached , CouchDB , Hadoop и тому подобное, но я хотел бы знать, если какой-либо из них подходит для моей проблемы, и если да, то, что вы рекомендуете новичку, это «распределенные вычисления» (или это параллель?), как я. Имейте в виду, что рабочие имеют динамические IP-адреса.
Как я уже говорил ранее, у меня также возникают проблемы с общим дизайном базы данных, отчасти потому, что я до сих пор не выбрал какую-либо конкретную R (D) СУБД, но есть одна проблема, которая у меня есть, и я думаю, что она не зависит от СУБД Выбор связан с системой очередей ... Если я произвожу предварительный расчет всех абсолютных временных отметок для конкретной работы и получу большой набор временных отметок , выполните и отметьте их как завершенные в порядке возрастания или у меня должна быть более умная система типа ", когда модуль отметки времени 60 == 0 -> выполнить ". Проблема с этой «умной» системой заключается в том, что некоторые задания не будут выполняться в порядке , поскольку они должны быть, потому что некоторые рабочие могут ждать, ничего не делая, в то время как другие перегружены. Что вы предлагаете?
PS: Я не уверен, что заголовок и теги этого вопроса правильно отражают мою проблему и то, что я пытаюсь сделать; если нет, отредактируйте соответственно.
Спасибо за ваш вклад!
@ timdev:
- На входе будет очень маленькая строка в кодировке JSON, на выходе также будет строка в кодировке JSON, но немного больше (порядка 1-5 КБ).
- Вывод будет рассчитываться с использованием нескольких доступных ресурсов из Интернета, поэтому основным узким местом, вероятно, будет пропускная способность. Запись в базу данных также может быть одна - в зависимости от СУБД R (D).