senior.rita | архитектура и код


Гео и язык канала: не указан, не указан
Категория: не указана


Друзья, всем привет 👋
Этот канал про фронтенд, архитектуру, безопасность и большие системы.
А ещё - интересные новости из мира разработки, конференции, путешествия и просто немного жизни 🙂
Welcome on board 🚀

Связанные каналы

Гео и язык канала
не указан, не указан
Категория
не указана
Статистика
Фильтр публикаций


Забавное совпадение получилось.

Буквально сейчас прохожу в Касперском курс «Моделирование угроз» и вот вот выходит новость, что во время внутренних тестов модели Anthropic получили доступ к реальной инфраструктуре нескольких организаций из-за ошибки в конфигурации тестовой среды. В одном из сценариев модель даже опубликовала вредоносный пакет в PyPI.

Зачем вообще существует моделирование угроз? И вообще вот эта часть "моделирование" сама по себе интересна. По факту это ни что иное как попытка мысленно спроектировать будущие сценарии.
То есть ты смотришь на систему, которой еще не существует или которая только только проектируется, и начинаешь задаваться вопросами. Что будет, если злоумышленник украдет токен? А что случится если кто-то получит доступ к базе?

И как мы видим ребят аишка добавляет теперь новый геморрой - что будет, если AI-агент получит доступ к сети? Что будет, если ему по ошибке дадут права, которых быть не должно? Что будет, если он сможет публиковать пакеты, запускать код или взаимодействовать с внешними сервисам?

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

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

Ссыль на почитать - https://www.bbc.com/news/articles/cz7dl7w8y7po


Ребят, сегодня гуляла по Переделкино и зашла в Дом творчества писателей.

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

Так вот, наткнулась на книгу Жана Бодрийяра «Америка». Это книга 1986 года. Французский философ путешествует по США и размышляет о технологиях, культуре и будущем.

Открываю почти наугад…

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

Напомню что книга то написана ребята почти 40 лет назад!.

Когда не было ни чата гпт, ни курсора, ни клода ни прости господи дипсика.

Мы вот постоянно с вами спорим, заменит ли аишка программистов.

И мне кажется, вопрос уже немного другой: не перестанем ли мы получать удовольствие от самого процесса размышления?

Потому что сегодня действительно очень легко спросить у модели и гораздо сложнее взять задачу самостоятельно.

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

Ну в общем. Хочу почитать Бодрийяра целиком. Кажется, некоторые его мысли сегодня звучат даже актуальнее, чем в 1986 году.


С утра в тазике помылся. Поехал на работу на велике, потому что нет бензина. Оплатил кофе наличкой, потому что нет интернета. Сижу на конференции "Новые технологии и развитие" 🗿


В интересное время конечно мы живем, ребята:)

Вокруг многие обсуждают ai-агентов, новые модели, локальные llm, а вместе с этим вирусится мем про парнишу который едет на конференцию по искусственному интеллекту с двумя канистрами бензина в багажнике🙃

Пришел и мой черед стихийных бедствий 🙈 Сегодня отрубили горячую воду 🥲 Кажется, пришла пора купить водонагреватель.

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

Кто пользуется водонагревателем в квартире?

И если есть модели, которые реально пережили уже не один сезон отключения горячей воды и не доставляют головной боли - очень жду ваших рекомендаций 🙏 Шпасиба 🙃


Сегодня наконец-то добежала до новости про TypeScript 7 RC. Та самая версия где компилятор теперь на Go. И мне стало интересно что пишут комментаторы к этой новости.

В ветке внезапно стало интереснее, чем в самой статье 🙃

Кто-то интересно подсветил, что следующий логичный шаг вообще генерировать js-бандлы из Go. Типа круг замкнется: когда-то JavaScript пришел на бэкенд благодаря Node.js, а теперь язык бэкенда потихоньку заползает во фронтенд.
Народ, конечно, сразу начал спорить. Одни вспомнили TinyGo, другие начали рассказывать, почему модель исполнения Go никогда нормально не ляжет на js. Классика 🙂

