Какой язык выбрать для создания своих микросервисов?!
В мире IT существует бесконечное множество языков программирования. У каждого из них есть свои плюсы. Одни языки программирования накопили огромную кодовую базу, которая позволяет решить абсолютно любую задачу. Другие обладают уникальными характеристиками — быстродействие, нетребовательность к ресурсам, совместимость со множеством операционных систем и аппаратных платформ.
Исторически в нашей компании накоплен большой опыт разработки на Java. И, опираясь на него, для создания экосистемы цифровой трансформации Digital Q мы сделали выбор в пользу Spring Boot. Продукты, создаваемые на этой базе, имеют большое количество преимуществ:
- легкость разработки
- гибкость в используемом окружении
- множество поддерживаемых технологий и т. д.
Но при всех преимуществах, были и недостатки:
- повышенное потребление памяти контейнером
- время старта приложения - десятки секунд
При условии, что в решении могут быть тысячи микросервисов, сильно повышаются требования к аппаратной составляющей проекта.
В качестве эксперимента, для снижения этих требований мы сделали альтернативную версию одного из наших сервисов на языке Golang. Мы постарались воспроизвести основной функционал, поддерживаемый в исходном сервисе: rest api, работу с Kafka, логирование в ELK, заложили возможность работы с разными СУБД и т. д.
И сравнили полученный сервис c исходным в одинаковом окружении, при выполнении одинаковых задач:
· время старта Go – менее 1 секунды против 70 для Spring Boot (сервер был слабенький, но на наглядность это не повлияло);
· оперативная память, используемая в работе контейнера, – 15 Мб против 815 Мб;
· быстродействие REST API и время обработки сообщения Kafka оказалось сравнимым: где-то GO чуть быстрее, где-то Java.
Полученный результат нас очень заинтересовал. Было решено двигаться в сторону внедрения Golang в производство, поддерживать его во всех производственных процессах. На текущий момент с его помощью мы реализуем различные вспомогательные сервисы, необходимые для работы продуктов.
Spring Boot – общепризнанный фреймворк на основе Java с открытым исходным кодом.
Go, или Golang, – компилируемый многопоточный язык программирования с открытым исходным кодом.
А если так?
https://habr.com/ru/company/otus/blog/503328/
Так тоже пробовали, с GraalVM ситуация немного другая. С точки зрения характеристик - приложение стартует моментально, потребляет памяти на треть меньше от оригинала. Но время сборки проекта растет в 10 раз. Далеко не каждый сервис можно безболезненно перевести - самые проблемы возникают. Ключевое - в момент разработки для отладки удобней использовать обычную jdk, а на стенде же работает graalvm. Что потенциально может привести к неповторимым ошибкам.
Для себя решили - что graalVM можно будет использовать точечно, для конкретных сервисов, которые нужно будет масштабировать в десятки экземпляров.