Как разработать приложение, которое выполняет тяжелые задачи и отображает результат во внешнем интерфейсе (например, Google Search Console)

Давайте представим это:

  1. Мне нужно загрузить XML-документ с URL-адреса;
  2. Я должен разработать этот документ и сохранить его информацию в базе данных, создавая или обновляя множество сущностей.

Я думаю, что лучший способ - использовать очереди. Или, может быть, я также могу использовать cronjobs.

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

Возьмем более конкретный пример из реальной жизни: Google Search Console (или любое другое приложение, которое выполняет сложные задачи и показывает результаты конечному пользователю).

Google Search Console получает XML-карту, затем начинает загрузку каждой веб-страницы, на каждой веб-странице выполняет большой анализ, затем сохраняет результаты в базу данных, чтобы конечный пользователь мог видеть ошибки своего веб-сайта и другую полезную информацию.

Итак, предположим, что я хочу снова создать Google Search Console как приложение Symfony, каковы возможные подходы?

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

То есть мне нужно создать уникальное приложение, которое делает все эти вещи, или я создаю приложение для загрузки веб-страниц, одно для обработки этих веб-страниц и еще одно для показа пользователю результатов?

Я много думаю об этом, и я не могу найти хороший дизайн для подражания.

Поскольку моя цель — создать несколько приложений для каждой из этих задач, чтобы они работали, но кажется, что создание нескольких приложений Symfony — не лучший выбор: Несколько приложений Symfony 2?

Так что я действительно не знаю, по какому пути идти: несколько приложений или одно большое приложение? И если я использую одно большое приложение, должен ли я использовать cronjobs или я все равно использую очереди?


person Aerendir    schedule 21.11.2016    source источник
comment
Я сделал подобное приложение на моей работе. Используйте cron-задания! И только одно приложение для отображения результатов. Вы можете использовать команду symfony symfony.com/doc/current/console.html. Эти команды будут выполняться в отдельном потоке от cli (консоли).   -  person Weenesta - Mathieu Dormeval    schedule 22.11.2016
comment
Отдельная ветка? Что ты имеешь в виду? Я не очень хорошо разбираюсь в концепциях низкого уровня: не могли бы вы объяснить мне лучше? Как я могу управлять потоками? Я Героку...   -  person Aerendir    schedule 22.11.2016
comment
Команды Symfony используют PHP cli, с помощью командной строки (оболочки) ваш скрипт может быть запущен как другой базовый PHP-скрипт (например, вы запускаете php bin/console cache:clear или другие стандартные команды). Я не уверен, что героку разрешает вам доступ к SSH?   -  person Weenesta - Mathieu Dormeval    schedule 22.11.2016
comment
Да, но зачем мне SSH? Меня беспокоит то, что выполнение слишком большого количества фоновых задач, а также такая интенсивная работа, как загрузка, синтаксический анализ, анализ и т. д., сделает все приложение медленнее, интерфейс тоже, и мои пользователи будут перемещаться по очень медленному веб-сайту. Поэтому мне нужно увеличить ресурсы, но если я смогу разделить ресурсы для внешнего и внутреннего интерфейса, может быть, будет лучше. Независимо от того, что я сделаю это, используя два отдельных приложения или используя какое-то другое разделение. По этому интересуюсь в ветке дискурсом: может это решение?   -  person Aerendir    schedule 22.11.2016
comment
SSH позволит вам иметь отдельные потоки из вашего внешнего приложения. На это не повлияет выполнение какой-либо другой работы. Это лучший способ достичь этой цели. Я сделал похожее приложение. Я использовал команды symfony, такие как команды symfony по умолчанию и cronjobs. Вам не нужно иметь учетную запись SSH, если вы можете планировать cronjob. Вы можете создать командное приложение symfony: symfony.com/doc/current/components/console /   -  person Weenesta - Mathieu Dormeval    schedule 22.11.2016
comment
Я знаю, как создавать команды Symfony: в настоящее время я использую их для некоторых более простых фоновых задач. Меня больше интересует лучшее понимание решения SSH: не могли бы вы дать мне некоторые ресурсы? Или можно более развернутый ответ? Также, если вы не имеете прямого отношения к Heroku, но мне очень нравится понимать закулисные концепции.   -  person Aerendir    schedule 22.11.2016
comment
Я пришлю вам подробный ответ как можно скорее...   -  person Weenesta - Mathieu Dormeval    schedule 22.11.2016


Ответы (1)


  1. Сначала я подробно расскажу об архитектуре:

Архитектура

  1. Вы можете создать Сервис, например этот :

namespace SomeBundle\Utils;

use SomeBundle\Entity\MyEntity;
use SomeBundle\myException;

class SomeService 
{
  private $var;

  public function __construct()
  {

  }

  public function doStuff()
  {
    // Do stuff
  }
}

To debug you service, you can call it from a testController or basic Controller.

  1. Вы можете создать команду, например эту:

namespace SomeBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use SomeBundle\Utils\SomeService;

class SomeCommand extends ContainerAwareCommand 
{
  protected function configure()
  {
    $this->setName('some:command')
         ->setDescription('My awesome command');
  }

  protected function execute(InputInterface $input, OutputInterface $output)
  {
    $container = $this->getContainer();
    $sevice = new SomeService($container);
    $results = $service->doStuff();
  }
}
  1. Вы можете создать командное приложение, например это :

require __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/app/AppKernel.php';

$kernel = new AppKernel('dev', true);

use SomeBundle\Command\SomeCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;

$application = new Application($kernel);
$application->add(new SomeCommand());
$application->run();

Надеюсь это поможет !

person Weenesta - Mathieu Dormeval    schedule 22.11.2016
comment
После нескольких неудачных попыток я отказываюсь от идеи хорошо форматировать исходный код! - person Weenesta - Mathieu Dormeval; 22.11.2016
comment
Добавил немного <span></span> для форматирования, хитрый со списками ;) - person Veve; 22.11.2016
comment
Прежде всего большое спасибо за ответ! Насколько я понимаю, вы предлагаете создать приложение Symfony, которое будет только приложением командной строки... Я хорошо понимаю? - person Aerendir; 22.11.2016
comment
Нет, вы можете создать интерфейс с контроллерами. - person Weenesta - Mathieu Dormeval; 22.11.2016
comment
Является ли приложение командной строки Symfony файлом внутри приложения Symfony, где вы можете кодировать внешний интерфейс с контроллерами. - person Weenesta - Mathieu Dormeval; 23.11.2016
comment
Я нашел решение с Heroku: используя worker dynos. Приведенный пример показывает, как это сделать, и ответ, который вы мне здесь дали, будет очень полезен! Возможно, вы также знаете, как решить текущую проблему, с которой я столкнулся: -mechanism-between-the-fro" title="heroku worker, могу ли я использовать базу данных в качестве механизма связи между fro"> stackoverflow.com/questions/40796567/: D - person Aerendir; 25.11.2016