Кажется, мы постепенно начинаем воспринимать TypeScript совсем не так, как воспринимали его раньше, я имею ввиду просто какой-то оболочкой вокруг js, ведь в сущности все крутиться вокруг типов:

AI читает контракты. Тот же OpenAPI, генерация SDK, документация, IDE - все начинают использовать их как источник знаний о системе.

Возможно, главная новость вовсе не в том, что компилятор переписали на Go. Может быть, TypeScript настолько разросся, что уже перестал быть просто языком программирования. Он постепенно становится частью инженерной инфраструктуры.

Если вернуться к ветке - честно я не думаю, что через 10 лет фронтендеры будут писать приложения на Go. Однако, я вполне допускаю, что через 10 лет 80–90% всей инфры вокруг фронтенда (компиляторы, линтеры, бандлеры, анализаторы, кодогенерация, AI-инструменты) будет написано на Rust, Go или C++.

Кстати, если захотите почитать ту самую ветку, вот статейка:
https://habr.com/ru/companies/otus/news/1050634/


И снова «шпикер» 🙃 #сбер #школа21 #moscowjs


История одного конфуза

Решила я собрать себе первый в жизни компьютер.

Ну а шо? Пора и железо потрогать, кодяра уже освоена)

Несколько дней выбирала каждую деталь. Сравнивала память, спорила про видюхи, искала идеальную материнку, выбирала SSD.

В итоге собрала добротную сборку:

💚Рязань 9 9950X
💚RTX 5070 Ti
💚96 ГБ памяти дырдыр5
💚Шансонг 4 ТБ SSD

А потом был поставлен куллер и я поняла что стеклянная стенка тупо не закрывается😅 Вообще🙈

И вот уже два часа мы с ChatGPT, инструкциями и интернетом расследуем, кто кого обманул: корпус, кулер или законы геометрии.

Первый опыт сборки ПК официально признан успешным🫠

P.S. Ребята, если среди вас есть опытные, которые собирали CH780 + Assassin IV, срочно расскажите, как вы закрыли боковую стенку😂😂

355 0 3 10 23

Репост из: MoscowJS
Плагинный фронтенд звучит здорово ровно до того момента, пока все команды не упираются в один общий BFF.

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

Также на примере своей компании Kaspersky Маргарита разберет, как дать командам больше независимости, снизить количество конфликтов и не превратить BFF в ещё один монолит.

25 июня, MoscowJS 71 x Школа 21

Регистрация | Промокоды | #moscowjs #moscowjs71


🙃 вот и анонс!)Все расскажу:) с кайфом и дискуссией, разумеется:)


Не осудим, но обсудим

Ребятки, кажется, у нас появляется новая рубрика 🙃

И начнем мы ее с вами с Frontend-First подхода.

Потому что термин вроде простой, но вокруг него часто начинается el classic ситуасьон:

- Фронты опять хотят, чтобы весь мир крутился вокруг их кнопочек?

Не не. Дааавайте разберем:)
Frontend-first - это подход, который тонко намекает нам, что доменная модель больше никому не нужна.


В своих докладах на #FrontendConf и #HolyJS ( тут должна быть реклама ссылка, но пока нет возможности разместить - позже обязательно добавлю ) я рассказывала, что проектирование фичи начинается с пользовательского сценария.
А пользовательский сценарий зачастую пронизывает несколько доменов одновременно.

То есть сама парадигма восприятия такая - "что пользователь должен сделать, увидеть и понять?"

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

- Бэк уже сделал апи.
- Фронт получил контракт.
- Где-то рядышком тусит дизайн.
- Заказчики что-то еще в конце уточнили по требованиям.
(далее цикл
повторяется)

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

- Ну вы же можете это на фронте замаппить?
- Ну, мы то
можем)
- Мы вообще много чего можем 😅

