C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
😇 Фейкай как Bogus
Не могу не написать хвалебную штуку про Bogus Faker. Мне иногда нужно для тестов заполнять фейковыми данными поля. И, если честно, то бесит постоянно что-то придумывать. Все эти мейлы-шмейлы, айдишники-хуишники.
 
📆 Третьего дня увидал библиотеку Bogus. И понял, что это довольно прикольная пижня! Короче, она умеет за вас генерить РЕАЛИСТИЧНЫЕ фейковые данные в тестовых объектах.

🧑‍🍳Как готовить? Есть у вас какой-нибудь классический User. Ну что там у него может быть? Наверняка мыло-хуило (простите), айдишник, телефон, дата рождения и еще подобное дерьмецо. Как будет выглядеть код с Bogus для генерации фейковых данных для такого юзера. Да писос как просто! Вот, полюбуйтесь:

var user = userFaker.Generate();

Ну блин, ладно, там не все ТАК просто. Надо перед этим маленько поднастроить:
 
var userFaker = new Faker<User>()
.RuleFor(user=>user.Email, faker=>faker.Person.Email)
.RuleFor(user=>user.FullName, faker=>faker.Person.FullName)
.RuleFor(user=>user.DateOfBirth, faker=>faker.Person.DateOfBirth)

🍆И посмотрите, что эта чудная штука сгенерит в итоге (пояснительный дикпик постом выше 👆)
 
При этом его так можно настроить, чтобы он генерил одинаковые результаты от теста к тесту, чтобы вам не свихнуться во время дебага. И это тоже очень полезно! 🥗

⚠️ У него все же есть минусы. Вы можете сломать тесты просто обновив неудачно библиотеку. Это ж опенсорс. С этой точки хрения если хотите надежности входных данных в тестах, то обступайте стороной Bogus.

Комментарий внутреннего голоса автора: бля, да все что угодно можно сломать, обновив библиотеку.

🅰️Итого: если хотите генерить реалистичные данные для тестов, но не хотите писать эти данные руками, то Bogus поможет. Не могу порекомендовать такой подход для интеграционных тестов, там желательно чтобы ХОТЯ БЫ входные данные были железно прибиты к константам. А вот в юнитовых тестах – обфейкайтесь этим богусом.
 
🏃‍♂️Короче, быстро бегите и ставьте звезду🤩 библиотеке. Там их много (звезд), но кажется, что либа заслуживает большего!

UPD: Не, все же в комментах и на небольшой практике выяснилось, что не заслуживает. Сложно потом понимать из кода, откуда вообще взялись все эти Timothy и прочие реалистичные штуки.

#testing #unittests #libraries
Please open Telegram to view this post
VIEW IN TELEGRAM
👎2🤩1
🤬 Не ругайте чужой код.
Сегодня в очередной раз задумался над тем, как губительно сказывается на проектах деструктивная критика чужого кода. Решил себе записать по пунктам все негативные моменты:
1️⃣ Ругая чужой код ты снимаешь с себя ответственность за его улучшение. Ты просто признаешь факт и то что ты ничего с этим сделать не можешь, вместо того чтобы поискать хоть какое-то решение
2️⃣ Ты снижаешь свою планку. Если все говнокодят, и ничего с этим не сделать, значит и тебе можно.
3️⃣ Демотивируешь окружающих. Если твой коллега слышит такую критику, то неизбежно он переложит ее на себя и в лучшем случае подумает: "Хм, надеюсь я не такой." Но в худшем случае, он подумает: "Да я такой плохой 😔 Ну и ХУЙ с ним, пойду тогда тоже писать ГОВНО!".
4️⃣Подрываешь доверие в коллективе. Раз ты сказал про кого-то плохо, то что мешает кому-то говорить так же плохо про тебя?"

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

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

🥇 Думаю, что если бы Абрахам Маслоу собирал пирамиду софтскиллов для разработчиков, то скилл "не ругай чужой код, сцуко" поставил бы на первое место.
 
P.S.: Ну и вообще, мир не обязан быть красивым – он такой, какой есть😂
#softskills
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
😂 Компильдот.
Пятница йоптыть! А значит подошло время для компильдота! Где? Так вот же он!

