Получи случайную криптовалюту за регистрацию!

Карьера аналитика

Логотип телеграм канала @analytics_career — Карьера аналитика К
Логотип телеграм канала @analytics_career — Карьера аналитика
Адрес канала: @analytics_career
Категории: Карьера
Язык: Русский
Количество подписчиков: 825
Описание канала:

Всем привет! Меня зовут Серёжа, я - Системный аналитик с опытом 7 лет.
Тут я рассказываю о своем опыте, делюсь рекомендациями и обучаю профессии Системный аналитик с нуля.
По консультациям и обучению @schadulin
https://analytics-career.clients.site/

Рейтинги и Отзывы

2.50

2 отзыва

Оценить канал analytics_career и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

1

2 звезд

1

1 звезд

0


Последние сообщения

2023-02-13 18:40:03 А интереcно было бы послушать мою историю развития в профессии? Прям со всеми фишками и шишками.

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

Но за эти 7 лет было столько всего. И даже момент, когда я думал, что это "не моё" и хотел все бросить.

p.s соберем 30 и погнали))
139 views15:40
Открыть/Комментировать
2023-02-13 18:22:52
Картинка номер раз и номер два:
147 views15:22
Открыть/Комментировать
2023-02-13 18:22:28 P.S.: Фух, серия постов про асинхрон закончилась. Теперь правда всё, потому я больше не знаю способов реализации асинхрона) Если у вас есть какие-то еще версии или сакральные знания на этот счет - также пишите, с удовольствием почитаю.

P.P.S: Понимаю, что было сложно - простите. Постараюсь чем-нибудь более лайтовым разбавить)
137 views15:22
Открыть/Комментировать
2023-02-13 18:22:28 Привет!

Ещё один пост про асинхронную интеграцию продолжая серию.

Это уже непосредственно из моей практики, потому что я часто люблю на собеседованиях задавать вопрос: "Как ты думаешь, можно ли реализовать асинхронную интеграцию через REST?".

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

Вопрос на самом деле чисто на хорошее понимание REST или умение размышлять, зависит от того, знаешь ли ты ответ заранее и сталкивался ли с таким или нет (невзначай ввернул посыл про то, что если ты не знаешь какой-то ответ на вопрос - не нужно сразу сдаваться, а нужно подумать, потому что именно размышлений на этой позиции от вас и ждут).

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

Стандартное взаимодействие между системами выглядит как цепочка синхронных запросов, выполняющихся подряд между микросервисами. Условно: front -> rest api -> rest api -> rest api и потом это все также синхронно возвращается по цепочке обратно. Это достаточно долго по меркам системы, так как все это время пользователь видит loader (бегающий кружочек загрузки) и не может продолжать взаимодействовать с системой (см. картинку один). Это не очень круто.

Тут сразу несколько вариантов:
1. Можно отправить из одной системы в другую REST-запрос, который инициирует процесс, но вызывающая сторона не будет ждать пока завершится вся цепочка целиком, а получит ответ только от одного сервиса о том, что процесс запущен.
Для примера, это может быть процесс формирования документов. То есть ты на фронте нажал кнопку "Сформировать документы", фронт вызвал какой-нибудь микросервис-адаптер, тот вернул успешный ответ с HTTP-кодом = 200, по сути подтвердив, что процесс запущен (параллельно пошел вызывать микросервисы по цепочке дальше), а фронт уже отрисовал пользователю сообщение с текстом "Процесс формирования документов успешно запущен" и отпустил пользователя с миром работать дальше (см. картинку два).

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

2. Callback URL - такая интересная шутка, появившаяся в версии 3.0 OpenAPI specification. Это работает так, что посылая REST-запрос в какой-нибудь сервис, ты можешь указать в специальном параметре callbackURL эндпоинт, на который сервис должен прислать результат после того, как он закончит свою работу.
Т.е. если послать запрос POST /api.example.com/foo?callbackURL=http://my.server.com/bar, то после того как метод /foo закончит свою работу, он пошлет запрос с результатом выполнение на адрес http://my.server.com/bar.