Но дело не в том - а можем ли.
Где этой логике реально мес
то?

Frontend-first предлагает сначала зафисировать следующий сценарий:

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

А уже потооом решать, кто это собирает: может backend, а может - BFF, а возможно вообще несколько сервисов + адаптеры или еще какая-нибудь инженерия.

Что в этом хорошего:

1. Меньше случайной сложности на фронте.
2. Быстрее всплывают реальные требования.
3. Контракт становится ближе к продукту.
4. Команды начинают обсуждать сценарий, не абстрактные сущности.

Но, конечно, есть нюанс.

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

Если все маппинги и бизнес-правила сложить в BFF - через год там будет мини-монолит, два костыля и один человек, который трясущимися руками все это дело трогает, креститься прежде чет влить) ("Не трогай если работает" :)) ).

Поэтому frontend-first было бы ну неправильно советовать пихать повсюду.Я бы начала с вопроса - "какой пользовательский сценарий мы вообще строим?"

А у вас как?

С какими подходами вам удавалось работать: frontend-first, backend-first, domain-first, API-first или какой-нибудь прекрасный микс из всего сразу?

И где вы чувствовали себя максимально комфортно в поддержке всего этого доб
ра?

В следующем посте как раз обсудим, как frontend-first дружит с нашим любимым FSD-шечкой и куда в этой истории девать мапперы, адаптеры и прочую прекрасную прослойку между апи и ui.

На почитать:

📚 Habr - Разработка веб-сервисов: контракт, интеграция, реализация
Вот тут ребят хороший текст про то, почему API должен быть клиентоориентированным и зачем фронтенду участвовать в проектировании контракта


📚 Habr - Просто о сложном: архитектура фронта для техлида
Хороший текст про то, почему фронтенд-архитектура - это не только "куда положить компонент", а отдельный способ думать про функциональность, границы и развитие продукта


#frontend #architecture #enterprise #senior


Ребятки! 🙌

Важно для всех, у кого есть инста .

За последние дни появилась информация о новой схеме угона аккаунтов через ai поддержку Meta.

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

Как пишут сми - пострадали не только обычные смертные но и акки известных компаний.

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

- врубить двухфакторную аутентификацию (лучше через какой-нибудь аутентификатор)
- чекнуть привязанные ящики и номер телефона
- почту ребят тоже нужно загнать под 2fa
- проверит список активных устройств ( я бы даже в первый пункт это отнесла )


В общем, ушки на макушке.
Все будет хорошо 👌

#security #instagram #cybersecurity


#codeFest16
Спасибо, друзья!❤️ Я рада что тема откликнулась и вам было полезно!Есть пища для ума по следующему выступлению ❤️


Для ребят, которые придут сюда после доклада Архитеĸтура большого фронтенда: ĸаĸ избежать хаоса

Материалы и ссылки

Что почитать

FSD:
https://feature-sliced.design/docs/get-started/overview

Слои FSD:
https://feature-sliced.design/docs/reference/layers

Slices, segments и public API:
https://feature-sliced.design/docs/reference/slices-segments

FEOD от SM Lab / Спортмастера:
https://habr.com/ru/companies/sportmaster_lab/articles/972410/

Предыдущая статья SM Lab про архитектуру фронтенда:
https://habr.com/ru/companies/sportmaster_lab/articles/866028/

Если унести одну мысль

Не ищите идеальную архитектуру. Ищите архитектуру, которую можно масштабировать без разрушения системы.

#conference #codefest


Спасибо, ребята ❤️ Было очень хорошо и по доброму ❤️
#holyjs #conference


Ну что ж:) начинаем ❤️
#conference #holyjs


До этого мы говорили про удалённые вызовы и почему большие системы начинают общаться через сообщения.

И следующее что мы с вами разберем - а как модули вообще разные части системы общаются друг с другом?

Потому что первое желание обычно какое? Прально!

