Страницы

Поиск по вопросам

вторник, 20 ноября 2018 г.

Работа скрипта PHP по принципу транзакций

Я вообще сам по себе Педант и не люблю когда в той или иной директории или БД остается мусор по средствам сбоев или ошибок программы. Я никогда не писал серьезных проектов и дабы получить урок путем прочтения ваших комментов, я задам ряд вопрос детально все расписав.
К примеру, имеется скрипт, который позволяет двум пользователь общаться между собой, обмениваться фотографиями, видео, музыкой и т.д., а принцип скрипта следующий:
Пользователь печатает сообщение, загружает фото (файлы грузятся во временную папку по ajax) и музыкальный файл, затем кликает кнопку "Отправить" и данные улетают на сервер, а на сервере происходит следующее:
Текстовое сообщение записывается в БД, затем следующий шаг это запись в другую таблицу инфо о фотографии (путь к фото, размеры и т.д.), а потом перемещение фотографии из временной директории в постоянную, то же самое и с музыкальным файлом. Казалось бы всё прекрасно, мы получили ожидаемый результат, но а что если после того как текстовое сообщение запишется в БД и информация о файле тоже будет записана, то после произойдет сбой?! Ведь сбои могут быть? Это ведь техника. С сервером, интернетом и т.д. всё что угодно может произойти в процессе выполнения.
На выходе мы получаем сообщение, которое без вложений да и более того, половину информации о вложениях записалось, а половина нет и ещё непонятно где сами файлы остались.
Ко мне в голову пришла идея вначале выполнения кода реализоваться что-то типа карты, к примеру, из массива и в неё записать всю информацию, а именно: - Полный путь к файлам из временной папки - Полный путь к файлам куда мы должны будем переместить файлы из временно папки - И прочую возможную информацию информацию
И эту карту сразу же первым делом записать в таблицу (не буду описывать куда, главное понять, что эта инфа записана)
И по завершению скрипта, если всё прошло успешно, то удаляем карту, а если карта, к примеру, после обновления страницы осталась в таблице, значит скрипт сработал некорректно и просто по этой карте пробегаем и все отовсюду удаляем.
Я не пытаюсь что-то изобрести или открыть, я просто хотел бы знать, нужно ли подобное реализовывать? Или есть более простой способ о котором я никогда не слышал? Или, может быть, всё это дикий бред? С радостью выслушаю вас и получу дельные советы. Спасибо!!!


Ответ

если данные не провалидировались - эксепшен begin в бд, делаем записи в таблицы, произошла ошибка, rollback, эксепшен // баг в валидации //или сломалась бд, кончилось место, неправильный запрос //если все окей с созданием записи в бд: записываем файл, если файл не записался/был испорчен: удаляем файл, rollback, эксепшен иначе - commit
можете, например, если не очень высокая нагрузка, хранить файлы в бд, тогда откат будет и файлы откатывать.
или, допустим, вы можете сделать скрипт, который будет бегать по базе данных и списку файлов каждый день и проверять валидность файлов, плохие - удалять.
тема очень большая, на самом деле и вопрос очень широкий, и для маленьких проектов без супервысокой нагрузки обычное решение в таких случаях просто восстановление из частого бэкапа в случае каких-то ошибок.
в больших проектах - все сложнее и в одном посте не напишешь.
остальной функционал (типа после коммитов файл испортился и т.д.) решается уже по сути кластерными методами - три сервера, если на одном файл испортился, диск поехал и т.д., то правильной считается версия, совпадающая на двух других серверах. в космических аппартах и мэйнфреймах существует примерно такое же дублирование на уровне компьютеров/процессоров
почитайте про архитектуры netflix и google - они такие проблемы как раз решают часто. (netflix c ошибками на машинах борется забавным образом - они рэндомно убивают хосты в сети, каждый день, для того, чтобы процесс восстановления был идеально отлажен)
p.s. вопрос "нужно ли подобное реализовывать" - очень зависит от вашего сервиса и предполагаемого уровня его качества. одно дело - пользователи обмениваются сообщениями в соцсети и один раз из миллиона происходит ошибка выкладки фотографии, пользователь просто перезагрузит ее еще раз, а если допустим, у вас сервис управления сетью ПВО и какая-то из пусковых установок получила сломанный файл с картой местности - oche ploho, на учениях вам в офис может прилететь ракета.

Комментариев нет:

Отправить комментарий