Микросервисы, REST, дизайн систем, деплой

Микросервисы, REST, дизайн систем, деплой #


1. Сервис в рамках транзакции сохранил в БД и должен еще записать в Kafka, но отключили свет. Как предусмотреть, что в БД закомичены данные, которые не дошли до конца? #

2. Сервис закупок хранит количества остатка товара на складе. Пользователь выбирает товары в приложении и видит, сколько товаров осталось. Этот сервис проскалирован и используется кеширование для количества остатка товара. Какой кеш лучше локальный или распределенный? - Если сделаем локально, будут ли проблемы? - С другой стороне, если товар в одном экземпляре, у каждого клиента это записано. Что может случиться? #

3. Стратегии деплоя. Сервис работает в проде, новый релиз с серьезным багом. Если такой релиз выкатим, а предыдущий убьем, будет больно. Какие более плавные подходы деплоя? #

4. У тебя был монолит, билдился 40 минут. Если надо раскатить предыдущую версию, придется ждать 40 минут. Есть ли менее болезненные подходы? #

5. Есть веб-сервис на Tomcat, Spring Boot. Ты написал Controller получения имени пользователя по id. За именем пользователя идешь в БД Postgres. Запускаешь этот сервис на одноядерной системе, ожидаешь нагрузку около 100 запросов в секунду. Будет ли это работать? #

6. Одноядерная система. Запускаем сервер, но ручка вычисляет числа Фибоначчи. Что-то изменится? - Как это будет выглядеть со стороны метрик? - Со стороны пользователей это будет выглядеть так, что запрос очень долго выполняется? Что будет с CPU? На сколько он будет нагружен? #

7. Нужно передать на сервер логин и пароль. Через что будем делать? Почему? #

8. Есть сервис, который вызывает другой сервис по http. Мы используем RestTemplate или Feign Client. Мы должны взять метод, что-то сделать, обработать, в базу положить. И хотим весь процесс сделать асинхронным, чтобы метод не блочил систему. Как это реализовать? #

9. Есть API, мы торчим наружу get запросом, с помощью которого туда передается команда. В рамках API выбираются очень большие данные, их нужно будет отправить в Kafka. За месяц накапливается 2 млн записей таблицы и их нужно выгрузить в Kafka. Какие подводные камни могут быть, если наружу торчим get запросом? На фронт нужно отправить количество записей #

10. Одно и то же приложение нужно запустить в двух разных окружениях. Как это сделать проще всего? #

11. Пишешь приложение, на локалке все работает, отдаешь в сборку. DevOps запускает на проде, там все падает, не подключается к БД, не подключается к Kafka. Что делать? #

12. Хотим запускать приложение на нескольких стендах: dev, prod. Есть выбор: использовать Spring, либо собственную Статическую Фабрику. Где будет удобнее? Продолжение ситуации. Есть подключение к БД. В Абстрактной Фабрике есть конфиги, объекты, я сам создаю инстанс. На другом стенде придется создать другой класс с другими конфигами. И подкладывать нужный объект для каждого стенда. Как это в Spring реализовано? #

13. Синхронизация микросервисов, чтобы только один микросервис отправил запрос, а остальные не отправляли. Есть монолит, есть Sheduled, который идет в БД, строит отчет, отправляет сообщение в Kafka. Если есть второй инстанс, то оба отправят в Kafka сообщение, а нам нужно только одно сообщение. #

14. Один сервис вызывает другой сервис. Где может возникнуть задержка? На что обратить внимание, что бы уменьшить время задержки? #

15. Работа с БД в микросервисах. Используем подход Database per Microservice. Как добиться той же ситуации, как с транзакциями? #

16. Работает только синхронно и в диалоговом режиме. Посылает гет запрос и должен получить ответ. Сложность в том, что данные которые нужно получить собираются асинхронно. Как совместить асинхронность и синхронность? #

17. Есть приложение, навешал туда Lock-ов, все работает четко. По бизнесу конфликтов нет. Начал горизонтально масштабировать свое приложение, и полезли проблемы. Почему Lock-и перестали спасать после горизонтального масштабирования? Горизонтальное масштабирование - приложение работало в одном экземпляре, стало в двух экземплярах работать #