давайте просто напрямую вызывать соседнюю часть системы


( спойлер: плохая идея )

Ну, допустим, у нас есть:

- устройства
- уведомления
- аналитика

Допустим, наш дорогой пользователь поменял статус устройства.

Самый очевидный путь какой?

Логика устройств такая:

“так, надо показать уведомление”

“так, ещё надо отправить событие в аналитику”

И начинает напрямую ходить в соседние сервисы.

Будет как-то так выглядеть в коде:


notifications.showMessage()

analytics.saveEvent()


Ну а чо. Работает же 😌Однако..

Проходит время. Система растёт. Частей становится больше. И в этой растущей системе устройства зависят от уведомлений, уведомления зависят ещё от чего-то, аналитика вообще уже от половины системы 🤯🤕

И через годик кто-нибудь открывает проект и такой:

“а кто вообще кого вызывает?” 💀

Но это ещё ребят полбеды.

Представьте: вы временно отключили уведомления и внезапно половина системы легла)) Ну потому что всё было жёстко связано между собой. И особенно знакомо это тем, кто работал с микрофронтендами 😅И как только разные сервисы начинают напрямую дёргать друг друга - независимость начинает потихонечку испаряться.

И вот тут товарищи инженеры начинают думать - а может вообще не надо знать друг про друга напрямую?

И появляется очень лаконичная идея общаться через события

То есть - вместо:


notifications.showToast()

analytics.track()


сервис просто говорит:


“ребят, устройство обновилось”

eventBus.emit('device.updated')


А дальше уже кому интересно - тот сам среагировал.

Например:

- уведомления показали сообщение
- аналитика записала событие
- другой экран обновил данные

И самое приятное:

микрофронт, который обновил устройство, вообще не знает, кто это событие слушает

Вот для эт
ого и появляется шина событий

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

Но у таких событий тоже есть цена, потому что дальше начинаются очень весёлые вопросы:

“а что если какая-то часть системы подключилась позже?”
“а почему событие обработалось два раза?”
“а кто вообще это слушает?”
“а почему вся система внезапно стала магией?”

И вот про это - уже следующий пост 😌

Если хочется чуть глубже покопаться в теме - ниже на мой взгляд хорошие годные материалы

📚 Habr - Observer vs Pub/Sub
Очень хорошо объясняет, почему события уменьшают связанность между частями системы:
https://habr.com/ru/articles/270339/

📚 Habr - Как мы проспали event-driven революцию
Неплохой материал про событийный подход и большие системы:
https://habr.com/ru/articles/906800/

#conference #holyjs #architecture #modularbff


В конце прошлого поста у нас возник логичный вопрос:

а коммуникация-то у нас синхронная или асинхронная? 🤨

И вот тут начинается интересная инженерная меджик.

Потому что ответ… и да, и нет:))

Ща объясню. Смарите.

Для разработчика всё обычно выглядит как будто общение синхронное.

Мы пишем:


const cards = await server.card.getList()


И ощущение такое:

ну окич, вызвал метод -- получил ответ

Максимально привычная история - как наш любимый rest, как fetch, как обычная стратегия реквест-респонс.

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

1️⃣ клиентский хост берёт вызов
2️⃣ упаковывает его в сообщение
3️⃣ отправляет через транспортный слой
4️⃣ дальше вызов может уехать в брокер или очередь
5️⃣ серверный модуль его обрабатывает
6️⃣ ответ возвращается обратно
7️⃣ платформа связывает запрос и ответ

И это уже вполне себе асинхронная коммуникация. То есть тут важная мысль:

синхронность / асинхронность — это про то как реально устроена доставка сообщения под капотом


Для фронтендера всё выглядит вот так:


await server.card.getList()


И ему, если честно вообще хорошо, потому что - привычно 😌

И товарищу фронтендеру не надо думать:

- как сообщение маршрутизируется
- как ответ найдёт свой запрос
- что будет при повторной отправке
- как устроен транспорт