Если еще проще, то это можно воспринимать как письмо. Вам пришло письмо с просьбой заполнить какую-нибудь форму а затем вернуть ее по предварительно указанному адресу, который находится в доставленном вам конверте. Заполнили форму - отприли обратное письмо по этому адресу.
Это особенно полезно, когда обработка некоторых данных может занимать длительное время. На предыдущем примере - если формирование документов занимает 5 минут, то мы не можем заставить пользователя ждать это время. Поэтому мы просто посылаем запрос такого рода, нам приходит подтверждение о том, что наш запрос получен и взят в работу. Через какое-то время, после завершения обработки этого запроса - нам вернется ответ со всей нужной информацией (в нашем случае со сформированными документами).

Есть еще третий вариант, там никаких хитростей нет. Попробуйте написать ваши предположения в комментариях.
134 views15:22
Открыть/Комментировать
2023-02-09 18:20:12
223 views15:20
Открыть/Комментировать
2023-02-09 18:20:10 Привет!

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

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

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

Чтобы избежать проблем с потерей информации - нам необходимо создать outbox таблицу, в которую будет дублироваться бизнес-объект при его создании. Т.е. в тот момент, когда по процессу создается объект, он кладется не только в свою таблицу, но еще и в таблицу outbox одной транзакцией, что значит - либо объект будет записан в обе таблицы одновременно, либо не будет записан вообще (это видно на схеме).

Хорошо, мы создали дублирующие записи в непонятной табличке outbox - и что дальше? А дальше, раз в n секунд у нас отрабатывает специальный сервис (так называемый процессор), который обрабатывает все сообщения из таблички outbox и кладет их в очередь сообщений. Если он получает от очереди успешный ответ, что сообщение доставлено и получено брокером - запись удаляется из таблицы outbox. Само собой, если по каким-то причинам у него не получилось положить сообщение в очередь (она не подтвердила получение сообщения) - эти сообщения не удаляются и через n секунд будет повторная попытка их обработать.

Плюсы:
- Решает проблему связи между сервисами. Теперь не нужно беспокоиться, что брокер или сервис доставки будут недоступны. Все сообщения сохраняются в базу и будут обработаны, когда недоступные сервисы оживут.
- Сообщения отправляются, только когда транзакция базы данных подтверждается. То есть у нас не получится так, что если нам не удалось сохранить объект в базу, и при этом получилось сохранить сообщение в Outbox, то выполнится не нужная команда. Здесь гарантируется атомарность.

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

Ссылка на официальную статью - https://microservices.io/patterns/data/transactional-outbox.html (кстати, рекомендую этот ресурс всем, кто так или иначе участвует в проектировании микрсоервисной архитектуры).
201 views15:20
Открыть/Комментировать
2023-02-06 22:14:12 Привет!

В прошлый раз мы говорили про очереди сообщений и в основном про kafka. Сегодня предлагаю продолжить тему и подытожить ее.

Вообще, если говорить про очереди сообщений, то по факту есть всего 2 модели по которым они работают:

pull-модель - косьюмеры сами отправляют запрос раз в какое-то время (настраиваемый параметр) на сервер (очередь сообщений) для получения новой порции сообщений. При таком подходе, как мы уже разбирались - клиенты могут эффективно контроллировать нагрузку самостоятельно. Кроме того в рамках данной модели есть возможность группировать сообщения, тем самым повышая пропускную способность.
Из недостатков можно отметить возможную разбалансирвку нагрузки между разными консьюмерами и более высокую задержку обработки данных (самый простой пример - продьюсер положил данные в очередь сразу после того, как консьюмер сделал pull-запрос. Тем самым данные будут лежать в очереди все время до следующего запроса со стороны консьюмера. Как правило это доли секунды, но тем не менее).
Именно по этой модели работает kafka, как вы уже догадались, если еще не забыли прошлый пост)

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

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

Теперь немного поговорим про остальные отличия RabbitMQ от Kafka:

Производительность:
- RabbitMQ: От 4000 до 10 000 сообщений в секунду
- Kafka: 1 миллион сообщений в секунду

Хранение сообщений:
- RabbitMQ: На основе подтверждения
- Kafka: На основе политик (например, 30 дней)

Режим работы консьюмера:
- RabbitMQ: Умный брокер/тупой консьюмер
- Kafka: Тупой брокер/умный консьюмер

Размер полезных данных:
- RabbitMQ: Без ограничений
- Kafka: По умолчанию – ограничение в 1 МБ

Примеры применения:
- RabbitMQ: "Простые" случаи
- Kafka: Массовая обработка данных/высокопроизводительная передача данных

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