18. Есть запрос от клиента в какой-то из наших контроллеров, через что проходит запрос? #

19. У тебя есть бизнес процессы, есть микросервисы. Микросервис отправки сообщений и микросервис бизнесс логики. Как ты будешь их интегрировать? Какой протокол и какую технологию выберешь? #

20. Тебе запрещено работать с Kafka. Есть только REST. Микросервис, который отвечает за работу оборудования. Он оставляет заявку сервису, который регистрирует и составляет расписание проверок. Как это реализовать по REST. Составление расписания раз в 8 часов #

21. Внедрение гарантий доставки. Если мы добавляем запись в БД, то как проверять, что случилось с клиентом? Клиент тоже должен взаимодействовать с БД? #

22. Есть сервис, который по эндпоинту обновляет что-то в базе. В эндпоинт могут одновременно обратиться с разных мест. По умолчанию Spring boot может добавить в базу сразу два одинаковых запроса. В итоге мы ломаем логику. Как решить эту проблему? #

23. У нас нет REST, пришел менеджер, хочет ввести REST. Точно ли нам надо, хорошо ли? Как это сделать? #

24. Как завернуть Java приложение в Docker? Есть JAR. Расскажи пошагово #

25. Если у нас злоумышленник сворует рефреш токен, он не сможет получить новый access? #

26. REST. Ты сделал Get запрос, как он получает данные? Что тебе надо сделать, чтобы получить определенные данные? #

27. Есть старый монолит и новые микросервисы. Старую БД мигрировать не хотим. Если нагрузка повышается, то старый монолит начинает отказывать. Каскадно микросервисы начинают отключаться. Фронт отключился. Как сделать так, чтобы старый микросервис не особо влиял на текущую реализацию? Как выжить в периоды пиковой нагрузки?…Продолжение ситуации. Circuit Breaker отрубил микросервис, хорошо все заработало. Но нас начали DDOS-ить. Реальные клиенты начинают получать timeout. Что делать? #

28. Как написать интеграцию с другими сервисами? С чего начнешь? #

29. Есть Сервис который принимет http запрос и этому Сервису нужно сходить в другой Сервис и принять от него запрос и передать первому Сервису. Запросы через Kafka в синхронном режиме. Код должен принять http запрос и дать синхронно ответ и в промежутке вызвать Kafka. #

30. Банковское приложение. Есть несколько фронтендов. Браузерый и мобильный. Есть общее API. Есть общее ядро, которому все равно откуда приходят запросы. Фронтенды ожидают свои JSON. #

31. Что сделать для создания endpoint для POST запроса? #

32. В Сервисе есть обращение к Google api. Как сделать так, чтобы при тестах не отсылались запросы в сторонние сервисы? #

33. Предположим, разработали микросервис на спринге и есть бизнес-логика по забору данных, есть “тонкое место”. Что делать будем, как решать проблему? #

34. Есть бизнес, где функционал очень связан. Микросервис большой. Он может оставаться микросервисом? Или это уже монолит? #

35. Есть сервис, который нужно протестировать. В сервисе есть внедрение стороннего компонента, хочу этому компоненту придать определенное поведение. Тест с какой аннотацией нужно сделать заглушкой? #

36. Нужно разработать систему уведомлений, которая поддерживает несколько каналов доставки. Например email, смс, пуш уведомления. Нужно спроектировать так, чтобы система поддерживала расширение в виде добавления новых каналов доставки. #

37. Есть некоторый эндпоинт, к обращению к которому происходит 500 ошибка и пользователь получает StackTrace. Не хотим, чтобы пользователь это видел. Нужно сделать, чтобы при ошибке пользователь получал осмысленное сообщение. Как это сделать средствами Rest и Spring MVC #

38. Разрабатываешь новый Hello сервис. Есть один get метод. Поднимаем в Спринг Сервис. Из Постмана посылаем запрос Get. Опиши что происходит на пути следования запроса. От нажатия кнопки до того как запрос пришел в Сервис #

39. Представь, что проектируем приложение. Нужно сохранить объект. Например, сессию пользователя или покупку пользователя. Какую БД выбрать? #

