Проектирование повторяющейся задачи PHP/MySQL

У меня здесь головная боль с дизайном, я использую PHP и MySQL в сочетании с Java (, мой проект — приложение для Android ). Мне нужно решить, как запустить серию вычислений на стороне сервера через равные промежутки времени. Здесь есть множество материалов по SO, посвященных тому, как создавать задания cron и так далее, и это здорово, я вполне могу закончить на этом, но я не уверен, как заняться этой частью моего проекта в более широком смысле.

Приложение полностью ориентировано на географическое положение пользователей. Они всегда организованы в кластеры от 4 до 40, и эти кластеры образуют одну запись экземпляра в моей базе данных. Эти экземпляры могут стать активными или неактивными в любое время.

Задача

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

Метод

Вот где это становится грязным из-за моей неопытности ранга. Я начал с написания относительно простого вычисления, включающего один запрос выбора SQL и одну последующую операцию обновления SQL для каждого экземпляра в каждую эпоху. Если мы предположим, что интервал обновления составляет около 20 -30 секунд, это меньше одной минуты, по-видимому, это нарушает ограничение в 1 минуту для заданий cron. (Следует отметить, что разница во времени между эпохами может быть жестко запрограммирована.в случае крайней необходимости ).

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

Вопрос

В нынешнем виде вопрос стоит в два -раза:

  1. Я хочу выполнить одну и ту же простую функцию для всех активных экземпляров. в каждую эпоху. Итак, есть ли более эффективный способ сделать это, чем запустить столько итераций? Могу ли я как-то обновить многие строки таблицы сразу, используя один большой окончательный запрос на обновление SQL? Что-то вроде mysqli _multi _query ()на самом деле очень полезен здесь? (На данный момент у меня нет mysqli ).
  2. Как лучше всего реализовать таймер или триггерный механизм для повторного -срабатывания этот процесс в каждую эпоху, учитывая тот факт, что он может нарушить 1 мин. ограничение, о котором я читал для заданий cron?

Моя идея

Мой текущий подход выглядит следующим образом:

  1. Запустите один запрос выбора SQL, чтобы настроить все для текущей эпохи, получение номеров идентификаторов экземпляров, требующих смещения центроида.
  2. Заполните массив PHP этими идентификаторами экземпляров
  3. Последовательно сдвигайте каждый экземпляр, используя цикл и либо один, либо очень многие обновления SQL (см. выше )для записи новых пар координат в базу данных.
  4. Запланируйте выполнение этой задачи в каждую эпоху (, другими словами, каждые x секунд)

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

8
задан Chaos 17 July 2012 в 14:20
поделиться