Всё это - головная боль платформы.

И вот тут появляется очень прикольная инженерная идея:

снаружи у нас привычный синхронный вызов а внутри - хоть ракета 🚀


То есть разработчик работает с понятной апишкой

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

Поэтому следующий пост - про шину событий.
Он же event bus.
Он же - автобус событий ( май инглиш из перфект ) 😅


#conference #holyjs #architecture #modularbff


Итак, продолжаем серию наших игр 😅

А продолжаем ее мы с поста про RPC 👀

У нас с вами в прошлом посте был логичный вопрос:

А че не REST? 🤨


И вопрос, кстати, хороший.

Потому что REST - это нормальная такая взрослая рабочая история.

Я честно ребят не из лагеря, мол, рест ууумер! Срочно всё перепииисываем!!!” Не-не) REST - это вполне ок на сегодняшний день, куда не плюнь все его весело радостно используют.

Но есть нюанс ( как в том бородатом анекдоте ).

Представьте, что у вас не маленький проект, а уже большая энтерпрайз махина. У вас есть много клиентских модулей, много серверных модулей, много команд, много методов и всё это постоянно!! меняется. И внутри модулей вам нужно вызывать что-то такое:


server.user.getPermissions()
server.card.getList()
server.balance.getSummary()
server.notifications.markAsRead()


Вариант номер один - классический путь с рестом.

Под каждый метод мы что делаем? Праавильно!
Заводим отдельную ручку:


GET /permissions
GET /card/list
GET /balance/summary
POST /notifications/read


Сначала кажется: ну и чё, норм же:))

Да..

Норм))

Но пока у вас:

- мало модулей;
- мало методов;
- мало команд;
- мало изменений;

А потом время проходит и велком ту энтерпрайз)))

И чет уже не так удобненько стало))
Внезапно появляется:

- тонна ручек;
- тонна сваггеров / openapi-схем;
- куча роутинга;
- разные конвенции по наименованию;
- разные версии API;
- много бойлерплейта;
- “ой, а кто сломал контракт?”;
- “а эта ручка ещё используется?”;
- “а почему у соседнего модуля почти то же самое, но называется иначе?”

И вот тут люди начинают думать:

слушайте… а может мы не будем под каждый чих делать отдельную рестовую ручку?


И появляется идея:

генерализовать вызов.

То есть вместо:

у каждого метода свой эндполинт

делаем:

у нас есть один общий способ доставить вызов в нужный модуль

Условно, это может выглядеть так - единая нотация написания сообщения:


{
"moduleId": "card",
"method": "getList",
"params": {
"page": 1
}
}


То есть платформа сама понимает:

- куда это доставить;
- какой модуль нужен;
- какой метод вызвать;
- какие параметры передать;
- как связать запрос и ответ;
- как вернуть результат обратно.

Тут на самом деле важно понять что мы ни в коем случае не убиваем рест. И боже упаси мы не говорим “никогда не используй рест”.
Мы просто говорим что в некоторых модульных системах удобнее генерализовать транспортный слой, чтобы разработчик работал вот так:


await server.assets.getList()


И не думал а какая там ручка? какой URL? какая версия апишки? это GET или POST? а кто владеет этим endpoint? и тд

Для разработчика остаётся нормальный, привычный я бы сказала, типизированный апи. А платформа уже сама решает как этот вызов доставить. И это даёт очень приятную штуку:

платформенную гибкость.

Сегодня внутри может быть socket.io, завтра какой-нибудь брокер сообщений а послезавтра ещё какая-нибудь весёлая инженерная конструкция. Но апиха для разработчика не меняется - в этом и смысл генерализованного вызова:

стабильный API для разработчика + гибкая доставка внутри платформы.


Конечно и в данном случае есть своя цена этой красоте. Если мы генерализуем вызовы, нам нужно аккуратно решать:

- как описывать контракты;
- как валидировать параметры;
- как версионировать методы;
- как трассировать вызовы;
- как связывать request и response;
- как обрабатывать ошибки;
- как не превратить универсальный транспортный слой в универсальную помойку 😬🫠

И вот отсюда появляется следующая интересная тема:

а коммуникация у нас синхронная или асинхронная?

Потому что снаружи разработчик пишет: await server.card.getList() и это выглядит как обычный синхронный request/response. Однако, внутри платформы вызов уже может ехать через очередь, брокер и асинхронную доставку. И вот там начинается отдельная инженерная меджик)

#conference #holyjs #architecture #modularbff


Ну шо, коллеги! Погнали дальше 😌

RPC - Remote Procedure Call

Если прям совсем по-простому:

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

То есть для разработчика это может выглядеть примерно так:


await server.user.getAllPermissions()


Красота.

Как будто просто вызвали метод.

Да, но нет 😅 Точнее - не совсем 🙂

Под капотом это не обычный вызов функции.

Потому что серверная часть модуля живёт не в браузере ( сюрприз сюоприз ).
И серверный модуль сам по себе не лежит рядом с вашим реакт компонентом, даже если вызов выглядит очень френдли.

Значит, хосту нужно сделать примерно следующий финт ушами:

1. понять, из какого клиентского модуля пришёл вызов;
2. понять, в какой серверный модуль его нужно доставить;
3. понять, какой метод вызываем;
4. передать параметры;
5. отправить это всё через транспорт ( будет отдельный пост про транспорт - все разберем );
6. дождаться ответа;
7. связать ответ с исходным запросом;
8. вернуть результат обратно в клиентский код.

И вот здесь начинается меджик нашего хоста.

Под капотом такой вызов превращается в универсальное сообщение.

Условно:


{
"moduleId": "vulnerability-management",
"method": "getAllPermissions",
"params": {},
"reqId": "req_42"
}


То есть вместо:

вызови мне вот эту функцию напрямую


мы говорим:

товарищ платформа, доставь плиз вот этот конкретный вызов в нужный серверный модуль


Дальше серверная платформа кивает головой и шо она делает:

- она понимает, какой модуль нужен;
- маршрутизирует вызов;
- упаковывает его во внутреннее сообщение;
- отправляет через транспорт, брокер или внутренний адаптер;
- связывает request и response;
- возвращает результат обратно.

А нам как разрабам все супер привычно - мы как будто вызвали обычный метод а дальше уже ребята - не наша головная боль)

И это, если честно, очень удобно.

Потому что мы:

- скрываем транспорт;
- скрываем брокер и внутренние адаптеры;
- не заставляем клиентский модуль знать внутреннюю кухню;
- не заводим отдельную REST-ручку под каждый метод;
- можем менять реализацию доставки под капотом;
- оставляем для разработчика простую типизированную апишку.

Сегодня внутри могут быть сокеты, дальше вызов может уйти через какой-нибудь брокер, послезавтра там может появиться ещё какая-нибудь весёлая платформенная инженерия, о которой товарищ фронтендер ваще не обязан знать 🙂

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

Но тут появляется логичный вопрос:

“А почему просто не rest?”


И вот это уже хороший вопрос!

Потому что дальше мы плавно подходим к теме:

Зачем вообще люди начинают генерализовать вызовы?

#conference #holyjs #architecture #modularbff


Пиу! 💫

Окей, погнали с базы.

Чем Gateway отличается от BFF?

Потому что эт правда одна из самых частых путаниц.

Типичный диалог в enterprise:

- У нас есть апи gateway!
- Крутяк! Значит BFF используете да?
— …эээ..шта?)


Ну ладненько 😅

Несмотря на то, что оба сидят “между клиентом и бэкендом”, задачи у них ребят эбсолютли разные.

Я тут попросила нейронку ( хе хе ) сгенерить абстрактный пример чтобы было понятно на кошечках
Я кстати вообще люблю нейронки и нет да нет юзаю их в таких вот кейсах

Знач, цитирую господина Чэда Джипити ( умный чел кстати ):

Представьте торговый центр. ( ой, нравится мне как он начинает, как будто ща будет прям тру стори 😂 Ладно, все, не перебиваю )

🏢 Gateway - это охрана + ресепшен на входе.

Он:

• понимает, куда вас отправить
• может проверить авторизацию
• умеет балансировать нагрузку
• проксирует запросы
• иногда логирует, ограничивает rate limit и делает прочую инфраструктурную магию

Но.

Ему вообще всё равно зачем вы пришли.

Он не знает:

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

Для него логика примерно такая:

> /users → туда
> /orders → сюда
> /billing → вот туда

Максимально инфраструктурная история.

Итак, переключаюсь с робота на себя обратно - в целом ребят текст выше справедлив! Я бы еще добавила некоторую инфу:

Смотрите, bff понимает:

- какой пользовательский сценарий сейчас происходит
- какие данные реально нужны прям конкретному экранчику
- как собрать их из нескольких бекенд сервисов
- как адаптировать ответ под ui - по простому сделать адаптер/маппинг

В обычной же жизни как происходит? Прааавильно! Пользователь открыл экран и данные для него лежат сразу в нескольких сервисах и без BFF фронтенд начинает жить жизнью:

ща, погодите, я 7 миллиардов запросов сделаю, потом это всё склею, потом переименую поля, потом ещё маппинг а потом еще а-а-а-а-а-а-а …

И через пару лет получается:

блин странно че от нас стажеры сбегают 😂😂


Тут появляется BFF ( сцена, камера, сафиты, выходит он.. ).

Его задача - понять пользовательский сценарий и отдать фронту удобный контракт. И все! вот реально - все!)

То есть не:


{
"user_meta_v2": {...},
"permissions_legacy": [...]
}


А условное:


{
"name": "Рита",
"role": "admin",
"canEdit": true
}


То есть еще разок:

gateway - вот этот парень про инфраструктуру
bff - вот этот парень про пользовательский сценарий


И это прям важно разделять, потому что:

Gateway не знает про ui ( ему и так норм ).
А вот BFF знает ( молодец какой )


В следующем посте разберём:

RPC ( Remote Procedure Call )

#conference #holyjs #architecture #modularbff


Если вы пришли сюда после доклада про модульный BFF - приветище!!

А еще респектище что досидели до конца 😂🤣🤣

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

Вообще по моим личным наблюдениям у любой конференции есть особенность ( я специально не употребляю термин "проблема"):

1 - ты либо сильно упрощаешь тему,
2 - ты можешь ( и кстати прям вот на изян ) закапывать людей в детали или случайно увести в сторону темы.

Потому что такие штуки как, упаси господи, модульный bff, RPC, транспортныке слои - ну невозможно это все нормально раскрыть за 40–50 минут.

Поэтому обещанные материалы будут zdez'.

А именно:

📄 PDF доклада

🧩 Серия постов про:

• чем Gateway отличается от BFF (а эт прям очень часто путают)
• RPC - шо такое простыми словами
• Генерализованные (общие/универсальные) сообщения в разработке - а зачем нам вообще генерализовать вызовы?
• async vs sync коммуникации и почему мы не делаем REST на всё подряд
• шина событий ( он же event bus он же автобус событий 😅) - где реально помогает а где прям таки начинает ломать нас как систему
• Ну и конечно цена всей этой красоты и когда оно НЕ нужно

И конечно же я буду опираться не только на личный опыт, но и на реальные инженерные статьи, практики и исследования. Ну чтобы это все не было в формате «ну мне кажется красиво вот так» 😅

Начнём с самого важного вопроса:

чем Gateway отличается от BFF

👇 Следующий пост

#conference #holyjs #architecture #modularbff

Показано 20 последних публикаций.