kostyaBro
Можно вообще sonic заюзать. Но у меня был кейс когда sonic не завелся на проде, что очень странно.
kostyaBro
Причем работал, а потом вдруг перестал
Oleg
Он же на арм не фурычил на старых версиях
Oleg
Сейчас он вроде хотя бы не падает
kostyaBro
Мб у вас процы поменяли
Думали про это, но чет вряд-ли, ну хотя там такие заказчики были что могли любую дичь вытворить
Oleg
Мы сделали проще и через Билд теги два файла с выбором маршаллера сделали 🤷🏼‍♀️
Oleg
Хотя бы стабильно работает
kostyaBro
Норм тема
kostyaBro
Но вообще, avx разве что только у динозавров не было
Oleg
И у м1)))
kostyaBro
К сожалению пока так и не потрогал
kostyaBro
Но да
kostyaBro
Кароч protobuf union топ тема. Надо бенчмарки прогнать ради интереса
Илья
union? вы о чем?
kostyaBro
https://developers.google.com/protocol-buffers/docs/proto3#oneof
kostyaBro
Сори, oneOf union это в сях
Илья
если уж заговорили про protobuf, то вопрос по gRPC gRPC в основном использует синхронные запросы и ответы, но вместе с тем имеет полностью асинхронный или потоковый режим, доступный после установления соединения. Переключение режимов автоматическое или настраивается вручную? только начал изучать, возможно не видел метода для этого
kostyaBro
Там ты сам выбираешь стриминговый тип или нет.
kostyaBro
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse); Типо как в примере На вход стриминговый тип на выход обычный
kostyaBro
Лан, я спать)
kostyaBro
Да, так
kostyaBro
Ну по сути под капотом все стриминг там. Но это совсем другая история.
Иван 💎
Всем привет. Еще несколько дней и закончу изучение данной книги. Подскажите что лучше потом изучать? После книги начну какой-нибудь проектик делать, но может есть литература которая поможет быстрее освоится?
Иван 💎
быстрее написания кода мало что поможет освоиться. Лучше что-то писать. Пет проект, да
ну так и предполагал. Спасибо за ответ. Надо еще подумать какой проект делать, чтобы начать с простого и охватить области знаний различные для практики.
Rostislav
минимально включи в него: веб-сервер бд заверни в докер и выложи в кубер локально развернутый Это будет хороший проект. Остальное по желанию. Можешь редис прикрутить например
Rostislav
ну это пет проект для резюме
Иван 💎
минимально включи в него: веб-сервер бд заверни в докер и выложи в кубер локально развернутый Это будет хороший проект. Остальное по желанию. Можешь редис прикрутить например
kubernetes - плохо представляю что это. Только термины читал в гугле)) Стоит сразу включать в проект тоже? или это для начала будет слишком?
Иван 💎
Или кубер это оно и есть)
Rostislav
kubernetes - плохо представляю что это. Только термины читал в гугле)) Стоит сразу включать в проект тоже? или это для начала будет слишком?
можешь не включать. В целом наверное не критично. Кубер - это программа, которая набор компов представляет для тебя, как 1 комп, где ты запускаешь свой сервис.
Иван 💎
Понял, что не понял нагуглю) Спасибо за направления.
Михаил
Запустил под дебагом и увидел, что перебирая элементы массива и определяя их тип, он определяется как reflect.Interface{}, почему так?
Потому что это нужно самому делать, без reflect : type mess struct {key interface{} "json:k"} После unmarshal пробуешь перебором в рантайме приводить тип
G
Народ, всем привет! Вопрос по взаимодействию сервисов. Есть сервис Realty, который управляет адресной базой и связанными с ней вопросами - один Bounded Context. Есть сервис Owners, который управляет информацией о собственниках недвижимости - второй Bounded Context. У Realty есть API администрирования, которое по сути CRUD и позволяет: - получать список недвижки (с разным фильтрами); - получать данные конкретного объекта по ID; - изменять объект по ID; - добавлять объект. У Owners есть аналогичный CRUD-API для, соответственно, собственников. Оба API закрыты JWT-токенами. Для работы с Realty у пользователя должна быть роль realty-admin, для работы с Owners - owners-admin. Но при этом когда в Owners добавляется или изменяется собственник, одним из его параметров является список ID объектов недвижки этого собственника. Возникает необходимость следующего: - банально проверить, что такая недвижка есть; - забрать часть её данных для дальнейшей обработки в логике Owners. Для этого сервис Owners должен стучаться в Realty. И тут возникает вопрос с авторизацией. Если Owners придёт в Realty с токеном пользователя, у которого нет роли realty-admin, то не сможет выполнить чтение недвижки и, соответственно, добавление/изменение собственника. Не айс, потому что тогда при выставлении роли owners-admin будет всегда требоваться выставление realty-admin и предоставление доступа к совершенно левому Bounded Context. Если Realty будет позволять делать поиск недвижки по роли owners-admin, то в него протечёт зависимость из другого сервиса. А таких сервисов в теории может быть много разных. Плюс теоретически пользователь без доступа к Realty сможет выполнять запросы на поиск недвижки, если узнает об этой особенности. Тоже не айс. Если заводить отдельную роль realty-read, то надо не забывать проставлять её всем, у кого есть owners-admin - получится примерно такое же протекание зависимости, но в другую сторону. Вопрос: как правильно организовать проверку доступа к списку недвижки в Realty при межсервисном взаимодействии? Желательно с передачей информации о пользователе, который инициировал оригинальный запрос, потому что в аналогичном сценарии с другими сервисами будут write-операции. Пилить отдельный API для внутрянки? Использовать другую схему авторизации для внутрянки? Спасибо!
Sergey
Народ, всем привет! Вопрос по взаимодействию сервисов. Есть сервис Realty, который управляет адресной базой и связанными с ней вопросами - один Bounded Context. Есть сервис Owners, который управляет информацией о собственниках недвижимости - второй Bounded Context. У Realty есть API администрирования, которое по сути CRUD и позволяет: - получать список недвижки (с разным фильтрами); - получать данные конкретного объекта по ID; - изменять объект по ID; - добавлять объект. У Owners есть аналогичный CRUD-API для, соответственно, собственников. Оба API закрыты JWT-токенами. Для работы с Realty у пользователя должна быть роль realty-admin, для работы с Owners - owners-admin. Но при этом когда в Owners добавляется или изменяется собственник, одним из его параметров является список ID объектов недвижки этого собственника. Возникает необходимость следующего: - банально проверить, что такая недвижка есть; - забрать часть её данных для дальнейшей обработки в логике Owners. Для этого сервис Owners должен стучаться в Realty. И тут возникает вопрос с авторизацией. Если Owners придёт в Realty с токеном пользователя, у которого нет роли realty-admin, то не сможет выполнить чтение недвижки и, соответственно, добавление/изменение собственника. Не айс, потому что тогда при выставлении роли owners-admin будет всегда требоваться выставление realty-admin и предоставление доступа к совершенно левому Bounded Context. Если Realty будет позволять делать поиск недвижки по роли owners-admin, то в него протечёт зависимость из другого сервиса. А таких сервисов в теории может быть много разных. Плюс теоретически пользователь без доступа к Realty сможет выполнять запросы на поиск недвижки, если узнает об этой особенности. Тоже не айс. Если заводить отдельную роль realty-read, то надо не забывать проставлять её всем, у кого есть owners-admin - получится примерно такое же протекание зависимости, но в другую сторону. Вопрос: как правильно организовать проверку доступа к списку недвижки в Realty при межсервисном взаимодействии? Желательно с передачей информации о пользователе, который инициировал оригинальный запрос, потому что в аналогичном сценарии с другими сервисами будут write-операции. Пилить отдельный API для внутрянки? Использовать другую схему авторизации для внутрянки? Спасибо!
Микросервисы или монолит? Может быть создать еще один api с доступом уровня owner для предоставления данных о недвижке в том объеме, в котором пользователь с owner-доступом не сможет воспользоваться информацией о недвижке? Просто здесь решения надо принимать, исходя из многих факторов, которые не описаны
Sergey
Микросервисы. Не хотелось бы в логике недвижки даже упоминать owner, потому что это сделает coupling менее loose 😊 И в дальнейшем к сервису Owners добавятся ещё несколько. Каждому по API выглядит не очень удобно.
Честно говоря, моего уровня компетенции не хватает для оптимального решения, но возможно я бы начал с разработки универсального механизма взаимодействия между сервисами внутри системы (не показывая эту систему наружу), т.е. изменения достаточно фундаментальные, а не просто заплатка в виде дополнительной роли. Надеюсь, тут найдется сеньор, который имеет опыт решения этой проблемы (потому что проблема достаточно распространенная)
G
Честно говоря, моего уровня компетенции не хватает для оптимального решения, но возможно я бы начал с разработки универсального механизма взаимодействия между сервисами внутри системы (не показывая эту систему наружу), т.е. изменения достаточно фундаментальные, а не просто заплатка в виде дополнительной роли. Надеюсь, тут найдется сеньор, который имеет опыт решения этой проблемы (потому что проблема достаточно распространенная)
Вообще, тоже склоняюсь к приватному каналу общения для микросервисов. Придумалось такое: сделать API, аналогичное "публичному", но за middleware, который игнорирует роли в jwt-токене, но проверяет наличие внутреннего preshared-токена в кастомном заголовке, чтобы удостовериться, что вызывающая сторона - наш сервис. Или вообще вместо jwt-токена передавать просто кортеж из ID пользователя, ID сессии и всего прочего полезного из payload. Но по ощущениям как-то кривенько. Хотя, может быть, достаточно хорошо?
Sergey
Вообще, тоже склоняюсь к приватному каналу общения для микросервисов. Придумалось такое: сделать API, аналогичное "публичному", но за middleware, который игнорирует роли в jwt-токене, но проверяет наличие внутреннего preshared-токена в кастомном заголовке, чтобы удостовериться, что вызывающая сторона - наш сервис. Или вообще вместо jwt-токена передавать просто кортеж из ID пользователя, ID сессии и всего прочего полезного из payload. Но по ощущениям как-то кривенько. Хотя, может быть, достаточно хорошо?
Неужели никто не выносил эту тему на какой-нибудь конференции? Ведь про микросервисы многие говорят, Проблема взаимодействия должна стоять достаточно остро. Думаю, что озвученный путь на первый взгляд - оптимальный. Этот как с алгоритмами - вроде есть просто и понятный алгоритм решения задачи, а потом читаешь про какой то алгоритм, который проще, с меньшим О(), но не тривиальный, до которого сразу не додумаешься. Я бы погуглил эту тему и скорее всего в англоязычном сегменте, а пока двигался по вышеописанному пути
G
Неужели никто не выносил эту тему на какой-нибудь конференции? Ведь про микросервисы многие говорят, Проблема взаимодействия должна стоять достаточно остро. Думаю, что озвученный путь на первый взгляд - оптимальный. Этот как с алгоритмами - вроде есть просто и понятный алгоритм решения задачи, а потом читаешь про какой то алгоритм, который проще, с меньшим О(), но не тривиальный, до которого сразу не додумаешься. Я бы погуглил эту тему и скорее всего в англоязычном сегменте, а пока двигался по вышеописанному пути
Я гуглил. Советуют примерно то же самое с разными вариациями, в основном в сторону асинхронных взаимодействий на базе RabbitMQ и прочих кафк. Сюда написал именно в надежде на тот самый нетривиальный, но более простой способ 😊 Ну или на примеры имплементаций, или на статьи/доклады. Взаимодействие пока точно будет синхронное через API. Не хочется делать лишних нагромождений. Отдельный HTTP-endpoint с другой схемой авторизации, например, или вообще GRPC - возможно, это усложнения, которых можно избежать без вреда для решения задачи.
G
Просто в теле запроса ID пользака?
Sergey
нет, пока еще не реализовал, основной сервис собирает данные, обращаясь к другим сервисам без авторизации, аутентификация происходит посредством проверки сертификатов, ключи доступны только сервисам. Возможно это не совсем безопасно, но то, что api не публичный - мне в этом проще
Fgyutr
Всем привет, можете подсказать канал по pl/sql?
🅞leksiy
Потому что это нужно самому делать, без reflect : type mess struct {key interface{} "json:k"} После unmarshal пробуешь перебором в рантайме приводить тип
Приведение типа это float64(i), var.(float64) - это утверждение типа или type assertion. И все же зачастую лучше сделать кастомный анмаршалинг, иначе потом с этой структурой работать тяжело будет. Во всех местах, где понадобится значение из структуры взять, придется ассертить тип - то еще удовольствие.
🅞leksiy
Я гуглил. Советуют примерно то же самое с разными вариациями, в основном в сторону асинхронных взаимодействий на базе RabbitMQ и прочих кафк. Сюда написал именно в надежде на тот самый нетривиальный, но более простой способ 😊 Ну или на примеры имплементаций, или на статьи/доклады. Взаимодействие пока точно будет синхронное через API. Не хочется делать лишних нагромождений. Отдельный HTTP-endpoint с другой схемой авторизации, например, или вообще GRPC - возможно, это усложнения, которых можно избежать без вреда для решения задачи.
Если рост планируется, то возьми nats, в принципе позволяет паттерны Request-Reply, при этом будет единый endpoint, без головняка, какой микросервис на каком порту запущен и во сколько инстансов. Он на go написан, позволяет повторно обрабатывать сообщения, которые, например, были получены, но не были обработаны из-за падения сервиса.
Null
Тестирование в Go: от плохого к хорошему. В этом видео мы расскажем теорию тестирования, поговорим о том, как нужно писать тесты в Golang и затронем тему архитектуры проекта. Первая часть Вторая часть Код Test Pyramid @Golang_google
Bogdan
Господа, день добрый. Вопрос такой, немного нестандартный(А может и стандартный для чата). Есть ли кто мог провести код ревью? Написал сервис, но хочется со стороны архитектуры все в идеал вывести, да и, возможно, поработать над рефакторингом. В общем, хочется взгляд с горы опыта, шоб поделились, так сказать
Юра (Юрий Александрович)
А сервис большой?
Bogdan
Нет, два эндпоинта. Upload-download image
Bogdan
Я в течении дня ещё rabbitMQ и Redis подкручу. Пропишу docker-compose и, думаю, будет готово
Юра (Юрий Александрович)
Как говорится "Я не доктор, но тоже могу посмотреть". (хотя очень хочется отморозиться...)
Юра (Юрий Александрович)
Все не так просто. Все очень сложно. Мне хочется посмотреть, спать и компотика.
G
Если рост планируется, то возьми nats, в принципе позволяет паттерны Request-Reply, при этом будет единый endpoint, без головняка, какой микросервис на каком порту запущен и во сколько инстансов. Он на go написан, позволяет повторно обрабатывать сообщения, которые, например, были получены, но не были обработаны из-за падения сервиса.
Правильно понимаю, что в этом случае авторизация пользователя в шине не передаётся из одного сервиса в другой вообще, или передаётся в виде минимальной информации типа ID пользователя, но роли пользователя уже не проверяются?
🅞leksiy
https://docs.nats.io/running-a-nats-service/configuration/securing_nats/authorization
🅞leksiy
Или я может неверно понял вопрос?
🅞leksiy
Если речь о пользователях приложения, то все от архитектуры зависит, один сервис может глядеть наружу, проверять авторизацию, а дальше внутри системы запросы будут по id идти
G
Или я может неверно понял вопрос?
Вопрос про контроль разрешений пользователя на уровне отдельных действий в каждом сервисе. Делают ли его вообще при общении через внутренний межсервисный канал, и если делают, то как?
Bogdan
Все не так просто. Все очень сложно. Мне хочется посмотреть, спать и компотика.
Ну, давайте тогда я закончу, вам напишу. Вы, как будете свободны, посмотрите на досуге
Юра (Юрий Александрович)
Вопрос про контроль разрешений пользователя на уровне отдельных действий в каждом сервисе. Делают ли его вообще при общении через внутренний межсервисный канал, и если делают, то как?
Это очень широкий вопрос и варианты бывают разные. Обычно исходят из того, чтобы каждый микросервис был самодостаточным и при этом они не дублировали функции друг друга. Т.е. если у какого-то пользователя есть специфические для микросервиса (и вообще, только этому микросервису понятные) полномочия, то он их и должен проверять. Но при этом проверять, точно ли это тот самый пользователь - обычно не надо, т.к. мы на уровне настройки окружения бэка обеспечиваем чистоту внутренней среды.
anhckie
может кто-то объяснить новичку, в чем принципиальное отличие от буферизированных и небуферизированных каналов?
anhckie
шо-то путаница в голове
Sebor▂▅▇█▓▒░
Ну в одном есть буфер, а в другом нет 😏
Eugene
English please
Sergey
может кто-то объяснить новичку, в чем принципиальное отличие от буферизированных и небуферизированных каналов?
в том, что в буферизированный канал мы можем записать данные и двигаться дальше, не ожидая, когда из канала прочтут (если данных меньше, чем емкость буфера канала)
John
Вопрос: DI-контейнер уместен в go-приложение?
Emin Zalaev
Eugene
Ок
thanks
Patamen
English please
نحن نتحدث العربية سخيف