besogonskiy
@besogonskiy
работаю php laravel разработчиком.

Как спроектировать архитектуру небольшого сервиса, обновляющего данные на сайте?

Проект на laravel. Хочется по умному спректировать его чтоб он выполнял следующие задачи:

- считывание архива с yaml файлом со стороннего сервера
- распаковка архива
- считывание данных из архива в таблицу.

Понятно, что можно создать artisan команду и запускать ее по расписанию и она будет всё это делать.

Но хотелось бы красиво всё сделать, используя принципы Solid и возможно подходящие для задачи патерны.

Как я это вижу:

запускаем job по расписанию, которая бы запускала первый сервис:

1)Сервис, отвечающий за получение данных с сервера. Он должен считать файл и положит его в нужную папку и запустить
следующую job.

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

Третья job будет считывать данные из файла и помещать их в базу таблицу базы данных и запускать следующую job

Четвертая job будет подметать за собой - удалять распакованные файлы, удалять архив.

ервисы должны будут быть связаны между собой при помощи DI (там, где нужно) и наследоваться каждый от абстрактного класса
с той задумкой, что алгоритм считывания прайса может меняться в зависимости от, к примеру, поставщика.

Так же способ разархивации тоже может меняться.

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

Можете прокомментировать данный подход или предложить более правильную идею?

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

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

Еще без логера не обойтись.
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 4
@aleksejjjjj
Полная хрень. Вы перечитали адептов микросервисов. Создайте ещё Job на каждое поле. А то что за бред, у вас один job и цену и название обновляет.

Сделайте один нормальный job, и не парьте мозги себе и занятым людям)

Общие методы можно конечно и в сервисы вынести. Скачивание, распаковка архива, прочая общая фигня. Но job один.
Ответ написан
@vism
По существу вы вобще, нет ВОБЩЕ не понимаете то, о чём написали.
Начитались кучу статей и пытаетесь это как-то применить.
Делать надо то что умеете и учиться потихоньку. Шаг за шагом по каждой ступеньке.
А не пытаться прыгнуть сразу через 100.

Когда у вас встретятся задачи где нужно то, что вы пишите, тогда поймёте где это надо применять, а где нет.

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

Вам даже это не очевидно.
Да жестко, но это так. Все через это проходят :)
Ответ написан
@Kostik_1993
Web Developer
Я еще подумываю над тем, чтобы создать доп. таблицу, в которой будет отражаться состояние выполнение общей задачи и ее статус и количество попыток. Чтоб если по расписанию положено было заново запустить воркеры, то чтоб они смотрели выполнилась ли успешна предыдущая группа задач.
в job-ах уже есть все это. нужно только научиться применять. Вам не нужен никакой Job. Job вам пригодился бы если вам нужно было бы по каждому офферу ходить куда-нибудь да чего-нибудь от туда ждать, то тут несомненно пригодилось бы. А так какой смысл их? Для начала выпилите все в сервисы.
Ответ написан
@Vadik7777
Зачем Вам для этих целей Laravel?!
Используйте CRON и 1 файл .php с функциями по загрузке, распаковке и записи данных
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы