LINUX.ORG.RU

на чем лучше писать монолитный бекенд (RestAPI)

 , , , ,


0

2

всем привет суть такова, что мне нужно писать монолитный бекенд в котором есть:

  • Rest API (возможно GraphQL)
  • Angular/React Static Files
  • Broadcast/Multicast
  • Web Sockets
  • Internal Cron
  • PostgreSQL/MySQL

проблема в том что, мне потом нужно этот проект скомпилоровать и загрузить клиентам на серверах, нужно чтобы проект был бинарным

сеичас я делаю так, пишу бекенд на ноде (NestJS), думаю он более менее подходит для Enterprise, и его архитектура тоже нравитья. Потом я компилирую проект с помошью пакета «zeit/pkg», и получаю bin файл, который могу запустить на линуксе, но не думаю, что это хорошее решение для Enterprise. к тому же еще одна проблема такого подхода что конечный бинарный файл выходит 350MB.

сейчас я думаяю над этими языками, исключаю скриптовые языки, потому что с ними одна беда, когда дело доходит до защити:

  • Java (Spring)
  • GoLang
  • Rust

какой язык программирования вы бы могли посоветовать для таких целей?



Последнее исправление: cardinaltm (всего исправлений: 7)

Если прям очень хочется обмазаться промышленными паттернами, то только Spring. Если просто нужно нормальное ООП, то попробуй Crystal.

anonymous
()

Ближе всего по идеологии того, что натащили в современный js и ноду в том числе, тебе бы подошла джава и спринг. Остальные два будут для тебя казаться 1) странным С 2) инопланетным С++.

anonymous
()

Если тебе нужно отдавать клиентам бинарник - только си и плюсы, возможно раст. Всё у чего есть вм вскрывается без проблем.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

разве любой C-шний код нельзя вскрыть через ассемблер, раньше такое практиковал и без проблем, но суть вопроса не в защите, а в том что бы была нормальная платформа для средних и больших проектов, с возможностию компилировать а писать на C/C++ 400 endpoints дело такое…

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

Можно, но толку? Логику оттуда восстановить будет довольно сложно. Хотя если вопрос только в галочке валидна лицензия или нет то да - без разницы.

ya-betmen ★★★★★
()
Ответ на: комментарий от anonymous

на счет Java Spring пугает только одно, это производительность, так как с ним я не работал, все говорят что с ним есть проблемы может кто подскажет какая мащина нужна для 1000 реквестов в течениий 5-10 секунд

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

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

anonymous
()
Ответ на: комментарий от cardinaltm

Из всего можно, как раз логику и можно восстановить, реализацию нельзя, а поведение можно.

anonymous
()
Ответ на: комментарий от anonymous

да, думаю все сводится к Java, а Go больше для микросервисов подходит

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

.jar это zip архив, можешь даже пользоваться утилитой jar из поставки JDK как tar’ом: jar -xvf src.zip; jar -cvf dst.zip ./source/

В jar лежат класс файлы содержащие байткод. Компиляция байткода обходится без оптимизаций (jvm в момент исполнения делает оптимизации), классфайлы содержат описание методов, полей, констант, все это читается JVM и позволяет делать «магию» типа динамических прокси, инжекта зависимостей и т.д.

Для скрытия логики в жабе пользуется обфускаторами, например ProGuard.

По производительности не знаю. Вообще сейчас модно делать все на Go, после сборки получается простой исполняемый бинарник, ненужно отдельно поставлять рантайм. Правда бинарники у Go огромные, потому как рантайм уже вкомпилен. Можно конечно было бы вспомнить GraalVM но не буду, комьюнити у нее пока небольшее, не сравнится с go, у go наверное для всех граблей можно быстро найти информацию.

anonymous
()
Ответ на: комментарий от anonymous

Кроме быстрой (кросс)компиляции у go никаких достоинств нет. Архитектурно это адок уровня php4. Ничего даже отдаленно напоминающего spring или хотя бы rails, там нет и быть не может.

anonymous
()

провела некоторые тесты и вот результаты: ответ был : {«status_code»: 404, «message»: «Method not found»} HttpStatusCode: 200

Golang: AVG: 36939 req/s, 185k requests AVG 45188 req/s, 226k requests

Java Spring: AVG: 12196 req/s, 61k requests, 187 errors AVG: 12717 req/s, 64k requests, 152 errors

NodeJS: AVG 10148.4 req/s 51k requests AVG 11621.6 req/s 52k requests

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

вот нода с кластером:

NodeJS Cluster: AVG: 26727.2, 134k requests | AVG: 27870.4, 139k requests

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

Даже интересно, что у тебя получится в Play/Scala (или хотя бы в Play/Java).

Miguel ★★★★★
()

нужно чтобы проект был бинарным

беда, когда дело доходит до защити

Так тебе бинарник нужен только ради того, чтобы исходники не раскрывать? Тогда не парься делай как делаешь.

бинарный файл выходит 350MB

не думаю, что это хорошее решение для Enterprise

Как раз таки очень ытерпрайзненько.

no-such-file ★★★★★
()
Ответ на: комментарий от cardinaltm

Вплоть до получения компилябельного кода.

ya-betmen ★★★★★
()

а есть люди, кто делал монолит на Go, просто ради интереса, какой стек использовали?

«Так тебе бинарник нужен только ради того, чтобы исходники не раскрывать? Тогда не парься делай как делаешь.» к слову, когда в такой bin файл заглянул в нутри то обнаружил V8, и в дополнении исходный код самых node_modules, а свою логику нет, сейчас дали на проверку профессионалу, посмотрим что получится))

«Как раз таки очень ытерпрайзненько.» это на первый взгляд, тащить 1500 node_modules, не очень приятно, так скажем..

cardinaltm
() автор топика

Deno же, более продуманный и безопасный node.js c Typescript и Rust от создателя node.js.

enso ★★★★★
()
Ответ на: комментарий от Im_not_a_robot

да скорее всего для этого, но все рекомендуют его использовать в микросервисах, к сожалению у меня нету информации насчет монолита. (не всегда нужны микросервисы, особенно в моем случае) если я не ошибаюсь Docker и Kubernetes это те самые большие монолити со своими rest api.

возможно такая рекомендация связана с тем что, в Go нету нормальной архитектуры как на пример в Spring или в другом популярном фреймворке.

«Deno же, более продуманный и безопасный node.js c Typescript и Rust от создателя node.js.»

насчет Deno, он пока очень сырой, использовать его в продакшене пока очень рано, и опять же это возвращение к JS.

cardinaltm
() автор топика

Мой выбор - elixir, либо go на худой конец.

ddidwyll ★★★★
()

Джаву вскроют так же быстро, как байткод питона. Раст говно. Советую го.

dnb ★★★★
()
Ответ на: комментарий от theNamelessOne

