Comments 4
Подход запрос-ответ через брокер считается дурной практикой, если вам нужно чтобы был ответ на запрос то лучше ставить сервисы за балансировщик. Брокеры нужны чтобы "когда-нибудь" обрабатывать сообщения, а не моментально отвечать
статья похожа на набор вредных советов. Тут кафка как собаке 5 нога:
* api gateway невозможно масштабировать, при падении он всё потеряет
* ключи(поле key) в кафке для выбора партиций используют, здесь партиция только 0, кафку тоже получается не замасштабируешь. Нужно коньюмер группу для этого использовать
* second microservice тоже не масштабирутся потому что 1 инстанс сервиса == 1 партиция кафки.
?
В 3-й версии Docker Compose была удалена функция "depends_on" для контроля за зависимостями сервисами, которая была доступна в 2-й версии. Эта функция позволяла автоматически ожидать, пока зависимые сервисы будут полностью запущены, прежде чем запускать зависящий сервис.
Вы тут немного путаете, в самом docker compose depends_on
остаётся и работает, а вот в docker swarm он игнорируется
Я еще я заметил сразу не читая весь код целиком, что вы любите паниковать, тем самым нарушая один из принципов самого GO.
if err != nil {
panic(err)
}
В таких местах лучше заменить на Fatal, а лучше вообще обработать ошибку.
go func() {
for {
select {
case msg := <-partConsumer.Messages():
responseID := string(msg.Key)
mu.Lock()
ch, exists := responseChannels[responseID]
if exists {
ch <- msg
delete(responseChannels, responseID)
}
mu.Unlock()
}
}
}()
А вот в этой горутине вы читаете из канала, при этом никак не обрабатывая дефолт, например на случай если канал уже закрыт.
requestID := fmt.Sprintf("%d", time.Now().UnixNano())
responseChannels[requestID] = responseCh
А вот таким кодом есть риск поломаться, если в хендлер придет нагрузка, вы конечно можете сказать ято это прекрасный вариант схлопнуть запросу, скажу что нет. Для этого используйте sync и SingleFlightGroup.
И это я глянул только 1 сервис, не смотря что там дальше, при этом я не го разработчик, а девопс. Но даже я на своем уровне знания код так не пишу, потому что он уж очень новичковый, и напоминает код который пишут ютуберы, которые пытаются учить гошке.
Если вы беретесь за то чтобы показать как надо, то делайте это правильно, представьте сколько не окрепших умов попытаются протащить такое в продакшен))) Ну и на последок, тащить gin ради 1 ручки, можно было бы взять чего попроще, родной http или fastHttp ну на крайняк mux, который вроде до сих пор в архиве.
У меня все, коллеги разработчики если что еще поправят.
Простейший пример kafka + golang