Попадают в чистилище: продакт, тестировщик и программист. Бог им и говорит:
— Кто скажет мне число, которого я не знаю, попадет в Рай.
Продакт назвал — триллион, Бог сказал:
— Знаю и отправил его в Ад.
Программист назвал какую-то огромную степень двойки, Бог сказал:
— И это знаю — и тоже отправил его в Ад.
Тестировщик подумал и говорит:
— Дохуя!
Бог удивился:
— Я не знаю такого числа! А сколько это?
Тестировщик отвечает:
— А ты спроси у стрелочника на железной дороге.
Бог свое обещание выполнил — послал тестировщика в Рай, а сам обернулся человеком и спустился на Землю. Нашел стрелочника подходит и спрашивает:
— Слушай, мужик, а сколько это — ДОХУЯ?
Стрелочник подумал и говорит:
— Видишь рельсы?
Бог:
— Вижу!
Стрелочник:
— Видишь шпалы?
Бог:
— Вижу!
Стрелочник:
— Вот иди и считай шпалы. Как будет НУ ИХ НА ХУЙ! Так это только половина!


Понравился компльдот? – Шарахни лайк!
Не понравился? – Так втрепи уже говняшку скрэппи, не будь жмотом!
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚5💩1
🦮 Задача 6: Таймауты и увеличение.
📏 Затянул с последним постом про ретраи. Такие времена, сами понимаете – нужно затягивать не только пояса (фьить - ха!).

Сегодня такая задачка. В репозитории bounded-disturbances это челлендж под номером 8.
В нормальном случае запрос проходит за 30мс. В 10% случаев у вас канал выдает задержку в 2 секунды. При этом 25% запросов выполняются минимум 1 секунду. (к примеру 75% запросов к базе данных несложные и выполняются быстро, а 25% очень сложные и это не исправить)

В этой задаче, вы можете задавать таймаут для каждого ретрая отдельно, то есть указывать его в виде ряда:
 
var timeouts = new [] { 666, 666 };
 
Задача подобрать ряд таймаутов с нужным количеством ретраев и с нужными значениями элементов ряда так, чтобы 99% запросов прошли успешно и 95-ый перцентиль запросов был ниже 2 секунд. И еще одно условие – 70% процентов запросов должно проходить не больше чем за 200 мс.

То есть мы хотим сделать с помощью ретраев так, чтобы те запросы, которые могут пройти быстро, прошли быстро. Но при этом та часть запросов, которая идет медленно, доходила до конца.
 
Не совсем понятный ответ тут:
А тут не все так однозначно! Фактически у нас есть два вида запросов – быстрые запросы, которые периодически тупят, и медленные запросы, которые периодически еще и тупят (Вот уж дейсвтительно – Тупой и еще тупее! Пха-ха! 😅). Под каждый из запросов нам нужны свои таймауты.
 
Под быстрые запросы нам подойдет таймаут в 50 мс, так как, если быстрый запрос не успел выполниться в это время, значит он уже не долетит.
 
Под медленные запросы нам нужен таймаут в 1100 мс, так как мы помним, что медленные запросы меньше чем за 1000 мс не выполняются.
 
Если мы составим такой ряд
var timeouts = new [] { 50, 1100 };

То для быстрых запросов у нас будет две попытки. А вот для медленных запросов будет только одна. При этом 100% быстрых запросов выполнится, а вот у медленных запросов 10% просто не дойдет до успеха (по вот этой формуле посчитал 1 - 0.1^1 = 1-q^n = 0.90), что даст нам общую успешность выполнения примерно 97.5%

🅰️ Но у нас цель по успешности в 99%. Именно поэтому мы должны воткнуть еще один таймаут для тупящих запросов, получив в итоге такой ряд:

var timeouts = new [] { 50, 1100, 1100 };

И это как раз то что нужно!

P.S. Ффух, на этом все. Нихерашеньки не шорт пост получится, товарищи. Да и объяснения тут, конечно, такие, что их нужно еще отдельно разбирать. Что я и сделаю в будущей статье на Хабр. Там можно будет и формулы прописать нормально, со всеми сигмами и дать кому-нибудь на ревью все это.

