TRANSACTIONAL OUTBOX | Главный Паттерн Микросервисной Архитектуры

Поділитися
Вставка
  • Опубліковано 22 гру 2024

КОМЕНТАРІ • 175

  • @ixonjava
    @ixonjava 3 місяці тому +22

    Вооот. Наконец-то появилось на ютубе видео, которое объясняет реальные подходы к написанию кода. Надеюсь и дальше будут похожие видео, спасибо!
    Про транзакшнл идея хорошая, туда же можно и про аннотацию лок добавить, жду с нетерпением!😊

  • @vmm16-p9y
    @vmm16-p9y 3 місяці тому +16

    Умничка, очень хорошо объясняешь) приятно слушать + пример кода, что ещё нужно для счастья

  • @freegy4018
    @freegy4018 Місяць тому +5

    На 3:30 какая то каша. Во-первых пула транзакций не существует, есть connection pool, во-вторых, что значит что долгие транзакции блокируют другие быстрые транзакции, а конкретно в вашем примере на чтение??? Что под этим подразумевается? Вы хотите сказать, что если у меня транзакция, пусть даже уже 30 минут держит блокировку на какой-либо записи - я не смогу выполнить select ? С чего бы это вдруг? Особенно если берем за неупомянутые условие, что уровнь изоляции у нас стоит «read commited» т.е. по умолчанию.

  • @МаксМакс-ч8к
    @МаксМакс-ч8к 3 місяці тому +5

    Катя, спасибо за видос! Тема действительно актуальная!

  • @KoryRuno
    @KoryRuno 3 місяці тому +4

    Очень круто рассказываешь детали! Спасибо за труд, продолжай в том же духе!

  • @ArtemPetrov6
    @ArtemPetrov6 Місяць тому +2

    Для отображения хоткеев при использовании есть какой-то готовый плагин в IDEA. Он будет выводить на экран комбинации клавиш и не придется каждый раз объяснять что было нажато

  • @markus8313
    @markus8313 2 місяці тому +2

    Создавать мапу для реализации стратегии можно следующим образом:
    1. У каждого task processor прописываешь метод, который возвращает тип (taskType)
    1. Создаешь конфигурационный файл, в него инжектишь список таск процессоров
    2. Создаешь Бин мапы, где каждый элемент списка мапишь по taskType
    Теперь можно добавлять сколько угодно обработчиков делать, просто добавляя новый taskType и его реализацию

  • @furybarzha
    @furybarzha 2 місяці тому +2

    классное видео! Пожелание по монтажу - не увеличивать части кода и схем на доске, это и так норм видно, а при перепрыгивании зума сложнее следить

  • @povstanec0515
    @povstanec0515 3 місяці тому +4

    Катя, сделай пожалуйста видео про объяснение АНОТАЦИЙ СПРИНГА, КЛАССЫ КОТОРЫЕ ИСПОЛЬЗУЮТСЯ В СПРИНГЕ И ВЗАИМОДЕЙСТВИЕ ЧЕРЕЗ СЕТЬ. плииииз. залайкайте комент чтобы Катюньдель увидела и сделала видео

    • @kergshi9847
      @kergshi9847 2 місяці тому +1

      А прочитать слабо? Поколение аутистов...

  • @elfdeveloper
    @elfdeveloper Місяць тому +4

    Возможно, буду капитаном, но интерфейсы все-таки лучше создавать для:
    1) Возможности замокать его для тестирования, передав под интерфейсом фальшивую реализацию сервиса, имитирующую работу, необходимую для проведения теста
    2) Тут уже спорно конечно, но все же, для соблюдения Interface segregation из SOLID. Например, если нужно реализовать сервис, который занимается всеми задачами в рамках одного домена, а в какую-то часть приложения нужно проинжектить только нужный для этой части функционал этого сервиса - применяем Interface только для этого функционала

  • @АскарГазизов-х2э
    @АскарГазизов-х2э Місяць тому +2

    Крутой урок, спасибо

  • @evgkh8563
    @evgkh8563 3 місяці тому

    Мегаполезный видос, столько сопутствующих тем затронуто. Ну прям бест практикс! Огромное спасибо!

  • @морлишморли
    @морлишморли 2 місяці тому

    Продолжай, супер комфортная подача материала)

  • @kpacaf4ik
    @kpacaf4ik 3 місяці тому +1

    Отличный контент, спасибо! Пилите больше

  • @laletonio
    @laletonio 3 місяці тому +2

    Наконец-то!!! Эту информацию нужно нести в массы. Спрашиваю на собесе уже 10 лет, 1 из 10 может хоть что-то ответить, а ведь это азы!

    • @phat80
      @phat80 3 місяці тому +1

      1 из 10 соответствующий должности - это очень хороший показатель. И это релевантно для любой сферы. Было время подбирал сотрудников в строительную компанию. Я бы мог только мечтать, если бы 1 из 10 кандидатов подходил.

  • @valentineezerins6888
    @valentineezerins6888 Місяць тому +2

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

  • @ZamalSpace
    @ZamalSpace 3 місяці тому +1

    Было бы здорово, если Ты сделала бы вторую часть разбора этого патерна. О том как можно улучшить этот паттерн и какие можно сделать оптимизации для улучшения производительности.
    Хотим узнать о Event Driven )

  • @СтасСеверин-н9й
    @СтасСеверин-н9й 7 днів тому

    А если напимер rest запрос от Scheduler не дойдет в DeliveryService но дойдет в NotificationService или наоборот?

  • @andreyselin8076
    @andreyselin8076 3 місяці тому +1

    Увожение!
    Одноразовые интерфейсы мб нужны для dependency inversion или при работе над частью фичи которая не включает реализацию интерфейса, а только те места, которые надо сделать в рамках задачи

  • @konstantenivanov6235
    @konstantenivanov6235 3 місяці тому +3

    1) Сервисы помеченные как бины спринга не нужно создавать через new. Если хотите сделать стратегию через спринг, посмотрите доклад Евгения Борисова про паттерны на спринге...
    2) Помоему у вас select for update и сам update в разных транзакциях, думаете локи будут работать?:)
    А так в целом нормально. 🎉

    • @kronst
      @kronst 3 місяці тому +1

      У меня глаз задёргался, когда я увидел new

    • @vincentvega1444
      @vincentvega1444 22 дні тому

      2) А как ты себе представляешь использование SELECT FOR UPDATE для лока в рамках одной транзакции? Какой в этом смысл? Стейтменты в рамках одной транзакции и так же последовательно выполняются. SELECT FOR UPDATE и создан для того, чтобы другие транзакции UPDATE не выполняли. Вообще представляешь себе возникновение состояния гонки в рамках одной транзакции? Я думаю, что нет
      Единственное, что могут быть повторные отправки в случае такого подхода, но это вроде базовая практика идемпотентные эндпоинты писать, так что проблем быть не должно

  • @storm2735
    @storm2735 3 місяці тому

    Спасибо за отличное видео! Было бы интересно увидеть реализацию реактивного подхода(если сталкивалась) 🙃

  • @user-segadev
    @user-segadev 21 день тому

    если таблица retryable_task одна в микросервисной архитектуре, и ты предлагаешь одну таблицу иметь для всех ретраев, то как эта таблица будет шариться между сервисами?

  • @valentineezerins6888
    @valentineezerins6888 Місяць тому

    25.40 вместо ручной вставки типов, можно добавить метод в интерфейс TaskType. Далее private final List и потом его привратить во что то типа Map.

  • @street_paws_cafe
    @street_paws_cafe 3 місяці тому

    Прикольно, спасибо) Хоть сам пишу на руби, но все было более чем понятно

  • @non_holy6286
    @non_holy6286 3 місяці тому +2

    Из пула точно берутся транзакции, не коннекшн?)
    34:47 например, executorService + countdownLatch)
    37:21 Да что за "запихиваем"? Инжектим, внедряем, применяем мб?
    Спасибо за видео❤

  • @psevdonim_youtube147
    @psevdonim_youtube147 3 місяці тому

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

  • @no-binary_dragonknight
    @no-binary_dragonknight Місяць тому

    годнота

  • @artyomzolotoverkhov8468
    @artyomzolotoverkhov8468 3 місяці тому

    Мне понравилось видео, отдельное спасибо за пример кода!

  • @ArtemPetrov6
    @ArtemPetrov6 Місяць тому

    Подпишусь, пожалуй. По многопоточке тоже интересно посмотреть ролик)

  • @kalin5150
    @kalin5150 3 місяці тому +1

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

  • @mikhailsokolov9677
    @mikhailsokolov9677 3 місяці тому

    классное объяснение по такой полезной и в то же время мало-известной (как мне показалось) теме 💯💯
    был личный опыт - на собесе спросили как можно убедиться в целостности данных при распределённых транзакциях (ни про 2х фазный коммит, ни сагу, ни аутбокс я не знал), пришлось самому что то выдумывать 😅😅

  • @ArtemPetrov6
    @ArtemPetrov6 Місяць тому

    А что за паттерн с процессорами?

  • @Po4kaKita
    @Po4kaKita 3 місяці тому

    Как насчет аналогичного примера с гарантированной доставкой/получением в/из Кафка?

  • @Juzeppe24
    @Juzeppe24 3 місяці тому

    Качественный контент, наконец-то!

  • @na.kovalev
    @na.kovalev 2 місяці тому

    Паттерн на 33:02 - фабрика?

  • @volodymyrdanilin9077
    @volodymyrdanilin9077 3 місяці тому +4

    Тоже не вижу смысла сразу создавать интерфейсы на все подряд. Понадобится вторая реализация, тогда можно выделить интерфейс.

    • @alexlightweight
      @alexlightweight 25 днів тому

      Чем больше слоев абстракций тем лучше. Сарказм если что. 😂

  • @AlexA-s8g5z
    @AlexA-s8g5z 2 місяці тому

    Паттерн команда используется с маппой?

  • @ИгорьКоржов-х9ъ
    @ИгорьКоржов-х9ъ 3 місяці тому +2

    Классное видео, хоть я php разраб но было интересно как у вас в java мире это все пишется, спасибо за видео!

    • @a-shchedrin8466
      @a-shchedrin8466 3 місяці тому +1

      В пхп мире ровно так же используется этот паттерн

    • @furybarzha
      @furybarzha 2 місяці тому

      @@a-shchedrin8466 поэтому человек и написал не "как у вас в java мире это все используется", а "как у вас в java мире это все пишется"

  • @ArtemPetrov6
    @ArtemPetrov6 Місяць тому

    Разбор классный, ждём разбор задач с @Transactional.
    Про интерфейсы - под капотом же спринг через них прокси объекты создаёт насколько помню

  • @lyapin_d_m
    @lyapin_d_m 3 місяці тому +1

    Все отлично по содержанию, спасибо! Классно будет, если на канале будет такой контент. Его не хватает.
    P.S. По мне слишком часто отдаляется/приближается камера. Прям тяжело смотреть

  • @oleksandrvasylchenko316
    @oleksandrvasylchenko316 Місяць тому +1

    Размер транзакций ограничен, понятно что про пул конекшинов, но вызвало улыбку)

  • @SultanAliyev-s7w
    @SultanAliyev-s7w 3 місяці тому

    Привет, давай про @Transactional, что за плагин который подсказывает автокомплитит код?

  • @dfadfsdfsdsa4283
    @dfadfsdfsdsa4283 3 місяці тому +2

    Прошу еще про другие паттерны, начал изучать java

  • @Mike-nw1lf
    @Mike-nw1lf 3 місяці тому +3

    В одном потоке несколько тасков лучше не обрабатывать либо брать из базы одну таску под локом

  • @natsurukasumi3370
    @natsurukasumi3370 3 місяці тому +7

    15:31 - верное замечание по-поводу интерфейсов - однозначно лойс. У нас на проекте сейчас (!) интерфейсы используются как правило в библиотеках, поскольку слепое следование SOLID ведет к раздутости кода. Тем ребятам, кто впоследствии будет смотреть код, где слепо следуют этому принципу будет очень неприятно разбираться во всех этих кишках и простынях кода

    • @Mr43046721
      @Mr43046721 3 місяці тому

      Разве что чтоб потом в тестах мокать было удобнее

    • @volodymyrdanilin9077
      @volodymyrdanilin9077 3 місяці тому

      Тут кто как понял солид. Инжектируемый инстанс репозитория сам по себе интерфейс. Тут как посмотреть

    • @alexshavlovsky7922
      @alexshavlovsky7922 3 місяці тому

      интерфейсы это про ООП, а не про SOLID. солиду нужно следовать всегда в промышленном коде. как раз в простынях кода разбираться и не придется, потому что каждая ответственность будет сосредоточена в отдельном классе/пакете/модуле

    • @user-kuzya2023
      @user-kuzya2023 3 місяці тому

      Не согласен. Считается что использование интерфейсов нужно для создания JDK Dynamic Proxy, так как CGLIB Proxy это более тяжелый механизм, так как требует создания подкласса.

    • @alexshavlovsky7922
      @alexshavlovsky7922 3 місяці тому

      На Хабре есть статья, где чувак пытается заставить спринг создать JDK прокси. И у него так и не получилось. Спринг упорно создавал CJLIB прокси даже для классов имеющих интерфейс

  • @vizavi7764
    @vizavi7764 3 місяці тому +1

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

  • @vanyamaloy9170
    @vanyamaloy9170 3 місяці тому +2

    32:59
    Решение конечно красивое, но зачем было помечать их service если используете new ?
    И потом, почему service а не component? Service для бизнес логики то что в нашем домене, а тут какие то retryableTask о которых бизнес не знает даже

  • @leonid_konoplin
    @leonid_konoplin 3 місяці тому

    Что делать при подходе один сервис - одна база? Для отдельного сервиса Sceduler есть отдельная база, в которую нужно положить сообщение - это опять отправка данных в другой сервис во время транзакции... Или Scheduler отдельный сервис внутри микросервиса?

    • @paxpax1707
      @paxpax1707 3 місяці тому +1

      Если тебе нужна транзакционность между сервисами, посмотри в сторону Saga или в целом 2PC.

  • @CultureofSpeech
    @CultureofSpeech 3 місяці тому

    Такие все классные программисты , а где ваш видео-Хостинг взамен UA-cam интересно спросить

  • @sw1tch3roo78
    @sw1tch3roo78 3 місяці тому

    крутяк, спасибо за видео!

  • @Po4kaKita
    @Po4kaKita 3 місяці тому

    22:01 Зачем @Transactional над createRetyableTask?

  • @qazyhn94
    @qazyhn94 3 місяці тому +1

    канал интересный, подписался, правда вопрос это по сути самописанный RabbitMQ в своей базе данных, async messaging pub-sub with retry, я правильно понял?

  • @cool_talk
    @cool_talk 3 місяці тому

    Ё спасибо было круто😊

  • @nostradamus_tech
    @nostradamus_tech 3 місяці тому +12

    Лучшее видео за последнюю тысячу лет!!! О нем будут слагать легенды и эпосы!!

    • @alexmajak3159
      @alexmajak3159 3 місяці тому +1

      Об этом комментарии точно сложат легенды. Так глубоко никто никого не нахваливал в нашей галактике последние миллиард лет😂

    • @mugen31337
      @mugen31337 3 місяці тому

      В каком месте?

    • @nostradamus_tech
      @nostradamus_tech 3 місяці тому

      @@mugen31337 справа

    • @nostradamus_tech
      @nostradamus_tech 3 місяці тому

      @@mugen31337 справа

  • @macsimmax
    @macsimmax 3 місяці тому

    Многопоточку и transactional было бы интересно послушать 🙏

  • @СергейЯчменников
    @СергейЯчменников 3 місяці тому +2

    про transactional было бы интересно

  • @valentineezerins6888
    @valentineezerins6888 Місяць тому

    Почему в бд время не получать? CURRENT_TIMESTAMP().
    Вместо Pageable можно Limit.of() (после 3ю2) спринга

  • @crashkin
    @crashkin 3 місяці тому

    Провожу собеседования много лет, никогда не спрашивал(и у меня никто не спрашивал) такого ^__^
    и у меня есть ряд вопросов по коду
    * зачем отдельная транзакция на создание таски, ведь она уже создана в сервисе выше? я понимаю что она пропагейтится, но фигачить на каждый метод не круто
    * в мапстракт маппере создается еще один джексон маппер, зачем когда он уже есть в контексте спринга который и настраивается еще из пропертей? а тут 2 маппера с разными настройками
    * последнее и самое главное, начинали с "держать транзакцию пока выполнится запрос плохо", но пришли к "теперь мы держим транзакцию n*requestTime" что еще дольше и еще хуже чем первая :)
    на счет микросервисности, этот паттерн применим везде, но текущая реализация не подходит для микросервисов(джоба только в 1 поток может работать)
    код на бусти не видел, может там skip locked и тред пулы есть)

    • @maksimmuruev423
      @maksimmuruev423 3 місяці тому

      Да тут вообще дизайн полный ужас. Это в какой компании интересно такой подход используют? И полагаться на время в разных выборках тоже так себе практика время скорее всего не будет суперточно совпадать на разных инстансах особенно если они на разных физических машинах. Ну и да сваливать все в одну таблицу что бы потом из type городить огромный бородатый switch который будет решать в какую очередь отправить.. вообще вишенка.

    • @furybarzha
      @furybarzha 2 місяці тому

      @@maksimmuruev423 какой свитч ты чего алё, про нормальную стратегию не слышали

    • @furybarzha
      @furybarzha 2 місяці тому

      начинали с "держать транзакцию пока выполнится запрос плохо", но пришли к "теперь мы держим транзакцию n*requestTime" что еще дольше и еще хуже чем первая
      -
      почему дольше-то? Сохранить в БД дольше чем отправить запрос и дождаться ответа?

  • @Hi_Katy
    @Hi_Katy 3 місяці тому

    Годно по состоянию на начало 200х. А сейчас уж лучше event driven вокруг брокера

    • @Hi_Katy
      @Hi_Katy 3 місяці тому

      Ну ещё бы надо добавить, что это at least once доставка, так как отправитель может упасть после сделанной отправки , не успев проставить соответствующий статус.

    • @TheIADolgov
      @TheIADolgov 3 місяці тому

      вокруг брокера(сага - хореография) уже не модно. Последние новости моды: temporal(сага оркестрируемая + FSM) :)

  • @АндрейИванов-б6в9ч
    @АндрейИванов-б6в9ч Місяць тому +1

    Плохая реализация паттерна стратегия-опен клоус нарушен например)Плюс объявление метода с 4 параметрами -такая себе история

  • @inftech8976
    @inftech8976 3 місяці тому

    Здравствуйте, но возник такой вопрос: зачем такие данные хранить в sql бд, почему нельзя засунуть это в редис. Не знаю как в java, но знакомы ли вы с Celery?

    • @dragvs
      @dragvs Місяць тому

      А как вы транзакционность обеспечите между БД и Redis?

    • @inftech8976
      @inftech8976 Місяць тому

      @@dragvs Редис и есть БД, и я не понял вопроса, но попытаюсь, ответить, по тому как я понял: Зачем в данном кейсе нам вообще sql бд? Если сохранение тасков можно хранить в ligthweight бд, с форматом ключ-значение

    • @dragvs
      @dragvs Місяць тому

      @@inftech8976 вы понимаете что такое ACID и почему оно важно в данном кейсе? Вы предлагаете просто SQL DB заменить на NoSQL - в чем профит? В банках часто применяется SQL для хранения данных, как вы будете обосновывать решение? А почему не блокчейн? Он тут тоже подходит - в обе «таблицы» писать одной транзакцией. Выбор не так тривиален и сильно зависит от контекста.

    • @inftech8976
      @inftech8976 Місяць тому

      @@dragvs По вашему если я поменяю sql на nosql, то нарушится консистетность? Как она может нарушится, если нет никаких данных, которые бы могли взаимодействовать друг с другом? Хранение тасков и хранение к примеру клиентских данных, это совсем разные вещи, и никак не относятся друг к другу.
      При чем тут банк и хранение данных там? Я не говорил, что надо использовать основную БД как редис, ни один разумный человек не поставит основную бд с NoSQL, либо вы не понимаете суть этого ролика
      В случае видео, с хранением тасков, которые могли бы потеряться, автор использует SQL бд, а в таких случаях, бд с sql плохо подходит, потому что она будет работать медленно и нагружать к тому же сам сервис бд, если конечно не сделать отдельный сервис для тасков к примеру тем же postgres. А редис, конечно тоже нужно поднимать сервис, но нагрузки будет меньше, да и быстрее будут выводы, просто потому что таски - не такие сущности как те же клиентские данные. key-value

    • @dragvs
      @dragvs Місяць тому

      @@inftech8976 как вы будете ACID обеспечивать? Вам нужно атомарно и конситентно сохранить запись с данными и запись для отправки во внешнюю систему. Консистентность у вас нарушится если одна БД запишет а другая нет, у вас же payload это производная от записи в SQL базу. В этом весь «сок» паттерна. То что вы пытаетесь предложить можно с таким же успехом сразу запрос слать во внешнюю систему, какая разница Redis у вас внешка или notification service - вы получите те же проблемы решения.

  • @МаксимУстинов-е3ж
    @МаксимУстинов-е3ж 3 місяці тому

    А если ux дизайнеры решили, что нужно сразу получать информацию о доставке? А у вас delivery service отвечает минуту. Что будете делать?

    • @channel-yg2xc
      @channel-yg2xc 3 місяці тому +2

      Какую именно информацию? При оформлении заказа уже есть адрес доставки и отправки. Расстояние между двумя точками, время примерной доставки и стоимость вполне можно рассчитать в синхроне. Данные о курьере, если такой предусмотрен, ты не получишь, пока система его не подберёт. Это может быть и секунда, и минута, и десять минут. Поэтому на фронт обычно отдаётся статус заказа 'PENDING', отрисовывая экран с оформленным заказом и надпись "подбираем курьера", при подборе курьера отправляется пуш на клиента, который отрисовывает уже другой экран с информацией о курьере. Именно так работает Bolt такси, например.

    • @МаксимУстинов-е3ж
      @МаксимУстинов-е3ж 3 місяці тому

      ​@@channel-yg2xc а что, у тебя фронт будет получать полную информацию о курьере через сервис заказов? Или все таки достаточно зарегистрировать синхронно доставку, получить id?

    • @МаксимУстинов-е3ж
      @МаксимУстинов-е3ж 3 місяці тому

      @@channel-yg2xc а у тебя что, сервис заказов возвращает полную информацию о доставке на фронт? Может все таки зарегистрировать доставку, получить id? Я конечно рад за bold такси, что у них распределённый монолит работает, но все таки я бы предпочел микросервисы

  • @JohPeach
    @JohPeach 3 місяці тому

    На бусти нюдсы будут?

  • @rockkley9159
    @rockkley9159 Місяць тому

    Зачем эти переходы вперёд - назад на каждое предложение? Укачивать начинает то ли от переходов, то ли от возмущения странности монтажа

  • @gglox7342
    @gglox7342 28 днів тому

    А в чем смысл на 2:20 говорить, что пихать операцию создания записи в бд и рест запрос в транзакцию это кринж, а потом на этапе передачи сообщения в брокер, обмазывать это транзакцией(19:30)?

  • @svkotelnikov
    @svkotelnikov 3 місяці тому

    годно, пили еще

  • @GogiTavadze
    @GogiTavadze 3 місяці тому

    380 подписчиков?! Я ожидал как минимум 380 тысяч!

  • @anti1am3r
    @anti1am3r 2 місяці тому

    Досмотрел до UUID ключа. Аргументация еще круче "потому что я люблю". Ни слова про перфоманс, ни слова про то почему может потребоваться UUID и какие версии есть.

    • @JAVAGYMRAT
      @JAVAGYMRAT  Місяць тому +1

      @@anti1am3r приходи на след видос, буду все для тебя аргументировать
      Еще на стрим можешь зайти

  • @aligarhi5829
    @aligarhi5829 3 місяці тому

    Процессоры можно было бы тоже сделать бинами)

  • @Rostik13.96
    @Rostik13.96 2 місяці тому

    Катя, расскажи лучше, пожалуйста, как в hh устраивалась и как испыталку "прошла"🍿

    • @vincentvega1444
      @vincentvega1444 22 дні тому

      так она рассказывала, ты же оттуда это и узнал, тут видос про transactional outbox вроде, а не про прохождения испытов)

    • @Rostik13.96
      @Rostik13.96 22 дні тому

      @vincentvega1444 кинь link, пожалуйста. Занимательно будет соотнести с той in-side инфой, что у меня имеется, и тем, что в паблике ;)

  • @Сергей-у3к8й
    @Сергей-у3к8й 2 місяці тому

    всё. я влюбился.

  • @karandallidev
    @karandallidev 3 місяці тому

    Подскажите, очень надо.
    Java не учил ещё, знаю только python.
    Часто нужно получить apk.
    Декомпилировать.
    И собственно реверс и поиск как значений, так и методы формирования значений для запросов приложения, которые отснифаны ранее.
    Либо снятие защиты от снифа или от запуска на эмуляторе андроида , снова упаковка в apk и запуск.
    Реверс инженеринг.
    Как?
    Где?
    Чем?
    Каким образом?
    В общем, сервисы, ресурсы, где можно учить, изучать, использовать, для решения подобных задач.
    Java выучу, клянусь и ещё 4-5 языков, чуть позже, сейчас другое важное учу и решаю.
    Подскажи, очень нужно дельный совет.
    Заранее спасибо.
    Целую в щёчки, жму сосочки.

  • @eugenenazirovpersonal
    @eugenenazirovpersonal 3 місяці тому

    Отличный видос! Действительно обязательная тема для миддл+/синьор бэкендеров.
    Nit: Кажется в видео было упущено сохранение обновленных значений retryTime для тех retryableTasks которые мы все же не смогли обработать. Не сильно шарю в джаве, но кажется если обновленные значения закинуть в цикле через сеттер, то в бд они не отразятся. Наверное надо было просто добавить метод в репо, который бы обновил те записи, у которых статус не изменился на success.

  • @sau9703
    @sau9703 3 місяці тому

    На джвае нет что ли готовых шедуле библиотек ? - свой велосипед для типовой задачи как-то кринжово.
    На счет интерфейса для заказов . я бы небыл так уверен , сегодня в БД пишете заказы . а завтра решили сливать их в какую либо CRM-ку , да и в целом бизнес логика оформления заказа часто меняется , лучше пусть будет интерфейс он каши не просит реализуется за пять сек, и это точно не сложнее чем все потом править.

  • @dantesdamir
    @dantesdamir 3 місяці тому

    Спасибо за видео, на гитлабе не видно проект

  • @СытуСыкун-н6ж
    @СытуСыкун-н6ж 3 місяці тому

    Откуда ты все это знаешь

  • @pagorbunov
    @pagorbunov 3 місяці тому +1

    А что если мы успешно заретраили, но упали на апдейте статуса тасок?

    • @channel-yg2xc
      @channel-yg2xc 3 місяці тому +2

      @@pagorbunov сообщение отправится ещё раз. Тип доставки at least once

  • @ilnurryazhapov
    @ilnurryazhapov 3 місяці тому

    топ

  • @grigory2401
    @grigory2401 3 місяці тому +1

    ua-cam.com/video/HI-XvL2FkTQ/v-deo.htmlsi=YM1n8aHc0c-GOgNp&t=220
    Привет.
    Почему транзакция на запись блокирует чтение?

  • @artyomzolotoverkhov8468
    @artyomzolotoverkhov8468 3 місяці тому +1

    REST это не протокол, а соглашение.

    • @kazbowski
      @kazbowski 3 місяці тому

      стандарт*

    • @ggnet-lm7pg
      @ggnet-lm7pg 3 місяці тому +1

      протокол - это и есть соглашение, в каком виде приходят данные. Но REST сам по себе лишь один из видов представления передачи данных.

    • @channel-yg2xc
      @channel-yg2xc 3 місяці тому

      ​@@ggnet-lm7pgНет, rest это не соглашение формата данных. Строго говоря, данные могут быть в любом формате: json, xml, html, byte file, plain text и т.д. Rest в первую очередь соглашение о формате урла и отображении состояния запрашиваемой/передаваемой инофрмации путем внедения уникального идентификатора. Согласно модели OSI, rest не протокол, а SOAP вполне, т.к. имеет строгие ограничения формата передаваемых данных, при чем оба они работают с протоколом http.

    • @ggnet-lm7pg
      @ggnet-lm7pg 3 місяці тому

      @@channel-yg2xc Я и не говорил, что REST - это протокол. Я сказал что это data transfer architectural pattern/view, который накладывает определённые ограничения на передачу данных. В названии SOAP - явно указывается, что это протокол, в отличии от REST. REST - не является имплементацией, и не зависит от application/transport протокола.

    • @channel-yg2xc
      @channel-yg2xc 3 місяці тому

      @@ggnet-lm7pg
      - REST это не протокол, а соглашение
      - протокол это и есть соглашение
      - я не говорил что Rest - это протокол
      )))
      Но это такое, ты сказал, цитирую: "...Но REST сам по себе лишь один из видов представления передачи данных", я ответил, что это не так. Все ограничения формата данных, передаваемых по REST - это ограничения протокола http. В самом же REST нет ограничений http request body ни логически-концептуальных, ни физических, - его физически ограничивает протокол http и ни что более. Соответственно "вид/view"(проще говоря, данные запроса и ответа) может быть любым, который удовлетворяет протоколу http.

  • @eugenemironov2919
    @eugenemironov2919 3 місяці тому +1

    Я все равно не уловил фишку. Почему не послать просто в очередь? Зачем это все? И это как по мне не решает проблему, а переносить в другое место. Планировщик так же будет блокировать таблицу на добавление новых записей. Собственно, поэтому никто не знает ответ на собесах - слишком это кривое, неэлегантное решение.

    • @nikolayfedotov6947
      @nikolayfedotov6947 3 місяці тому +1

      Какие новые записи создаёт планировщик и что блокирует?
      В виде не сказано про idempotent Id в каждом запросе от планировщика к другому сервису. Этот id помогает слать один запрос много раз. А после успешной отправки запроса или ответа 409/406 (и т.д.) открыть транзакцию и обновить bool поле "отправлено"

  • @shrek95372q
    @shrek95372q 3 місяці тому

    prevet krasavisa

  • @olgafedyanova
    @olgafedyanova 3 місяці тому

    Хата волкаа? ❤🎉

  • @anti1am3r
    @anti1am3r 2 місяці тому

    Все же у нас пул соединений, не транзакций. И мы не ограничиваем кол-во транзакций в хикари. Ну и в целом аргументация по транзакциям очень слабая.

  • @alexeybakushev1932
    @alexeybakushev1932 3 місяці тому +1

    Здесь после каждого слова склейка видео? 😸 Теперь я знаю способ делать из женщин разрабов 😹😹

    • @ARTEMvorkhlik
      @ARTEMvorkhlik 3 місяці тому +1

      Просто она через каждое слово матерится, заводская привычка, пришлось вырезать

  • @kuqmua755
    @kuqmua755 3 місяці тому

    Я не понял, а чем собственно rest запрос на другой микросервис, который может быть "долгим" отличается от той же самой записи в базу данных, которая тоже может быть долгой. Это два внешних сервиса, никто не гарантирует что в какой-то из них запрос будет идти дольше/быстрее

    • @kuqmua755
      @kuqmua755 3 місяці тому

      И даже если мы запишем запрос с json в базу чтобы потом когда то там куда то там его отправить - мы все ещё не гарантируем что он дойдет до нужного сервиса. Даже не гарантируем когда он дойдет до сервиса. Просто поменяли шило на мыло.

    • @kuqmua755
      @kuqmua755 3 місяці тому

      Также потенциально таблица с заданиями отправить запросы может невероятно разрастись. Добавляется ещё одна потенциальная точка отказа

    • @jewgenijmoldawski3306
      @jewgenijmoldawski3306 3 місяці тому +1

      Вопрос правильный, ответ такой: базу выбираете вы сами и рассчитываете под свои потребности и можете подкрутить, если что. Другой же микросервис вы не контролируете, ну по крайней мере будем так считать. Ну и вот.

    • @paxpax1707
      @paxpax1707 3 місяці тому +2

      Тем что в первом случае у тебя вся транзакция отвалится по таймауту. Второй вариант позволяет тебе сохранить транзакционность доставки не имея проблем с таймаутом и тем что транзакция занята ожиданием ответа от другого сервиса. Конечно transactional outbox не под все задачи подходит. Но на видео разобрали очень популярный юзкейс. Если тебе нужная транзакционность между сервисами, посмотри в сторону 2PC и связанные паттерны. Вижу что в комментах люди пытаются натянуть сову на глобус.

    • @kuqmua755
      @kuqmua755 3 місяці тому

      @@paxpax1707 извините конечно но каким боком сохранение в базу и бесконечные ретраи обеспечивают транзакционность? Запрос спокойно себе может никогда не осуществится. Это полный бред

  • @Schumacher57
    @Schumacher57 2 місяці тому

    Ну почему java 😭😭😭😭😭

  • @ugabuga-t7z
    @ugabuga-t7z 3 місяці тому

    Герои не носят плащи

  • @2002ScrewDriver
    @2002ScrewDriver Місяць тому +1

    Какая бредятина...

  • @ugveydev
    @ugveydev 2 місяці тому

    Я больше не слушаю Асмр )

  • @vladislavlebedev6059
    @vladislavlebedev6059 3 місяці тому +1

    Описание проблемы неверное, она не понимает о чем говорит.

    • @JAVAGYMRAT
      @JAVAGYMRAT  3 місяці тому

      Так опиши конкретно, что не правильно

    • @vladislavlebedev6059
      @vladislavlebedev6059 3 місяці тому +1

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

    • @vladislavlebedev6059
      @vladislavlebedev6059 3 місяці тому +1

      Проблема в необходимости писать в больше чем один сервис, с этого надо начинать, у вас каша полная, вы не понимаете ничего в этом и не умеете выражать свои мысли последовательно

    • @alexlightweight
      @alexlightweight 25 днів тому +2

      ​@@vladislavlebedev6059 сейчас половина айти такое к сожалению. Сейчас отовсюду слышны крики что главное это софтскилы для построения карьеры в айти, вот результат. Читаем пару статей и идём с докладом на конференцию выдавая себя за эксперта. Это айти которое мы заслужили ! 😉

  • @phat80
    @phat80 3 місяці тому +14

    Устал слушать воду на 4й минуте. Пошел в гугл и прочитал за 3 минуты, что представляет из себя данный паттерн. Зачем эти 40 минут? Краткость - сестра таланта! В общем, только вводную часть можно было сократить до 30 секунд. Дальше не знаю. Обсасывать простейший паттерн 40 минут, это сильно.

    • @ConstantineGladky
      @ConstantineGladky 3 місяці тому +1

      Там ещё код такой и в целом "архитектура".

    • @dmitrybelov5703
      @dmitrybelov5703 3 місяці тому +2

      Спасибо, сэкономил время

    • @aimalkov
      @aimalkov Місяць тому +2

      Ну вам такой стиль не подходит значит . Кому то наоборот чем детальнее и подробнее тем лучше, все люди разные🤷‍♂️

    • @YanA-bk1nb
      @YanA-bk1nb Місяць тому +1

      Ты должен был наслаждаться красотой говорящего😅

    • @tackesi
      @tackesi 26 днів тому +1

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

  • @yr2235
    @yr2235 3 місяці тому +1

    Катя, иди борщ варить.

    • @JAVAGYMRAT
      @JAVAGYMRAT  3 місяці тому

      А я реально очень вкусный кубанский борщ готовить умею, видимо нужен кукинг стрим

    • @yr2235
      @yr2235 3 місяці тому

      @@JAVAGYMRAT 💋

  • @pan-gloowl
    @pan-gloowl 3 місяці тому

    Кстати, что у тебя за ноут, MagicBook16?

  • @pan-gloowl
    @pan-gloowl 3 місяці тому

    Хо-хо-хо, мать, ты появилась как раз вовремя, тебя то я и искал

  • @devKenny
    @devKenny 2 місяці тому

    такая ты малышка умная