Микросервисная архитектура для собеседования: Transactional outbox | Эйч Навыки

Sdílet
Vložit
  • čas přidán 16. 07. 2023
  • В этом видео наш ментор и лектор Саша Сахаров разбирает один из паттернов микросервисной архитектуры: Transactional outbox.
    Наш бот, с помощью которого можно апнуть грейд и зарплату или устроиться в компанию мечты: t.me/skills_mentee_bot?start=....
    Сервис развития карьеры Эйч: h.careers/
    Репозиторий с кодом: github.com/ansakharov/golang-...
    Чат Навыков в телеграмме: t.me/naviky_chat
    Группа Саши в телеграмме: t.me/SashaThug
  • Zábava

Komentáře • 29

  • @STAP2011
    @STAP2011 Před 11 měsíci +18

    Спасибо, ждем всю серию по паттернам микросервисной архитектуры :D

  • @NikitaGalkin
    @NikitaGalkin Před 8 měsíci +3

    Вот такой формат разбора паттернов просто великолепен!

  • @soundcloudlover
    @soundcloudlover Před 11 měsíci

    давно не было видео, спасибо!

  • @Levelord92
    @Levelord92 Před 11 měsíci

    о, вы вернулись, ура!

  • @mayonnaise228
    @mayonnaise228 Před 11 měsíci

    Огонь🎉

  • @asdfsavs6846
    @asdfsavs6846 Před 11 měsíci

    спасибо!

  • @rammtw
    @rammtw Před 11 měsíci

    контент огонь!

  • @berick5362
    @berick5362 Před 11 měsíci

    Ждёмс !)))

  • @jakosoll
    @jakosoll Před 11 měsíci +4

    прикольно, спасибо. Встречал чуть более сложную, но более универсальную реализацию для разных заданий. Смысл, что у нас есть outbox сервис, который вычитывает джобы из таблицы, а джобы могут быть разные, но с одним интерфейсом. Мы их создаем уже с конкретными реализациями, что нужно сделать для джобы: пульнуть в кафку или в вебсокет и т.д., а outbox только достает джобы из таблички в режиме for update, мапит джобу по имени из внутреннего (или внешнего) кеша, дает время на выполнение и если нет ошибок - удаляет из таблицы. Не знаю, зачем я это написал, но может кому пригодится)

  • @nikolaykozlov4888
    @nikolaykozlov4888 Před 6 měsíci

    Огонь

  • @user-sb9vw5ti9y
    @user-sb9vw5ti9y Před 11 měsíci

  • @zhuharev
    @zhuharev Před 11 měsíci +7

    Пара ошибок в финальном коде:
    1. Нельзя ходить по сети (писать в очередь) во время транзакции (постгрес не любит долгих транзакций, возникает блоатинг данных и индексов, забивается пул соединений).
    2. Не понятна роль транзакции вообще в продюсере. Ниже написали про FOR UPDATE - он норм. Я бы ещё предложил сделать не true/false, а стейты типа waiting/processing/processed. В таком случае мы будем знать какие события уже обрабатываются, а какие нужно послать второй раз.

    • @alexandrsakharov629
      @alexandrsakharov629 Před 11 měsíci +2

      Что я имею вам сказать)
      - транзакция действительно излишняя, можно обойтись без нее, не держать соединение
      - For update не поможет: если откажетесь от транзакции и станете слать парой воркеров данные, то после выполнения select первым, второй подхватит те же данные
      - waiting/processing/processed хорошая идея, в видео я показал крупными мазками

  • @alex-0x6b
    @alex-0x6b Před 5 měsíci

    Хороший паттерн. Только запись в аутбокс я сделал через хранимую функцию и триггеры где указываю из каких таблиц надо добавить записи в аутбокс, чтоб не зависеть от реализации на клиенте.

  • @RomanAlexandrov
    @RomanAlexandrov Před 11 měsíci

    Спасибо большое за видео, а какие ещё паттерны микросервисов обычно спрашивают и что из них по хорошему нужно знать, а то их там порядка 60, какие приоритетней?

  • @Victor-kc3cx
    @Victor-kc3cx Před 10 měsíci +2

    Если требуется outbox на другие сушности, помимо заказа, то создаем на каждую сущность свою outbox табличку или в одной как-то по типам разделяем ? entityType, entityID или что-то в этом роде

  • @user-rp5ej1ui4g
    @user-rp5ej1ui4g Před 11 měsíci +1

    Хотелось бы уточник два момента
    1. В воркере не нужна транзакция, если он один. Т.к. мы получаем данные, отправляем в очередь, обновляем таблицу. Если бы воркеров было несколько то можно было бы заюзать транзакцию для Select for update
    2. И есть сомнения, что хорошо балково отправить сообщения в кафку, а потом балоково обновоить бд. Может лучше по одной, хотя бы достать какое то количество, а отправлять и помечать что отправлен по одной строчке.

    • @alexandrsakharov629
      @alexandrsakharov629 Před 11 měsíci

      Из воркера можно и убрать транзакцию, правда.
      А чем балк смутил? По одной несерьезно отправлять

  • @oiei2767
    @oiei2767 Před 7 měsíci

    а в Goland есть снипет что бы не писать каждый раз "if err итд" можно на строке ниже необработанной ошибки прст жмакать ctrl+j и писать err и он сам всё сделает)

  • @andreykyzn
    @andreykyzn Před 10 měsíci

    В конце Relay сервису не плохо бы организовать подписку на изменения если все горутины вышли чтобы когда платежки редкие задержка была меньше. Вроде про это не сказано.

    • @waffleboot
      @waffleboot Před 8 měsíci

      А как решать конкурентный доступ к одним и тем же данным? Есть воркеры, которые данные из outbox выгребают периодически и если еще и воркера подписать на онлайн изменения, то как защититься от одновременной работы с одной и той же записью? Ведь может так совпасть что онлайн воркер начнет отправлять сообщение, которое поднял уже другой воркер

  • @qrthack3233
    @qrthack3233 Před 3 měsíci

    Один ноль один мой друг. Хочу в backend, выбираю между PHP, Golang, c# и Java, что посоветуешь, чтобы легче было устроиться на работу с перспективой?

  • @Arkham_nine
    @Arkham_nine Před 11 měsíci

    Спасибо за видео.
    А зачем сохранять в outbox таблицу, мы же можем подписаться на WAL каким-нибудь коннектором (например kafka) ?

    • @waffleboot
      @waffleboot Před 8 měsíci

      А WAL разве не просто поток данных? Просто что будет если транзакция отвалится, у нас ведь данные уже будут в WAL, получается коннектор их уже увидит, но коммита не было. Коммит конечно в WAL тоже появляется, но получается получатель данных из WAL должен уметь чекать транзакции и отбрасывать из потока данных от WAL те, по которым не было коммита

    • @Arkham_nine
      @Arkham_nine Před 8 měsíci

      @@wafflebootWAL гарантирует что если транзакция отвалится, то при старте сервера то что было в WAL накатится.

  • @waffleboot
    @waffleboot Před 8 měsíci

    Не очень понятно как поступить когда хочется отправлять сообщение тут же, а не ждать когда воркер проснется и вытащит из outbox запись. Допустим у нас несколько узлов и на каждом узле несколько воркеров. Как сделать так чтобы отправка сообщения шла тут же, не ждать когда их воркер поднимет и при этом защититься от одновременной обработки одного и того же сообщения разными брокерами

  • @user-jh1vx3vx1c
    @user-jh1vx3vx1c Před 11 měsíci

    А зачем апдейтить когда только true/false, если можно удалить сразу?

    • @alexandrsakharov629
      @alexandrsakharov629 Před 11 měsíci +4

      На другой стороне могут потерять данные: авария кафки, баги в коде.
      Так останется лог по которому можно еще раз отправить события, обновив таблицу sent true -> false для массива "пролитых" сообщений.
      Пример: команда аналитики теперь считает новыми алгоритмами, и может отдать пользователю более качественный результат. Но старые данные они уже посчитали и сохранили. Как быть? Переливаем данные сообщения в этот или в другой топик, специально для них, пусть пересчитают и отдают более точную аналитику по событиям трехмесячной давности

  • @rugleb
    @rugleb Před 3 měsíci

    10:18 плохо не то, что ОН заливает, а что у ВАС ревью херовое