🔚 Засим про ретраи почти все. Спасибо, что читали! дальше будет еще одна мысль про них и на этом считаю свой опус-магнум завершенным.
#ресайленс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🎞 Что сегодня посмотреть?
У нас в Додо начали внедрять Кафку (с мафлом 🥣 Привет, Степа!). Посему возникла производственная необходимость проникнуть в глубь сущности данной технологии. По своему старому обычаю, я стараюсь искать по теме видосы. И вот, недавно нашел один такой Григорий Кошелев — Kafka: от теории к практике.

Почему именно этот видос?
1️⃣ Здесь объясняются основы кафки с нуля.

2️⃣ Вдобавок к этому у Григория простые, но охуенные анимации в презентации, которые отлично дополняют его рассказ визуально.

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

3️⃣ Теоретические данные в должной мере дополняются практическим опытом, который помогает в понимании.

Я еще чуть позже думаю сделать серию микропостов на основе этого видоса про основы Кафки, чтобы закрепить знания. Но почему бы сейчас не поделиться!
#охуенныедоклады #kafka
2👍2
А зачем нам вообще ретраи?
Не так давно я попытался провести воркшоп по ретраям на основе репозитория и своих теоретических изысканий. Получилось говнястенько, но получилось! 💩
 
🆙 В конце этого воркшопа мне один очень крутой коллега (а мы других не держим) задал вполне легитимный вопрос: "Зачем нам вообще все это считать? Вот у меня задача есть, я везде могу сделать 5 ретраев и экспоненциальное увеличение таймаутов. И этого вполне хватает. Если за 5 раз сервис не ответил, значит, что он конкретно недоступен и смысла ретраить больше нет."

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

🅰️ Все дело в облаке.
Если помните, мы все с вами хостимся в облаке. Почти все. А в облаке, база – не база, а абстрактный набор железок, которые где-то перезапускаются, выгорают и что-то делают помимо основной работы.
 
В облаке у вас нет гарантии, что два соседних запроса выполнятся на одной и той же машине. И вот именно тут вам помогут ретраи и то, что мы с вами разбирали. Вся эта тема была про то, как из ненадежных элементов построить что-то чуть более надежное.

🙅 То есть, вы пульнули запрос, а он по раунд-робину попал на какой-то залупный сервер у параши. А вы вместо того, чтобы ждать, пока он очнется, берете и пуляете новый запрос, который попадает на королевский сервер. По итогу, именно это и улучшает показатели вашего конечного сервиса. (Да, вы так же делаете, когда ждете своей очереди в Overwatch 2! Вы тоже ретраите, когда перезаходите в лобби!)

Для улучшения показателей мы и делаем ретраи и именно это мне хотелось показать в цикле. А еще убрать у вас (и у себя, конечно) инфантильное желание въебать 5 ретраев по экспоненте и оставить осознанный мотив втрепать всего два линейных, но по делу. Немного пошевелить мозгами. 🧠

P.S. В общем, всем спасибо, кто дочитал и полайкал эту душнятину! 🙏🙏🙏 Буду и дальше работать над такими штуками и бороться за вторые места!
#ресайленс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🤪Компильдот.
Пятница етить её налево! Самое время прочитать все посты, что вышли за эту неделю. А вот и компильдотик для привлечения внимания. Но предупрежу, он жесткий. Возможно противный. Категория В не ниже. Оправдывает плашку 🔞 в названии канала. Читать, ну очень осторожно.

Ебутся как-то в жопу два программиста. Час ебутся, второй. Вдруг один спрашивает:
– Билли, да когда ты уже закончишь?
– Думаю, что через час.
Ебля продолжается час, потом еще час, еще час. Один снова не выдерживает:
– Билли, до коле, блядь?!
Второй останавливается и говорит:
– Да я думал, что за час управлюсь. Но, знаешь, Боб, тут
сраное легаси!

После такого компильдота даже как-то неловко, но поставь говняшку Скрэппи, если не понравилось! Ну и лайк, если понравилось!
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💩2🌭1
✍️ Service Mesh и политика ресайленса.
Не отпускают меня ретраи. Извините.

🅰️Но, короче, я задумался, что вообще Service Mesh и ретраи это топ сборка!

У вас есть инфраструктура, у которой известны SLA (базы, шины и прочее). Вы можете один раз посчитать по ним, сколько ретраев нужно при обращении к ним и на всю архитектуру раскатить общие настройки через Service Mesh. И у вас все сервисы разом оптимальнее работают с базами, шинами и прочим!

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