40. В k8s поднимаем более одного экземпляра микросервисного приложения. Возможны подводные камни, связанные с синхронизацией. Были ли такие ситуации? Какие проблемы? #

41. Есть два сервера, ты хочешь подружить их по TLS. Что для этого нужно? #

42. Банковское приложение. Пользователь хочет сделать перевод. В БД надо поменять запись и отправить сообщение в очередь. Как это сделать транзакционно? #

43. Банковское приложение. Хотим сделать вызов на перевод денег. Отваливается сеть. Как сделать запрос только один раз? Как точки зрения приложения сделать так, чтобы ничего не задублировалось из-за падения сети. т.е. запрос от пользователя ушел и сразу потерялась связь, но запрос отработал. Что делать? #

44. Есть запрос, который должен возвращать разные ответы. Например, запрос должен сохранять данные по ИП. Если данные сохранились, ответ 200. Если данные уже есть, то возвращается код 409 и полностью другой ответ. Как реализуешь такую логику? #

45. Архитектура приложения, потенциальный Highload. Пришла задача от бизнеса. Есть данные на входе, например ИНН, что-то с ними делаем. На выходе генерируем excel файлы с данными. При этом, в запросе нам могут отправлять другие файлы из внешних API. В полученном запросе может быть от 1 до массива из тысяч ИНН-ов. За сутки может быть от 100 до 10 млн запросов к сервису. Нам выделили не мощный сервис. Нужно выдерживать нагрузку. Когда происходит генерация excel, не должен блокироваться сервис с REST. Как архитектурно это реализовать? #

46. Существует горизонтально масштабируемый сервис на базе Spring. В его зоне ответственности есть реляционная БД с таблицей пользователей. Необходимо реализовать scheduler, который раз в месяц будет отправлять пользователям некоторый email. Допустимая задержка отправки - 1 час. Опциональное усложнение - инстансы приложения должны делить между собой список рассылки. Задача: гарантировать, что каждый пользователь получает ровно один email #

47. На Gateway приходит запрос /user , запрос авторизуется. У вас один сервис, у него 3 инстанса. Как Gateway поймет, куда ему закинуть запрос? Какие есть варианты? #

48. Retry. Есть сервис A и сервис B. Мы хотим из A пойти в B. Делаем запрос. ConnectionTimeout, либо сервис B лежит. И мы делаем Retry. В чем минус такого подхода? Как бы ты сам реализовал Retry, если нет Kafka, и мы идем по REST к сервису, чтобы получить данные? #

49. Микросервис активно работает с Kafka: много пишет в нее, много читает из нее. И с БД работает микросервис. Как решить проблему с Data Race без блокировок на таблицу? Есть набор данных, который передается в Kafka: объекты с каким-то содержанием. Объекты принадлежат разным родительским типам. Как использовать Kafka для оптимизации? Пример: есть датчик погоды, который очень активно шлет информацию об изменениях погоды. Мы эту инфу сохраняем в БД. Как обеспечить, чтобы эта инфа сохранялась последовательно, чтобы было консистентное состояние БД, ничего не терялось, ничего не перезаписывалось? На один объект может приходить 10 тыс изменений. Потоковая обработка, не хотим ничего ждать #

50. Проектируем банковское приложение. Есть кнопка для перевода с одного счета на другой. Хотим, чтобы во время обрыва связи, перевод выполнился только один раз. Как нам такое организовать? #

51. Массовая рассылка. Нужно разослать 200 тыс. push уведомлений. Какое простое решение без Kafka, без RabbitMQ? Как это организовать без влияния на инфраструктуру? #

52. Реальная первая задача будет на проекте. Есть Web, Android, iOS. Это нативные клиенты. Нам нужно прогрузить excel размером 2Gb. У клиента есть этот файл, а у нас есть ingress controller, который принимает эти файлы. Перед ним NGINX, после него NGINX. И Ingress-ов 20 штук. Но инфраструктуру сейчас не обсуждаем. Тебе нужно донести этот тяжелый excel документ до некоторого сервиса, которого пока не существует. Этот excel в базу мы положим уже со столбцами, с определенными типами, ячейки будем процессить. Может млрд ячеек придется процессить. Как будешь решать задачу? #

