Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Кто работает с микросервисами - есть вопросы

1430  1 2 3 4 5 6 все
AlexNek патриот10.07.21 11:55
AlexNek
NEW 10.07.21 11:55 
в ответ schizo 09.07.21 23:16
а если ресурсов станет не хватать

Во, пожалуй единственный критерий.

Вот только что делать, если пользователей дофига пришло, что распихивать на другие сервера? Как это все измерить в монолите?

#41 
AlexNek патриот10.07.21 12:01
AlexNek
NEW 10.07.21 12:01 
в ответ AlexNek 10.07.21 11:53, Последний раз изменено 10.07.21 15:00 (AlexNek)

Вот еще, более практическая задачка.

Слепил я простенький сервис на Web API. Как делаю отладку в студии на докере - все работает.

Как запускаю прямо в докере - не откликается страница.

Это проект тип - строка 1

А если делаю проект тип - строка 2, то страница показывается как из под студии в докере, так и прямо с докера.


Что еще нужно добавить первому проекту чтобы в докере также работал? НЕТ Коре 3.1

....

Похоже, что то обновилось/испортилось второй тип проекта тоже перестал работать - "The connection to the server was reset while the page was loading. Это под виндой

...

Но если делаю Publish на Docker Hub, то получается как и было описано. Я раньше именно так проверял.

...

Получилось - как обычно, самдурак смущ Или путь к сервису неправильно указывал или забывал строку соединения к базе указывать. Ошибок то особых никаких не показывает.

Под виндой для отладки так и не работает, ну и фиг с ним.

#42 
koder патриот10.07.21 18:38
koder
NEW 10.07.21 18:38 
в ответ AlexNek 10.07.21 11:47, Последний раз изменено 10.07.21 18:40 (koder)

Я ж явист и работаю со спрингом. Перед тем, как нттп-запрос попадает ко мне, как к прикладному программисту для обработки он проходит ряд фильтров. Где и настраивается защита. Токен извлекается из заголовка запроса и проверяется. По результатам проверки запрос или пропускается дальше или формируется отказ в запросе с соответствующим кодом.


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

#43 
gans_myuller завсегдатай12.07.21 08:26
NEW 12.07.21 08:26 
в ответ AlexNek 09.07.21 17:40

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


Монолит может состоять хоть из 100 длл. Он выполняется в одном процессе/на одной машине, у него одна большая бд, а вечно увеличивать память и количество ядер мы не можем.

#44 
gans_myuller завсегдатай12.07.21 08:49
NEW 12.07.21 08:49 
в ответ AlexNek 08.07.21 16:18

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


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


Если сервис недоступен, то, например, сообщение для него останется в очереди до тех пор пока он не поднимется. Или система через некий промежуток времени не получив подтверждения начнет все откатывать назад. Почитайте, например про SAGA pattern.


И да, распределенные трансакции подерживать тяжело и накладно, но как показывает практика это нужно очень и очень редко. Обычно достаточно отложенной консистенции.

#45 
AlexNek патриот12.07.21 12:23
AlexNek
NEW 12.07.21 12:23 
в ответ koder 10.07.21 18:38
Я ж явист и работаю со спрингом

Понятно, у нас похоже несколько по другому. Но интересовало немного другое.

Обычно я запрашиваю токен авторизации по имени пользователя и паролю, а сервис как?

#46 
AlexNek патриот12.07.21 12:37
AlexNek
NEW 12.07.21 12:37 
в ответ gans_myuller 12.07.21 08:49
В монолите удалить пользоватея тоже не просто

Обычно это дело базы.


SAGA pattern

https://habr.com/ru/post/427705/

Интересно, спасибо

#47 
AlexNek патриот12.07.21 12:43
AlexNek
NEW 12.07.21 12:43 
в ответ gans_myuller 12.07.21 08:26
Если у двух сервисов общие 100 таблиц

Нет имелось в виду несколько другое.

Сервис берет данные их базы и отдает их по какому АПИ. Дальше данные переводятся в "UI формат" (типа те же данные только с атрибутами).

Вот как это все синхронизировать?


При этом каждый сервис берет из нее себе то, что ему нужно.

Это вроде еще сложнее, нужно знать ИД объекта и какие данные он имеет.

#48 
koder патриот12.07.21 12:49
koder
NEW 12.07.21 12:49 
в ответ gans_myuller 12.07.21 08:26
Он выполняется в одном процессе/на одной машине

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

