Масштабируемая промежуточная система хранения данных с php-демоном и неблокирующим fopen

#php #mysql #scalability #daemon

#php #mysql #масштабируемость #демон

Вопрос:

Я создаю масштабируемую систему хранения данных. n количество серверов может иметь 100 одновременных запросов на ввод данных в базу данных mysql. Я буду писать хранилище данных на каждом веб-сервере локально. Мне нужно иметь возможность записывать локальное хранилище каждого веб-сервера в базу данных mysql при достижении порогового значения (триггер).

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

Мой метод записи в текстовый файл выглядит примерно так:

 $fp = fopen($file, 'a ');
stream_set_blocking($fp, 0);

while($count < $loop) {
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, $text);
    }
    flock($fp, LOCK_UN);
}

fclose($fp)
  

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

Я думал, что что-то вроде демона блокирует файл и копирует его, затем стирает все данные из оригинала, а затем разблокирует его??? Скопированный файл будет отправлен сборщику через демон. Я не уверен, как это будет вести себя одновременно, если выполняется вышеупомянутая запись в потоковый файл.

Есть ли более эффективное / быстрое / надежное решение, собирающее данные локально, а затем перемещающее их в коллектор?

Заранее спасибо!

Ответ №1:

То, что у вас есть, кажется мне совершенно разумной моделью, поэтому мой ответ — оптимизация для нее. Похоже, вы могли бы решить проблему с использованием более одного буферного файла. Я представляю что-то вроде:

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