53. У вас небольшой сервис. Если завтра поток возрастет в 10 раз, какие ваши действия? Архитектурный взгляд #

54. Есть приложение, работает в проде, все хорошо. В одном из бизнес-процессов приложения мы отправляем email клиенту. Своего email-сервиса у нас нет, мы купили внешнюю API, в которую мы отправляем POST запрос, email адрес и текст, а внешний сервис отправляет email. За каждый вызов API мы платим 10р. Еще мы любим писать тесты, есть много тестов, есть ночные тесты, билды на новые коммиты. Оказывается, что в тестах мы тоже используем внешний API и платим деньги. А в тестах не хочется это делать. Как решить эту проблему? #

55. У тебя есть сервис, который откидывает в кафку изменения сущности. С другой стороны есть сервис, который читает эти сущности. Как сделать так, чтобы у них эти сущности были в том же состоянии, что и в master-системе? Как ты это реализуешь, при условии, что сущности могут обновляться очень много раз в короткий промежуток времени. Также нужно обеспечить, чтобы у потребителя не получилось так, что более старые данные перезатирают более новые? #

56. У нас есть контроллер, который вызывает сервис, который вызывает сохранения сущности в БД. У сущности есть поле автор. Приходит запрос на сохранение от какого-то пользователя. Мы хотим узнать что это за пользователь и записать его username в поле автор. Как это сделать? #

57. У меня есть виртуалка (kuber не берем). В чем разница двух подходов? Первый вариант: я в рамках виртуалки пишу docker start container1, docker start container2. Второй вариант: я просто пишу java -jar свой_jar_файл #

58. Есть микросервисы. Есть только один лог. Хочу подтянуть еще логи. Как это сделать в Grafana? #

59. Есть твой микросервис, он хорошо законфигурирован. В application.yml указан определенный порт, законфигурировано общение с Redis. И на твоей локальной машине установлен тоже Redis. И у DevOps-а на сервисе, где он делал тестирование тоже что-то есть на этом же порту. Ты используешь Testcontainers. Берешь Redis. Но, если ты просто будешь поднимать тестовое окружение, то будет ругаться, говорить, что у тебя на таком-то порту что-то стоит. Ты хочешь сохранить application.yml, не хочешь делать отдельный profile. Что будешь делать, чтобы тест запустился? Какой мощный механизм у Spring Boot Test есть, чтобы показать, что ты игноришь определнный порт? #

60. Есть два сервера. На первом сервере запускаем две виртуальных машины. На втором сервере linux с запущенным Docker-ом с несколькими контейнерами. На первом сервере на одной виртуалке запускаем приложение, которое умеет убивать операционную систему. И на втором сервере в докере тоже запускаем то же приложение. Выживет ли на первом сервере вторая виртуалка? Выживут ли остальные контейнеры на втором сервере после того, как в одном контейнере убили ОС? #

61. Grafana. Есть счетчик, он растет от 1 до 5. Потом инстанс перезагрузился, счетчик опять начинает расти с нуля. Если такой трафик вывести в Grafana, он будет расти и падать. Как это решить? #

62. Расскажи как ты будешь добавлять клиента в приложение магазина. Расскажи по слоям #

63. У меня появился новый микрос, хочу с ним определить feign взаимодействие. Что представляет из себя Feign? Что мне надо определить? На Feign клиенте наверху указываешь путь до сервера, который вызываешь. У меня может оказаться, что путь разный на разных стендах (test, dev, prom). Как настраиваете стендозависимые пути на проекте? #

64. Где в k8s наш Docker контейнер с приложением? Мы собрали jar-ник. Как его довести до pod? Где здесь сущность service и deployment? Если в k8s открыли вкладку с нашим pod-ом, то какая инфа содержится в deployment? Есть pod, мы говорим, что там крутится наше приложение. А pod это и есть наше приложение? Что находится в самом pod-е? Может ли там 10 приложение находиться, абсолютно разных, между собой не связанных? #

65. Есть 2 сервиса (один из них user_service). Используется feign-client. И написано в k8s user_service:port_8080. Как второй java сервис находится просто по именованию? Мы пишем user_service и вся инфраструктура знает, как по IP открыть TCP соединение с ним? Где что указано в k8s? #