#49 
koder патриот12.07.21 12:56
koder
NEW 12.07.21 12:56 
в ответ AlexNek 12.07.21 12:23
Обычно я запрашиваю токен авторизации по имени пользователя и паролю, а сервис как?

По разному. Например создается специальный пользователь, первый сервис сначала запрашивает от имени этого пользователя токен авторизации у сервера авторизации, а потом с этим токеном лазит где надо. Этого пользователя можно ограничить специально правами. Кроме того можно ставить защиту на заптос только с определенного домена только приложениями с определенным именем и с соответствующим кодовым словом.

#50 
AlexNek патриот12.07.21 13:35
AlexNek
NEW 12.07.21 13:35 
в ответ koder 12.07.21 12:56
Кроме того можно ставить защиту

То бишь делаем дополнительную защиту и называем ее SS7 спок

#51 
koder патриот12.07.21 13:56
koder
NEW 12.07.21 13:56 
в ответ AlexNek 12.07.21 12:43

Сервис берет данные их базы и отдает их по какому АПИ. Дальше данные переводятся в "УИ формат" (типа те же данные только с атрибутами).Вот как это все синхронизировать?


С чем синхронизировать? Сервис - это нечто, что по запросу предоставляет какой то ресурс в пользование. Итак веб-сервис(апи), который отвечает на веб-запрос, передает запрос внутреннему сервису (чертов термин 'сервис', который используется везде в разных контекстах), который в свою очередь вытаскивает ентети-обьект(как правило из базы данных) и передает апи. Апи серелизует полученные данные согласно транспортному протоколу и отправляет как хттп-ответ. Все. Что спросили, то и ответили. Ничего синхронизовать не надо.

#52 
gans_myuller завсегдатай12.07.21 14:11
NEW 12.07.21 14:11 
в ответ koder 12.07.21 12:49

>Но если имеется 20 сервисов, то не значит, что будет 20 отдельных машин под них

Можно и на одной. А можно и на разных. Две машины с 64гб памяти могут оказаться дешевле одной с 128гб.
А можно сегодя на одной, а на выходных, когда нагрузка больше, на трех. С монолитом такой трюк не пройдет.
И это мы еще не начали обсуждать как обновлять наше монолиное приложение когда клиент требует 7х24 доступности основного функционала.

#53 
koder патриот12.07.21 15:32
koder
NEW 12.07.21 15:32 
в ответ AlexNek 12.07.21 13:35
То бишь делаем дополнительную защиту и называем ее SS7
В принципе да. Есть стандартные решения. Но если мы выходим за рамки

контрекста приложение и еще используем каналы связи, то внезапно встает

задача защиты доступа к отдельным частям проги. Но это нормально. Кроме

того, что веб-сервисы между собой взаимодействуют, может потребоваться

доступ сторонним приложениям. Например приложения, которое занимается

изготовлением берихтов (например квик селс) потребует данные по

РЕСТ-протоколлу.

#54 
koder патриот12.07.21 15:33
koder
NEW 12.07.21 15:33 
в ответ gans_myuller 12.07.21 14:11
Можно и на одной. А можно и на разных. Две машины с 64гб памяти могут оказаться дешевле одной с 128гб.

Ok

#55 
AlexNek патриот12.07.21 15:56
AlexNek
NEW 12.07.21 15:56 
в ответ koder 12.07.21 13:56
Ничего синхронизовать не надо

вытаскивает ентети-обьект(как правило из базы данных) и передает апи --> Апи сериализует полученные данные --> вытаскиваем объект "для UI"

Добавили в таблицу поле адрес, обновили апи, хотим показать адрес в UI. Как без "синхронизации"?

#56 
koder патриот12.07.21 19:34
koder
NEW 12.07.21 19:34 
в ответ AlexNek 12.07.21 15:56

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

#57 
AlexNek патриот13.07.21 10:33
AlexNek
NEW 13.07.21 10:33 
в ответ koder 12.07.21 19:34
Но обычно синхронизировать надо

и какой будет наиболее удобный способ?

#58 
koder патриот13.07.21 14:32
koder
NEW 13.07.21 14:32 
в ответ AlexNek 13.07.21 10:33
и какой будет наиболее удобный способ?

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

#59 
AlexNek патриот13.07.21 16:29
AlexNek
NEW 13.07.21 16:29 
в ответ koder 13.07.21 14:32

В общем, как обычно, понятно, спасибо.

#60 
1 2 3 4 5 6 все