💡Это просто как идея. Не претендую на охуительность (хотя ладно претендую).
#ресайленс #servicemesh
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🍟 McDonald’s Journey to Event-Driven Architecture.
Было как. Ложусь я уже спать, как вдруг ютуб подсовывает мне видос с одного из лучших каналов по разработке CodeOpinion. И в названии, ну прям кликбейтное McDonald’s Journey to Event-Driven Architecture.

"Ну нихрена себе" – подумал я и, конечно, кликнул! Вы там сами посмотрите это видео и решите, что интересно вам. А вот что я для себя узнал:

1️⃣ Schema Registry. К своему стыду, никогда не слышал про такое. У макдака – это AWS Elastic Container Service. Ее используют для валидации сообщений, приходящих от продьюсера. При отправке сообщения продюсер идет в Schema Registry, спрашивает, норм ли все с сообщением, не пропущено ли каких строк, могу ли я его десеарилизовать итп.

Если все ок, то сообщение отправляется в брокера (у макдака это AWS Managed Streaming for Kafka Service). Если же с сообщеним непорядок, то оно попадает в чистилище Dead Letter Queue (DLQ)

Ну и консьюмер тоже все это проверяет, как я понимаю.

2️⃣ У МакДональдса есть техноблог! Кто бы мог подумать! Вы подумали? Я вот не подумал. Короче, надо читать. Сто процентов.

Все остальное – Standby Event Store, которая доступна на случай, если брокер откажет. Event Gateway, который позволяет сторонним партнерам через API генерировать события для интеграции. В общем, все это в той или иной степени было известно. Но все равно прикольно было почитать, что у Макдака все также как и у нас. 

P.S.: А еще ведущий на канале CodeOpinion похож на Роршарха из Хранителей и это по-своему доставляет. Будто он в конце скажет "Это не меня заперли здесь! Это вас заперли со мной!"
#codeopinion #mcdonalds #eventdriven
❤‍🔥1
😄 Компильдот!
Пятница, туда её в душу! Значит время компильдота у нас. Прошлый компильдот про сношение в жопу, зашел, но лишь частично. Поэтому сегодня будет лайтовенькая смешнявка!

Программист обращается к компьютерному мастеру:
- Мне нужна ваша помощь.
- Ваша профессия?
- Я программист.
- Так почему же вы сами все не сделаете?
- Я беру слишком дорого...

Понравился компильдот? Ну так давай, не робей – поставь лайк! Ну а ежели анек не зашел, ты тоже в сторонке-то не стой – говняшка Скрэппи к твоим услугам! Всё строго анонимно!
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1🍌1
🍆Kafka #1: Пояснительный дикпик (UPD: поправил консьюмеров на консьюмер-группы)
#kafka
🌚1
🙏Kafka #1: Верхнеуровненвый осмотр и сравнение с RMQ
Как я раньше и говорил, по производственной необходимости нужно изучать Кафку (с мафлом, да-да!). Пролью свет на нее в цикле постов. Цикл будет на основе видео, которое я показывал в этом посте. (Поэтому, в случае претензий, мопед не мой – я только объяву разместил.)
 
🍆 Сегодня просто посмотрим на пояснительный дикпик 👆 и разберемся, из каких основных компонентов состоит кафкианский мессаджинг.
 
Cluster – ну тут все просто – это набор кафок. То есть, если вы хотите масштабироваться горизонтально, то кластер – это то, что вы будете расширять добавляя туда побольше кафок.
Broker – это собственно инстанс кафки, который занимается полезной работой. Их может быть много, и они в себе содержат топики.
Topic – это собственно то, что хранит в себе пересылаемые данные. То есть, когда сообщение попадет к брокеру, то он положит его в нужный топик.
Producer – это тот кто пишет в топики.
Consumer Group – это группа консьюмеров которые читают из топика. Тут есть нюанс, что каждый консьюмер в группе будет читать из своей партиции, но об этом позже. И это, кстати, тоже охренеть какое отличие! (Спасибо Юре Пастушенко 🥰 за исправление. Будьте как Юра – пишите мне, если видите, что я спорол хуйню!)
 
🐇 Так как я много работал с RabbitMQ, не могу не отметить, что верхнеуровнево все выглядит один к одному! Но есть значительные различия в том, как кафка работает с топиками. Это довольно сильно отличается от кролика и вот чем:
 