66. Есть микросервис для списания денег со счета для оплаты Заказа. Его через REST вызывает другой сервис. Наш микросервис высоконагруженный, иногда много заказов приходит, два заказа от одного клиента может прийти. Какие проблемы могут быть? Как бы ты спроектировал? #

67. Есть голосовой ассистент, который выдает востребованные вещи пользователю. Это диалоговая система. Пользователь что-то говорит ему, тот ему отвечает. Ассистент сам не может инициализировать взаимодействие с пользователем, только отвечает на его вопросы. Внутри есть платформа для взаимодействия на человеческом языке, и вызываются API. Система какие-то данные получает и отвечает пользователю. По факту это классический REST API. Но данные, которые нужны системе, собираются асинхронно. Есть отдельно запрос, который стартует сбор данных. И есть отдельно запрос, который ты дергаешь и получаешь либо ответ, либо просьбу ожидать. Какой алгоритм работы нужен, чтобы поженить между собой эти системы, и дать возможность голосовому ассистенту отвечать в синхронном режиме, получая данные из асинхронной системы? #

68. If we delete container and recreate it from the image, will we have data from the previous run? #

69. Микросервис. К нему пришло сто тыщ запросов. Где могут быть проблемы? По базе все ок, по памяти тоже все ок и по процессорному времени все ок. С чем еще могут быть проблемы? #

70. Допустим у тебя есть очень медленный сервис и ему иногда прилетает прилетает миллионы записей и сервис неделю переваривает данные, как бы ты сделал по другому? #

71. Как бы ты организовал обработку больших сложных JSON файлов? Какие библиотеки будешь использовать? #

72. Тебе надо реализовать, чтобы на основную страницу мог зайти кто угодно, а на определенную страницу, смог заходить только человек с определенной ролью. Как это сделать? #

73. User profile (User Service) is smth often requested by many services, and we don’t want to overwhelme such micro service. What we can do? #

74. Есть 2 микроса. Первый микрос формирует заказы и хочет списать со счета клиента их оплату. Он передает номер счета и количество денег второму микросу. Второй микрос списывает с конкретного счета конкретную сумму. Работа сервиса интенсивная. Может оказаться, что у одного и того же клиента подряд быстро идут две оплаты. Что нужно сделать на втором микросе, чтобы все было хорошо? Может даже одновременно от первого сервиса прийти запрос: спиши с этого счета 500 р. Какие могут быть проблемы? #

75. Есть класс. У него 2 метода: первый и второй. Ты повесил @Retryable на второй метод класса. Вызываешь из первого метода класса второй метод класса. Будет ли работать этот @Retryable? #

76. Нужно написать клиентский сервис. Что бы ты писал в части строки запроса, или в ресурсах, property, yaml? Как бы указывал, что нужно сделать обращение к интеграции? #

77. Мы реализовали сервис. Наша задача в нем реализовать функционал, который будет говорить о том, что сервис жив. Какие идеи? #

78. Ты хочешь поднять локально БД. Она хранится в контейнере. Что нужно прописать, чтобы данные в БД не потерялись при дропе контейнера? #

79. У тебя один микрос должен сохранять в две БД. Помимо Outbox, как еще можно реализовать, контролировать? #

80. Есть сервис. Мы его масштабируем в K8s. Это же может привести к проблемам. Каким? #

81. Ты сделал REST API для пагинации с выводом еще общего кол-ва страниц. Какие параметры ты бы выставил на вход? Или вообще никакие параметры не нужны? #

82. Идемпотентный POST. Как будешь в коде проверять? К тебе приходит на создание сущность. Что будешь с ней делать? #

83. С мобильного интернета хочешь оплатить домашний интернет. Нажимаешь кнопку Оплатить. С мобильной сетью неполадки, происходит Сетевая Ошибка. Еще раз нажимаешь Оплатить, еще раз отправляется запрос. И запрос обрабатывается 2 раза, ты 2 раза оплачиваешь домашний интернет. Это норм? #

84. У тебя есть какой-то вызов, тебе надо прикрутить Retry, чтобы при определенных ошибках еще раз вызывал сервис. Как это сделать? #