Да. Пока сообщение не удалено по retention, consumer может вернуться к старому offset и обработать его снова.
исправили код → сдвинули offset назад → переиграли сообщения
Например, для consumer group можно сбросить offset через kafka-consumer-groups.
Kafka в этом плане отличается от классической очереди: прочитанное сообщение не исчезает сразу — его можно переиграть.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥2
Если идёте на Middle Go, одного синтаксиса SQL мало. На собеседовании легко уйти в индексы, транзакции и конкурентный доступ.
Сохраняйте чек-лист:
B-tree — когда используется и какие запросы ускоряет?
EXPLAIN ANALYZE — что показывает и чем отличается от EXPLAIN?
Почему PostgreSQL выбирает Seq Scan, хотя есть индекс?
Составной индекс — что это и зачем нужен?
Левый префикс — почему порядок колонок в индексе важен?
Как выбрать порядок колонок в составном индексе?
MVCC — как PostgreSQL позволяет транзакциям работать параллельно?
Уровни изоляции — какие бывают и чем отличаются?
Deadlock — как возникает и как его предотвращать?
SELECT ... FOR UPDATE — когда нужен?
N+1 — откуда появляется и как его найти?
ACID — что означает каждая буква на практике?
Connection pool — зачем он нужен и какие проблемы возникают при неправильных настройках?
Replication lag — почему реплика отстаёт и чем это опасно?
Partitioning vs Sharding — в чём разница и когда применять каждый подход?
С вас 🔥, если полезно!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24❤5⚡1
Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?
Задавайте всё, что давно хотелось спросить
Please open Telegram to view this post
VIEW IN TELEGRAM
👏2👍1🔥1
Тестирование функций, которые читают данные с консоли через fmt.Scan и stdin в Go, часто становится настоящей задачей. В таких случаях нельзя просто передать параметры функции — код напрямую взаимодействует со стандартным вводом.
Пример проблемы:
func ReadName() string {
var name string
fmt.Print("Enter your name: ")
fmt.Scan(&name)
return name
}
Для этой функции сложно написать unit-тест, потому что она читает из os.Stdin, а в тестах обычно хочется подставлять свои данные.
Решение: подменяем os.Stdin
В тестах можно временно переназначить os.Stdin на чтение из заранее подготовленного буфера:
func TestReadName(t *testing.T) {
input := "Alice\n"
r, w, _ := os.Pipe()
w.WriteString(input)
w.Close()
oldStdin := os.Stdin
defer func() { os.Stdin = oldStdin }()
os.Stdin = r
got := ReadName()
want := "Alice"
if got != want {
t.Errorf("got %q, want %q", got, want)
}
}
Функция, вызываемая в тесте, читает данные не из консоли пользователя, а из потока, в который записывают необходимые строки.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🌚2😢1🤩1🙏1
С днем программиста, коллеги!
Желаем, чтобы код компилировался с первого раза, баги находились до релиза, а таски «на пять минут» действительно занимали пять минут.
И конечно, пусть в жизни будет больше приятных сюрпризов — один из них мы уже подготовили. Скорее переходите по ссылке, трясите коробку и забирайте свой подарок ко Дню программиста: https://tprg.ru/I45e
Желаем, чтобы код компилировался с первого раза, баги находились до релиза, а таски «на пять минут» действительно занимали пять минут.
И конечно, пусть в жизни будет больше приятных сюрпризов — один из них мы уже подготовили. Скорее переходите по ссылке, трясите коробку и забирайте свой подарок ко Дню программиста: https://tprg.ru/I45e
❤3👍2
Идея положить данные в контекст и достать их через пару вызовов глубже звучит привлекательно. Код чище, сигнатуры функций не разрастаются, промежуточные уровни не знают о деталях.
Но именно в этом и проблема context.Value превращается в чёрный ящик, ломает типобезопасность и делает важные зависимости невидимыми.
Паттерн «A положил payment в контекст, C его вытащил, а B просто прокинул ctx дальше» выглядит аккуратно, пока вы помните все неочевидные места чтения. Через неделю уже не видно, какие функции реально зависят от payment а это критические бизнес данные, спрятанные в контейнер без гарантий на уровне компилятора.
Любая ошибка в ключе, типе или месте, где забыли вызвать WithValue, всплывает только в рантайме, иногда в виде тихих багов, а не паники.
Как обычно делают с context.Value:
type Payment struct {
ID string
Amount int
}
func A(ctx context.Context, transactionID string) {
payment := dbGetPayment(ctx, transactionID)
// Кладём бизнес данные в контекст
ctx = context.WithValue(ctx, "payment", payment)
B(ctx)
}
func B(ctx context.Context) {
// Эта функция формально не знает про payment,
// но обязана протащить ctx дальше
doSomething(ctx)
C(ctx)
}
func C(ctx context.Context) {
// Где то глубоко в стеке достаем payment из «чёрного ящика»
payment, ok := ctx.Value("payment").(Payment)
if !ok {
log.Println("payment not found in context")
return
}
processPayment(payment)
}
context.Value стоит оставлять для узкого набора метаданных, а важные доменные данные лучше передавать явно через параметры.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🌚2🤔1
С 14 сентября цены в Proglib Academy вырастут
Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🥱2
Media is too big
VIEW IN TELEGRAM
Вы вообще видели, что сделала команда AvitoTech ко Дню разработчика?!
В честь наступающего праздника вместе со студией FU2RE и 3D-художником Dmitriev Video ребята создали большой портал в прошлое — эмулятор 2006 года будущего разработчика. Внутри — олдскульные игры и викторины, за которые можно лутать баллы и подниматься в рейтинге.
Топ-3 игроков 15 сентября получат суперпак настоящих разрабов, внутри которого салфетка на монитор из коллаборации с Elnik, плед, сумка и плюшевый талисман — кот Б/У. Так что времени сыграть ещё много!
P. S. Сыграть в эмулятор и побороться за призы можно до 15 сентября. Так что успевайте❤
В честь наступающего праздника вместе со студией FU2RE и 3D-художником Dmitriev Video ребята создали большой портал в прошлое — эмулятор 2006 года будущего разработчика. Внутри — олдскульные игры и викторины, за которые можно лутать баллы и подниматься в рейтинге.
Топ-3 игроков 15 сентября получат суперпак настоящих разрабов, внутри которого салфетка на монитор из коллаборации с Elnik, плед, сумка и плюшевый талисман — кот Б/У. Так что времени сыграть ещё много!
P. S. Сыграть в эмулятор и побороться за призы можно до 15 сентября. Так что успевайте
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱9🤩3👍2😁1
🤔 Вопрос с собеседования по Go
Что выведет программа?
❤️ — числа выведутся по порядку
🔥 — числа выведутся в случайном порядке
👍 — программа завершится с ошибкой
👇 Правильный ответ (нажми, чтобы прочитать):
🔥 — числа выведутся в случайном порядке
Каждая итерация запускает отдельную горутину. Значение val передаётся в функцию аргументом v, поэтому все горутины получают правильное число.
Но порядок выполнения горутин не гарантирован планировщиком Go. Поэтому вывод может быть, например:
30
10
50
20
40
sync.WaitGroup нужен, чтобы дождаться завершения всех горутин.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
Что выведет программа?
❤️ — числа выведутся по порядку
🔥 — числа выведутся в случайном порядке
👍 — программа завершится с ошибкой
Каждая итерация запускает отдельную горутину. Значение val передаётся в функцию аргументом v, поэтому все горутины получают правильное число.
Но порядок выполнения горутин не гарантирован планировщиком Go. Поэтому вывод может быть, например:
30
10
50
20
40
sync.WaitGroup нужен, чтобы дождаться завершения всех горутин.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥50👍4🥱3❤2
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7👍1
В Ebitengine шейдеры пишутся на Kage — языке с Go-подобным синтаксисом. С их помощью можно создавать эффекты прямо на уровне пикселей:
— маска повреждений зданий;
— «дрожащий» рукописный текст;
— ретро-CRT и глитчи;
— зацикленная анимация текстур;
— эффект строительства зданий.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔴 Тестовый собес с Go Senior с опытом работы в Ozon, ex. Ситидрайв в этот четверг
[+ разбор 50 сложных вопросов в подарок ]
17 сентября (в этот четверг!) в 19:00 по МСК приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Go-разработчика!
Собеседование проведёт Даниил Динько - Senior Backend Engineer, ex. TechLead tier-3 world cybercrime, ex. Senior Go в Ozon, ex. Ситидрайв.
Как это будет:
📂 Даниил задаст разработчику вопросы и задачи, которые могут спросить на реальном собесе;
📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью;
📂 В конце сможешь задать любой вопрос Даниилу и получить на него развёрнутый ответ;
Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
И ты можешь посмотреть его бесплатно 🔥
Только завтра, в прямом эфире!
🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Go-собеседований 🔥
Переходи в бот, чтобы попасть на эфир и забрать подарок 👉 @shortcut_go_bot
Реклама.
О рекламодателе.
[+ разбор 50 сложных вопросов в подарок ]
17 сентября (в этот четверг!) в 19:00 по МСК приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Go-разработчика!
Собеседование проведёт Даниил Динько - Senior Backend Engineer, ex. TechLead tier-3 world cybercrime, ex. Senior Go в Ozon, ex. Ситидрайв.
Как это будет:
📂 Даниил задаст разработчику вопросы и задачи, которые могут спросить на реальном собесе;
📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью;
📂 В конце сможешь задать любой вопрос Даниилу и получить на него развёрнутый ответ;
Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
И ты можешь посмотреть его бесплатно 🔥
Только завтра, в прямом эфире!
🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Go-собеседований 🔥
Переходи в бот, чтобы попасть на эфир и забрать подарок 👉 @shortcut_go_bot
Реклама.
О рекламодателе.
❤3🥱2🤩1🌚1