1️⃣В кафкианском мире консьюмер поллит брокера, чтобы забрать данные из топика. В отличие от кролика, где брокер пушит сообщения сам. Конечно в кролике тоже можно было перевести консьюмера в режим поллинга, но это не православный подход считается.
2️⃣Сама работа топиков сильно отличается от очередей (тут важная эмоциональная ремарка: да просто охуеть как сильно отличается. Это настолько разные штуки, что я бы их даже не сравнивал!). Так как в очереди сообщение живет до тех пор, пока его разок не прочтут, после чего удаляется (я намеренно опустил детали если что). В Кафке append-only подход. Поэтому хранение там организовано иначе. Там тоже сообщения удаляются, но по истечении времени, да и то если вы сами хотите. Об этом подробнее в следующем посте.
 
Такие вот верхнеуровненвые кафкианские пироги. Stay Tuned, как говорится.
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💪 Как выбрать Struct или Class?
Всегда на интервью спрашиваю у ребят и девчат, приходилось ли им выбирать между struct или class на практике. И в каком случае стоит применять одно, а в каком другое. (Спрашиваю, потому что сам не ебу, если честно, что там и как.Ставь лайкосик 👍, если тоже на интервью пытаешься узнать что-то новое!)
 
Это тот самый случай, когда ты теорию знаешь, но на практике вообще не ясно, как эту теорию применить. Вот сегодня, кажется, что я сформулировал довольно крепкий кейс, в котором нужно как минимум задуматься, отдать предпочтение структуре или классу.
 
Так вот, представим себе вот такой объект. Ему нужно быть структурой или классом?

public ???? TimeInterval
{
public TimeSpan From { get; set; }
public TimeSpan To { get; set; }
}

📖 Я считаю, что эта штука может стать структурой и для этого есть вполне практичный аргумент. Безо всяких там (бито-байтоёбств) оптимизаций по памяти и прочей лабуды. Рассмотрим такой тест (если лень читать, то я там сравниваю два одинаковых по наполнению TimeInterval):
 
[Test]
public void StructRef()
{
var from = new TimeSpan();
var to = new TimeSpan().Add(30.Minutes());
 
var interval1 = new TimeInterval()
{
From=from,
To=to
};
 
var interval2 = new TimeInterval()
{
From=from,
To=to
};
 
Assert.True(interval1.Equals(interval2));
}

 
Если мы сделали TimeInterval структурой, то он пройдет. Что и не удивительно, так как метод Equals проверит наши данные по значению.

Но если мы сделаем TimeInterval классом, то этот тест так просто уже не прокатит. Придется учинить оверрайдинг метода Equals для этого класса, а где оверрайдинг Equals, там и оверрайдинг GetHashCode.
 
🅰️ Теперь я приведу практический вывод, который вы можете использовать в повседневной разработке: Если вам в каком-то классе понадобилось переопределять Equals, то прежде чем это делать, задумайтесь, а не стоит ли вашему классу стать структурой?

Ну и еще нужно воспользоваться памяткой от Microsoft разумеется.

P.S.: Конечно тут можно использовать record struct а не просто struct. Надеюсь это очевидно)
#struct #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2
😂 Компильдот.
Опятьница (опять пятница)! Ну ежкин дрын. Сегодня будет чуть больше жести, но без сношений сами знаете куда. Итак, встречаем:

Летят как-то в самолете тестировщик, проджект-менеджер и программист.
Самолет начинает падать, пилоты выпадают, программист садится за штурвал, а тестировщик и проджект становятся рядом.
Вдруг самолет резко шатнуло, и проджект начинает выпадать. Тестировщик хватает его за детородный орган и держит. Но в итоге хер отрывается и остается в руках у тестировщика. Тот подходит к программисту и говорит:
– Слушай, программист, тут наш проджект выпал.
– Выпал? Да и хуй с ним!
– Да вот хуй-то не с ним, хуй с нами.

Понравился компильдот? – Ну и куда ты пошёл? А кто лайк будет ставить? Пушкин?
Не понравился? – И что, вот так и оставишь этот компильдо безнаказанным? Вырази свое мнение там где тебя услышат – здесь! А говняшка Скрэппи всегда поможет в этом.
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🍌1
🍆Kafka #2: Пояснительный дикпик
#kafka
🔥1
🙏Kafka #2: Топики
Сегодня поговорим про топики. Когда я читал про них, у меня все больше и больше мыслей возникало, что они похожи на таблицы в базе данных, только с более строгими правилами записи. Вот ключевые фичи топика:
 
✴️ Топик – это контейнер для одного типа событий. (по сути, как таблица в базе данных, пояснительный дикпик выше 👆)
✴️ Данные между топиками могут дублироваться.
✴️ Топик – append-only штука (то есть удалять оттуда нельзя)
✴️ В топике есть offset, по которому мы можем искать нужные события. Это по сути смещение от начала сегмента (про сегменты чуть позже, пока можете считать, что от начала файла с событиями)
✴️ События редактировать нельзя.
✴️ Схема данных событий в топике не проверяется.
✴️ Топик делится на партиции. (про это в следующем посте)
✴️ Из одного и того же топика могут читать разные консьюмеры, но читать они будут информацию из разных партиций.

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

🅰️Практический вывод:
1) Когда в своей практике вы создадите топик в Кафке? Когда ваше приложение будет кидать определенный ивент, к примеру о том, что оплата прошла. Вы создадите топик с назанием PaymentAccepted и будете слать в него события.
2) О чем нужно помнить? Что если послали, то удалить посланное из истории будет невозможно.

P.S.: Если что, у этой информации есть оригинал, он тоже коротенький, так что можете ознакомиться.
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
🍆Kafka #3: Пояснительные дикпики 🍆
#kafka
🌭1
🙏Kafka #3: Как устроен Topic. Партиции.
Ок, топик мы создали, начали писать туда сообщение и вдруг поняли, что тачка не вывозит. Что делать? На помощь приходят партиции. Топик состоит из партиций (пояснительный дикпик 1).

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

Соотвественно сообщения по партициям не копируются, а распределяются!

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

Partition0: 1️⃣1️⃣1️⃣1️⃣1️⃣
Partition1: 2️⃣2️⃣2️⃣2️⃣2️⃣2️⃣

Каждая партиция может храниться на разных брокерах (пояснительный дикпик 2). А значит ваши сообщения могут принимать не одна, а две машины. Вот вам и параллелизация.

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

Из одного топика могут читать сколько угодно консьюмер-групп (пояснительный дикпик). Но вот из одной партиции может читать только один консьюмер! Один, в рамках одной консьюмер-группы, разумеется 🖼, как меня правильно поправили в комментариях. (пояснительный дикпик 3).

Из этого пункта следует два вывода:
❗️Сколько партиций, столько и консьюмеров в группе – ни больше ни меньше. Потому что, если сделаете меньше, то часть событий просто пролетит мимо вас. А если сделаете больше, то лишний консьюмер будет стоять и передергивать в сторонке. (на третьем дикпике мы как раз аидим таког третьего лишнего)

❗️Если продьюсер не указал ключ партиции, то сообщение распределится между партициями по RoundRobin'у. То есть вот так:

Partition0: 1️⃣1️⃣2️⃣1️⃣2️⃣
Partition1: 2️⃣1️⃣2️⃣2️⃣1️⃣2️⃣

И вам потом придется бегать по партициям и собирать все во что-то более менее приемлемое. Так что будьте с этим аккуратнее.

🅰️Практические выводы:
1. Когда делаете новый топик, то сразу думаете про количество партиций. Думаю, что стоит считать предполагаемую нагрузку по сообщениям. Так как добавление партиций – это нетривиальная операция. Короче, это число с бухты-барахты не выбирают. (у нас в компании вот выбрали по лунному календарю и гороскопу, но не с бухты-барахты блять!)
2. Продьюсер должен задавать ключ партиции. Иначе в партициях будет хаос из данных по разным сущностям. (но хер знает, может вы носитель хаоса, и вам так комфортнее 😉)