Поэтому в очередной раз можно сделать вывод о том, что у любого инструмента есть свои области применения и не стоит слепо использовать лишь самые "хайповые". Например, совсем не всегда микросервисы лучше монолита, при всей моей любви к ним)
244 viewsedited  19:14
Открыть/Комментировать
2023-01-30 10:08:10 P.P.S. Если у кого-то появились вопросы или хочется, чтобы я осветил какую-то тему - welcome в комментарии)
284 views07:08
Открыть/Комментировать
2023-01-30 10:06:34 P.S. Это теория, которая необходима для понимания работы механизма и возможностей его применения для интеграции. На практике системному аналитику не требуется настраивать очереди и очень плотно соприкасаться с их настройкой - это всё вотчина разработчиков. В 95% случаев достаточно описать атрибутивный состав самого сообщения, которое нужно передать Продьюсеру и указать какие системы или сервисы должны читать его.
277 views07:06
Открыть/Комментировать
2023-01-30 10:06:34 Всем привет!

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

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

В тех местах, где нам нужно наладить интеграцию, достичь максимальной ее скорости, и, при этом, есть возможность пренебречь каким-то процентом потерянных пакетов данных, в случае обрыва соединения - применяют синхронную интеграцию (как минимум это front-to-back интеграция, потому что мы всегда может попросить пользователя тыкнуть на кнопку еще раз).
В остальных случаях, когда мы можем немного пренебречь скоростью (хотя асинхронный обмен не настолько медленнее, как кажется) и при этом получить функцию гарантированной доставки сообщений - применяют асинхронную интеграцию.

В основном, для асихнрона используется либо open-source решение Apache Kafka, либо RabbitMQ. Есть ряд других решений, но эти наиболее популярные на моей практике и именно они чаще всего используются в ФинТехе. И среди этих двух решений, чаще я видел Kafka, особенно в банках - и это не просто так. Давайте с ней и разберемся.

Kafka состоит из трех компонентов:
1) Сервер (или по-другому брокер сообщений);
2) Продьюсер - источник данных, та система, которая посылает сообщения в брокер;
3) Консьюмер - потребитель данных, та система, которая получает данные из брокера.

А теперь приведу ту особенность Kafka, из-за которой ее так любят использовать банки - сообщения не удаляются брокерами после их обработки консьюмерами, данные могут хранится днями, неделями (хоть годами), в зависимости от настроек.
И именно благодаря этому одно и тоже сообщение может быть обработано сколько угодно раз разными косьюмерами. Также это позволяет восстановить все данные, находящиеся у брокера, в случае их утраты консьюмером уже после получения, даже спустя длительное время.

Как происходит сам процесс передачи сообщения:
Создается именованный топик, который по сути является точкой интеграции между Продьюсером и Консьюмером;
Продьюсер отправляет сообщение на сервер (в тот самый топик);
Консьюмер пытается забрать сообщение и его уникальный идентификатор, присовенный сервером;
Сервер помечает сообщение как in-flight и в этом состоянии оно всё еще хранится на сервере;
Консьюмер обрабатывает сообщение, исходя из своей бизнес-логики и отправляет ответ запрос обратно на сервер, используя его уникальный идентификатор и сообщает брокеру либо об успешной обработке, либо об ошибке;
В случае успеха сообщение помечается как прочитанное и больше не доступно для получения консьюмерами при стандартных запросах (только по требованию, если необходимо восстановить данные, или использовать его как-то еще). В случае ошибки сообщение будет получено консьюмером при следующем запросе.

Таким образом обспечивается гарантированная доставка сообщений. Даже если не получится забрать сообщение 10 раз, с какого-то раза оно всё равно доставится (если, конечно, нет проблем в самом сообщении и его структуре, а не с сетью. Тогда это проблема на стороне Продьюсера).

Также Kafka имеет следующие преимущества:
Механизм, которые не позволяет читать одни и те же сообщения консьюмеру, даже в случае перезапуска его или самого брокера.
Если есть необходимость продьюсеру доставить одно сообщение сразу нескольким консьюмерам, то в отличие от других очередей - нет необходимости на каждого консьюмера постить по сообщению. Продьюсер посылает в брокер всего одно сообщение, из которого несколько консьюмеров уже сами его забирают.

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