Предотвращение дырявой абстракции при использовании асинхронности
У меня есть контроллер, который должен запускать . Процесс импорта может занять много времени, поэтому я решил использовать
public function execute()
{
try {
$this->importer->import();
$this->messageManager->addSuccessMessage(__('The import has been successfully performed.'));
} catch (Exception $e) {
$this->logger->error($e->getMessage());
}
Я имею в виду, что проблема в том, что если я поменяю асинхронный импортер на исходный, мы сможем узнать, будет ли он успешным или нет. Но когда мы используем асинхронный, тогда код не может просто выводить «импорт прошел успешно» и не может выводить «импорт запланирован», потому что это утечка деталей реализации.
Есть рекомендации как решить эту проблему?
Обновление: я предполагаю, что это две разные обязанности:
- импорт
- Запланировать импорт
Так что я думаю, что они вообще не взаимозаменяемы.
1 ответ
Итак, после тщательного размышления я пришел к выводу, что запуск скрипта и его планирование — это два отдельных действия. Первоначально я думал, что они должны отличаться только объемом деталей реализации; Я попал в эту ловушку, потому что cron, который считывает, что MQ запускается каждую минуту, поэтому выполнение запланированного сценария кажется почти мгновенным, как если бы он запускался напрямую.
Таким образом, с этим выводом я решил сделать еще один шаг и переименовал все это в «операцию расписания» вместо «операции запуска». Я предполагаю, что пользователь должен знать, что он будет запланирован, а не просто запущен. А если пользователь запутается и спросит WTF? Почему он не может просто работать вместо этого? Тогда кто-нибудь мог бы ответить: хорошо, планирование лучше, чем запуск из-за A, B и C.