Дисклеймер: Вся информация здесь, это моя личная вольная интерпретация прочитанной доки по кафке, просмотренных видосов и разговоров с коллежанами. Если у вас есть возражения, то приносите их в комменты. Я очень благодарен всем, кто комментирует, лайкает и вообще проявляет активность в канале и в личке. Это супер-помогает мне не терять мотивацию!
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
👋 Как обсудить задачу, чтобы все поняли её одинаково. Метод "Дано Когда Тогда".
Возьму небольшой перерыв в кафкианской саге и расскажу тут про одну мегаполезную штуку, которая вот уже год служит нашей команде верой и правдой и помогает делать встречи короче и продуктивнее.

С самого начала работы в IT у меня крутился в голове вопрос, как же сформулировать задачу так, чтобы в конце все поняли её одинаково?
 
Заебывало знаете ли, что, бывает, сидишь на встречах, слушаешь по 30 минут, как люди спорят, куда надо подвинуть кнопку, а в итоге выясняют, что они вообще говорят о разных кнопках. И потом еще 30 минут слушаешь, как люди пытаются выяснить, кто из них бОльший долбоеб. (А потом выясняют, что говорили про разных людей, ахах!😂)
 
🅰️ Освоил простую, но эффективную технику и спустя год работы с ней, могу порекомендовать её однозначно. Она простая до того, что стыдно писать про неё пост (но я все же напишу). Называется техника "Дано, Когда, Тогда".
 
Суть простая. Когда кто-то из бизнеса описывает функционал, то проговаривает каждую фичу в формате:
"Дано: Кто-то хочет что-то"
"Когда: Этот кто-то делает действие"
"Тогда: Видит результат в таком-то формате"


К примеру, одна из наших фич с сумрачным названием:
Скопировать поп-ап управления отложек МенСмены в МенОфиса/ День

Что должно быть в результате? Хер знает. Вызываем технику Дано Когда Тогда:
 
Дано: Я как региональный управляющий могу зайти в Менеджер Офиса.
Когда: Я в интерфейсе МО на главной странице в разделе Трекинг — Отложено нажимаю мышкой на отложенные заказы
Тогда: Появляется такой же интерфейс как в Менеджере Смены при нажатии на кнопку Отложенных заказов - 0 в разделе Кухня на вкладке Главная.


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

Такое описание привело к тому, что мы начали рассматривать различные корнер-кейсы и выяснили, что к примеру не все детали интерфейса нужно будет переносить в окончательном решении:

Дано: Я как Менеджер Офиса выбираю пиццерию Сыктывкар-1. Я открываю Отложенные заказы на главной и вижу отложенные заказы из Сыктывкара-1.
Когда: Я смотрю на место, где в Менеджере Смены есть иконка принтера
Тогда: Вижу, что в Менеджере офиса ее там нет.


Конкретно этот критейрий снял головную боль по переносу функционала печати, который намертво вбит в Менеджера Смены.
 
⁉️ Тут же возникнет вопрос. Но, Дмитрий, пардон, есть же User Story Mapping, есть же доски в Miro, макеты, разве этого добра не хвататет?
 
Хватает, но User Story Mapping – формат тяжелый, как хрюкающие подсвинки сатаны. А функционал бывает не визуальным, к примеру в итоге действия должен проигрываться звук, так что фигмы никакой не будет. И еще плюсом этого формата является то, что он позволяет покрыть, как маленькие задачи, так и довольно большие.
 
User Story Mapping все еще отличный инструмент, но подходит он скорее для очень больших задач. Которых у нас не так много.

Как начать использовать Дано, Когда, Тогда? Да супер-изи!
1️⃣ Для пункта Дано, попросите продакта максимально описать пользователя, который будет производить действие. Его роль в системе, данные, которые должны быть заполнены, что он хочет сделать.
2️⃣ Для пункта Когда. Попросите сформулировать, что будет делать пользователь. Откуда он начинает своё действие, куда кликает, чтобы прийти на нужный экран или  перевести систему в нужное состояние.
3️⃣ Для пункта Тогда попросите описать конечный результат. Как поменялось состояние системы? Что увидел пользователь? Почему ему это было полезно?
 
Повторяйте до тех пор, пока не покроете все крайние случаи. Будет сложно, но через несколько PBRов навык отточится, и вы поймете насколько глубоко нужно детализировать каждый пункт и сколько таких пунктов нужно.
 
Еще можно позвать инженера по тестированию, чтобы он помог вам не сдаться на пути в бездну и помочь МАКСИМАЛЬНО детализировать крайние случаи.
#процессы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤩1🙏1