Size: a a a

2021 February 02

SP

Sergey Protko in symfony
Anthony
Если человек не понимает как оно вообще работает, то имхо, лучше пусть познакомится и поэкспериментировать на двух сущностях ) как на кошках
есть опасность не так понять что это такое и когда юзать.
источник

D

Dmitry in symfony
Sergey Protko
ммм... да? Во всяком случае у меня нет тонн кода и какой-то "синхронизации"
а вы для чего сагу тогда используете ?
сага же используетс ядля согласованности данных между сервисами
источник

A

Anthony in symfony
Тоже вариант. Но не кидать же человека яйцами на лесопилку и сразу ему в лицо корпоративными паттернами 😂
источник

A

Anthony in symfony
Dmitry
а вы для чего сагу тогда используете ?
сага же используетс ядля согласованности данных между сервисами
Между контекстами
источник

D

Dmitry in symfony
у вас их 10 штук, каждому нужно стукнуть чтобы применить какое-то действие, почти каждому нужно код для отката этого самого действия в случае ошибки
источник

SP

Sergey Protko in symfony
Dmitry
а вы для чего сагу тогда используете ?
сага же используетс ядля согласованности данных между сервисами
ну вот пример маленькой фичи. Допустим ты делаешь что-то типа pager duty. Приходит сообщение "серверу пизда". Дальше сообщение рассылается on-call инженерам. Они могут подтверждать о том что "фиксики уже в пути". Если в течении N минут не получили подтверждение мы будем эскалировать на уровень выше. И так пока не доберемся до CTO/CEO/CIO/etc. Вот за это может отвечть одна маленькая сага которая описывает процесс эскалации
источник

D

Dmitry in symfony
Sergey Protko
ну вот пример маленькой фичи. Допустим ты делаешь что-то типа pager duty. Приходит сообщение "серверу пизда". Дальше сообщение рассылается on-call инженерам. Они могут подтверждать о том что "фиксики уже в пути". Если в течении N минут не получили подтверждение мы будем эскалировать на уровень выше. И так пока не доберемся до CTO/CEO/CIO/etc. Вот за это может отвечть одна маленькая сага которая описывает процесс эскалации
да, я не спорю с применениями саги
но кода в ней больше и сам паттерн сложнее в реализации
источник

D

Dmitry in symfony
+ вы забыли что "серверу пизда" отменен, тогда еще компенсирующие транзакции надо запустить, чтобы фиксиков остановить
источник

SB

Sergei Baikin in symfony
Dmitry
кавычкы забыли вокруг весело. потому что сага это "весело". столько геморроя...
Да откуда там много гемороя
сага это обычная "Entity" которая реагирует на события и ими плюется. Ну мол реагировать на события не сложно. "Entity" не сложно. Откуда сложность при их соединении?
источник

D

Dmitry in symfony
Sergei Baikin
Да откуда там много гемороя
сага это обычная "Entity" которая реагирует на события и ими плюется. Ну мол реагировать на события не сложно. "Entity" не сложно. Откуда сложность при их соединении?
ну вы напишите одну сагу, которая бы работала сама, а потом давайте я вам слегка поломаю сеть, сервисы и тп
а потом пообщаемся на тему "как просто писать сагу с компенсационными транзакциями и при этом поддерживать согласованность данных"
источник

SP

Sergey Protko in symfony
Dmitry
+ вы забыли что "серверу пизда" отменен, тогда еще компенсирующие транзакции надо запустить, чтобы фиксиков остановить
class EscalationPolicy implements Saga
{
   private int $escalationLevel = 0;

   public static function configureSaga(SagaConfiguration $saga)
   {
        $saga
          ->canBeStartedBy(CriticalAlert::class)
          ->correlatesWith(fn(CriticalAlert $event) => $event->alertId)
          ->correlatesWith(fn(AlertAcknoleged $event) => $event->alertId)
          ->correlatesWith(fn(AlertResolved $event) => $event->alertId);
   }

  public function whenWeSeeCriticalAlert(CriticalAlert $event, Context $context)
  {
      $context->send(new NotifyOnCallProviders())
      $context->scheduleTimeout(DateTimeInterval::createFromString('5 minutes'), new EscalationPeriod($event->alertId))
  }

  public function whenEscalationNotNeeded(AlertAcknoleged | AlertResolved $event, Context $context)
  {
      $context->completeSaga();
  }
 
  public function whenEscalationPeriodPassed(EscalationPeriod $event, Context $context)
  {
       $this->escalationLevel++;
       $context->send(new EscalateQuickly($this->escalationLevel, $event->alertId));
  }
}
источник

SP

Sergey Protko in symfony
упрощенно как-то так
источник

SP

Sergey Protko in symfony
ретраи, конкаренси, сериализация, поиск стэйта, таймауты и отправка сообщений - все это берет на себя инфраструктура
источник

SP

Sergey Protko in symfony
если пытаться эту же логику реализовывать "без инфраструктуры" то да будет боль
источник

D

Dmitry in symfony
какой контекст слова инфраструктура ? это слой в ПО ? или железяки ?
источник

VK

Vladyslav Kopaihorod... in symfony
Dmitry
какой контекст слова инфраструктура ? это слой в ПО ? или железяки ?
По
источник

MM

Maksim Masiukevich in symfony
Sergey Protko
ретраи, конкаренси, сериализация, поиск стэйта, таймауты и отправка сообщений - все это берет на себя инфраструктура
посмотри, кстати, поделку Антона, который Титов
источник

SB

Sergei Baikin in symfony
Dmitry
ну вы напишите одну сагу, которая бы работала сама, а потом давайте я вам слегка поломаю сеть, сервисы и тп
а потом пообщаемся на тему "как просто писать сагу с компенсационными транзакциями и при этом поддерживать согласованность данных"
да писал вообще ей на сеть пофиг она про сеть ничего не знает и знать ей не надо. Собщения надженость обеспечивается кроликом sqs или еще чем то. Вообще пофиг на то что сеть падает. Ну и оркестрационные саги между сервисами это срань и зависимости я такое не использую.
источник

VK

Vladyslav Kopaihorod... in symfony
Maksim Masiukevich
посмотри, кстати, поделку Антона, который Титов
Это он написал темпорал?
источник

MM

Maksim Masiukevich in symfony
Vladyslav Kopaihorodskyi
Это он написал темпорал?
ага
источник