А nest и еще 350 мегов из помойки npm сухие? Против жавы конечно это все детские поделки. Но ТС хотел узнать какие варианты компилируемой вебни бывают. Crystal как раз и создан вебельщиками для вебни, используется в продакшне той компанией, что его и делает (https://manas.tech/). Вполне себе enterprise в некотором смысле. По-крайней мере это не поделка сумрачного васяна из 9-го «Б».

anonymous
()
Ответ на: комментарий от anonymous

А nest и еще 350 мегов из помойки npm сухие? Против жавы конечно это все детские поделки

Про npm и Java ничего не скажу, но предлагать писать энтерпрайз на языке с багами в компиляторе, без стабильного релиза, экосистемы и библиотек — это что-то.

theNamelessOne ★★★★★
()

Экосистема Rust уже достаточно развита для подобного веба. Сам использую Rust в веб-разработке, всем доволен. Правда, тут может стать препятствием сам язык: чтобы в него въехать нужно время.

freecoder
()

Ну, если ты нормальный поцан, то пиши на ANSI C. Сразу двух зайцев убьёшь – производительность и переносимость. ЯП со stop the world GC не любят большие приложения, где множество манипуляций с памятью. Т.е. зависит от крупноты твоего монолита. До 100 тыс и меньше посетителей в сутки значения это не имеет.

anonymous
()

На Расте есть опасность умножения на ноль. Жаба слишком жирная. Пиши на Котлине как стильный парень. Или на Го, но туда вот-вот через год подвезут родовые типы (a’k’a generics) и твой код устареет. Хоть и будет работать.

anonymous
()
Ответ на: комментарий от theNamelessOne

Я предлагаю посмотреть, а не писать. Стабильный релиз будет уже в этом году кстати. Баги там активно правят сейчас. Библиотек не будет если не будет юзеров.

anonymous
()

Монолит у меня ассоциируется со старыми добрыми MVC фреймворками, поэтому - python django, Java Spring, Ruby on Rails и заверни в докер, почти что бинарник.

Еще могу посоветовать vert.x там можно использовать и java, kotlin, scala и даже js

Int64 ★★★
()

С#, больше ни начём

anonymous
()

Пиши на спринге и котлине, пользуйся спрингом просто как инструментами из коробки на антресолях. Любая проблема решается гуглением за 3 минуты. Сосредоточишься на приложении, а не на борьбе с фреймворком. Для того, чтобы доставлять клиентам, сможешь собирать докер-образ с помощью https://github.com/GoogleContainerTools/distroless & https://github.com/GoogleContainerTools/jib, будет весить минимально и запускаться везде, где есть докер.

base image distroless-джавы весит меньше 70мб: https://console.cloud.google.com/gcr/images/distroless/GLOBAL/java@sha256:9d4092ba5e1c9dc4d1490fdead1dd7ea5c64e635b729fee11a6af55f51b337f8/details?tab=info

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)

В Golang нормально валидацию типов json не сделать без костылей, сколько ни выделывайся. Точнее, ошибку-то кидать можно, но указать, в каком конкретно поле ошибка - лютый геморрой. В том же Nest по понятным причинам это делается легко и просто.

с ними одна беда, когда дело доходит до защити

Защиты чего? Если твой сервер хакнули, то вообще плевать, гошный бинарь там работает, или скрипты. Никому код не интересен, интересен доступ к данным.

и получаю bin файл, который могу запустить на линуксе

А зачем опакечивать? На сервере можно в NodeJS-контейнере запустить и все. Ну или без контейнеризации ноду воткнуть.

Пиши на NestJS и не парься. Удобный и хороший фреймворк, еще и на тайпскрипте.

dimuska139 ★★
()
  • доступна, всегда без издержек шина
  • во время запроса можно легко сделать и без опаски do..while
  • можно легко делать форки, треды и общаться между процессами без блокировок
  • можно спокойно выполнять job и периодически выдавать в браузер ответы
  • можно масштабировать вертикально/горизонтально
  • есть горячая замена кода
  • иммутабельность из коробки
  • паттерн-матчинг
  • атомы, списки, кортежи
  • декларатив
  • полиморфоность, ООП, наследование
  • java-интерфейсы
  • абстрактные методы
  • одноименные методы с разными сигнатурами
  • примеси
  • хранимый и загружаемый компилируемый динамический код + нестрогая типизация
  • код как данные
anonymous
()

Я правильно понимаю, вы уже что-то написали, а теперь хотите переписать на закрытый код и рассматриваете разные, в том числе, экзотические варианты? Я бы рассмотрел закодированный PHP в ionCube для основной части и С++ для узких мест и функционала, которого нет в PHP. PHP простой популярный язык - куча программистов. С/С++ позволяет написать всё и тоже популярный язык. Кстати, для начала, вам не обязательно переписывать всё в закрытый код, можно переписать только часть с важной логикой и лицензиями. Не думаю, что кому-то будет интересен частично открытый продукт, а это позволить быстрее стартануть. Иначе все грозится закончится переписыванием. Написать продукт это только часть дела, не стоит на этом циклиться. Надо выходить на рынок и находить финансирование на развитие проекта.

DFService
()
Ответ на: комментарий от theNamelessOne

Они почти год стабилизировали Следующая версия будет 1.0

OSBuster
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.