• Актуальна ли еще модель акторов ( AKKA, Vert.X) или можно обойтись средствами Spring 5/Spring Boot 2 + Kafka?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Spring
    Седой и строгий
    Spring и Akka решают разные проблемы. Нет никаких препятствий к тому, чтобы использовать их вместе в одном приложении.

    Что касается примера, когда стоит рассмотреть использование Akka: Представьте, что у вас есть международный банк. А у банка есть сложная скоринговая система, состоящая из множества подсистем. Одни подсистемы оценивают что, как часто и на какие суммы покупал клиент в прошлом. Другие оценивают источники, суммы и частоту пополнений карты. Третьи оценивают наличие имущества, суммы налогов и своевременность их уплаты. Четвёртые наличие страховок и возникновение страховых случаев. Пятые наличие кредитов в других банках. И т.д. и т.п. Каждая подсистема жрёт кучу ресурсов в процессе обработки одного клиента. Некоторые из них делают запросы к внешним сервисам, которые могут отвечать медленно или вообще не ответить. А обрабатывать надо десятки миллионов запросов в секунду. Желательно в реалтайме. И ни в коем случае не допускать сбоев. Да ещё и структура нагрузки постоянно меняется. Такое чудовище можно написать используя только spring-проекты, но притомишься обеспечивать производительность, масштабирование и устойчивость к сбоям. А вот Akka позволит сравнительно легко размазать систему по сотням серверов в нескольких ДЦ по всему миру.
    Ответ написан
    5 комментариев
  • Актуальна ли еще модель акторов ( AKKA, Vert.X) или можно обойтись средствами Spring 5/Spring Boot 2 + Kafka?

    Sputterspark
    @Sputterspark
    Каждый раз, когда читаю твои вопросы, сразу вспоминается поговорка "Слышал звон, да не знает, где он." Каждый раз в кучу оказываются смешаны несвязанные или слабосвязанные понятия и всё это обильно приправлено огульными сравнениями мягкого с тёплым.

    Конечно читал про реактивное программирование, как я понимаю, это когда клиент посылает request, его принимают, клиент продолжает заниматься другими своими делами, через некоторое время клиенту приходит response.

    Ты даже близко не понял сути.

    Реактивное программирование - это парадигма программирования, ориентированная на потоки данных и распространение изменений.
    Модель акторов - это парадигма программирования, хорошо подходящая для разработки конкурентных и распределённых систем.

    Они между собой даже не связаны. Можно разработать реактивную программу не использующую акторы. Можно разработать не реактивную программу на акторах. И конечно же можно разработать реактивную программу на акторах.

    актуальна ли еще AKKA

    Да, актуальна.

    Vert.X ( я так понимаю что это конкурент AKKA который вдобавок хорошо интегрирован с Hazelcast) ?

    Vert.X - не конкурент Akka. Они вообще разного поля ягоды. Vert.X - это очередной асинхронный фреймворк. Если сравнивать, то самый близкий аналог - Spring WebFlux.

    То есть когда мне вот прямо необходимо ее использовать и скажем реактивные средства Spring 5/Spring Boot 2, Kafka или RabbitMQ вообще не вариант?

    Вот как начнёшь различать разработку web-приложений и распределённых систем, так можно будет и подумать об Akka.
    Ответ написан
    8 комментариев
  • Как хранить архитектуру системы?

    @kn0ckn0ck
    Продюсер
    Я рекомендую архитектуру описывать при помощи PlantUML, преимущества:
    1. это настоящий UML
    2. это модель через текст - видим картинку, но всегда можем отредактировать, не нужно идти в тул, где нарисовали и искать там.
    3. это бесплатно и поддерживается многими вики или инструментами совместного создания документации

    А вот пример, как это должно выглядеть:
    5be3c8349639c173929534.png
    Ответ написан
    2 комментария
  • По каким полям не рекомендуется делать индексов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Если в поле чаще пишут, чем по нему ищут, и если в нём мало уникальных значений.
    Ответ написан
    2 комментария
  • Когда использовать Netty/Jetty а когда не париться и юзать Tomcat?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Tomcat
    Седой и строгий
    Прежде всего, Jetty вы зря поставили в один ряд с Netty. Совсем разного поля ягоды. Jetty - это web-контейнер. Netty - фреймворк для разработки асинхронных приложений. Jetty используется, когда нужен маленький и простой web-контейнер. Часто как встроенный web-сервер. Netty в основном для разработки восокопроизводительных серверов. Причём необязательно web-серверов.

    Если же сравнивать Jetty и Tomcat, они полностью взаимозаменяемы. Обычно, Jetty используют для самостоятельных приложений, упакованных в один jar-файл. А Tomcat тогда, когда вам нужно обслуживать несколько десятков приложений, упакованных в war-файлы. Но можно и наоборот.
    Ответ написан
    Комментировать
  • Как DNS различает сайты на 1м IP-адресе, виртуалке? Как отличает поддомены от домена?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    на запрос test.ru не выдается sub.test.ru

    выдается, если криво настроен

    гугли заголовок host:
    Ответ написан
    Комментировать
  • Как DNS различает сайты на 1м IP-адресе, виртуалке? Как отличает поддомены от домена?

    @ShamblerR
    Это костыль на всех веб серверах, он разбирает сайт не по IP:PORT а и через http рефери.
    По сути читая заголовок, и подставляя конфиг под него .
    Ответ написан
    1 комментарий
  • Пул соединений, с какой целью? Что такого тяжеловесного в пересоздании?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    1. Создание tcp-соединения медленное;
    2. Создание tls-соединения ещё медленнее;
    3. Установка соединения протокола уровня приложения ещё медленнее;
    4. Аутентификация подключения на порядок медленнее;
    5. Создание сессии для соединения системой управления базами данных такая же медленная;
    6. Завершение сессии и освобождение ресурсов медленное;
    7. Закрытие соединение относительно быстрое, но тоже не мгновенное.

    Если 500 раз в секунду соединение создаётся, через него выполняется один простой запрос, и соединение закрывается, то СУБД и клиент часть пропускной способности тратят на выполнение бессмысленных действий. Намного разумнее один раз открыть соединение, прогнать через него два миллиона запросов и только потому может быть закрыть.
    Ответ написан
    Комментировать
  • В чем SSH туннель защищеннее, чем просто SSH?

    @stul5tul
    Простое подключение SSH - это только протокол для специальных инструментов - терминал, передача файлов.

    А тунель - это для любого софта годится, протокол значения не имеет - хоть почту гоняй через него, хоть браузер (сайты смотри).

    К степени защиты это отношения не имеет.
    Ответ написан
    2 комментария
  • Возможет ли отрицательный хешкод и расширение капасити при плохом хешкоде? А также как соотносится хешкод с адресом?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Во-первых, важно определиться с тем, что генерируемый по умолчанию хэш не соответствует требованиям к хорошему хэшу. Поэтому метод hashCode всегда надо переопределять в своих классах. Во-вторых, важно понимать, что способ генерации хэшкода по умолчанию не оговорен в спецификаций Java, а потому может отличать в разных реализациях виртуальной машины или даже в разных версиях одной и той же реализации. Я дальше буду писать про HotSpot.

    Несмотря на то, что в документации написано, что генерируемый по умолчанию хэш - "this is typically implemented by converting the internal address of the object into an integer", этот internal address не имеет никакого отношения к положению объекта в памяти. Попробуем разобраться откуда он берётся. Для этого заглянем в исходный код Object. Как видно, hashCode() - это нативный метод, а значит придётся покопаться в сишном коде. Находим его определение:
    JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
      JVMWrapper("JVM_IHashCode");
      // as implemented in the classic virtual machine; return 0 if object is NULL
      return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
    JVM_END

    Ага, хэшкод генерирует функция ObjectSynchronizer::FastHashCode(). Посмотрим, что в ней. Интересная часть:
    mark = monitor->header();
    ...
    hash = mark->hash();
    if (hash == 0) {
      hash = get_next_hash(Self, obj);
    ...
    }
    ...
    return hash;

    Функция пытается получить хэш из заголовка объекта, а если его там нет, то генерирует вызовом get_next_hash. В этой функции определяются несколько методов генерации хэша. В HotSpot шестой и седьмой версии использовался первый - генерация случайного числа. Вообще ни разу не internal address! С восьмой версии используется пятый - "Marsaglia's xor-shift scheme with thread-specific state". Почитать про этот алгоритм можно здесь. Если отбросить нюансы, опять случайное число, не internal address.

    Если я переопределю хешкод и он иногда ( или всегда, например -1) будет выдавать отрицательные целые, что будет? Очевидно это число как-то преобразуется под капотом? потому что должен выдаваться номер бакета?

    Заглядываем в исходный код HashMap
    if ((p = tab[i = (n - 1) & hash]) == null)
      tab[i] = newNode(hash, key, value, null);

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

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

    P.S. Виртуальная машина Zing генерирует хэшкоды по умолчанию на основе адреса объекта в памяти.
    Ответ написан
    4 комментария
  • Отличие спецификации от технического задания?

    @awesomer
    есть "требования к системе" - это черновик ТЗ, предварительные прикидки, на основании которые и делается ТЗ.

    а спецификация - это типо умное слово, которое просто употребляют.
    в контексте ТЗ значения не имеет.
    что именно они под этим имеют ввиду - нужно уточнять отдельно, у них же, это местячковый диалектизм.

    спецификация - это технические характеристики готового изделия.
    например, для автомобиля - мощность двигателя, длина, вместимость - это части спецификации.
    Ответ написан
    6 комментариев
  • Сервлеты, многопоточность, как устроено?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    При запуске Tomcat создаст пул потоков и экземпляр сервлета. При поступлении запросов методы сервлета будут запускаться на потоках из пула. Сервлет не уничтожается до окончания работы сервера.

    Потоки можно создавать самостоятельно, но зачем? Особенно при использовании Spring, который предоставляет целую кучу удобных высокоуровневых абстракций для удобной работы с асинхронными задачами.

    С кэшированием надо крайне аккуратно, так как это как раз та область, в которой можно нарваться на проблемы многопоточности.
    Ответ написан
  • Асинхронность Node.js против Java, в чем подвох?

    Тогда вопрос, каким таким чудесным образом Node это избегает? Если можно на пальцах объясните, пожалуйста,как там все происходит


    Синхронно: приняли запрос, обрабатываем: что-то там считаем, нужна инфа с базы/файло? - Ждем, пока ждем все висит мертвым грузом, получаем, что-то еще считаем, выдаем результат, принимаем следующий запрос.
    Асинхронно: приняли запрос, обрабатываем: что-то там считаем, нужна инфа с базы/файло? - Не ждем, переходим к следующему запросу. Как только нужная инфа пришла - возвращаемся к невыполненному запросу, досчитываем недосчитанное, выдаем результат, переходим к следующему запросу.

    Ну асинхронная она, но запрос то должен кто-то делать? Кто его делает?


    Пользователь. Веб сервера обслуживают запросы от пользователей. При попытке посмотреть, например, эту страницу, ваш браузер отправляет веб-серверу запрос
    HOST: toster.ru
    GET: /q/500685

    Получает ответ, содержащий html, парсит html, узнает, что ему нужно еще запросить: css-стили, js-скрипты, изображения и аналогично запрашивает их. И так далее...

    Ну и вообще, цитата выше, это правда? или просто агитация за ноду?


    И правда, и неправда одновременно. Правда в том, что Node действительно так работает. Неправда же заключается в том, что ничто не мешает на Java/C/C#/Go/Python/даже, при большом желании, на php написать приложение, которое будет обрабатывать пользовательские запросы точно так же.
    Ответ написан
    8 комментариев
  • Java ( с либами ) против Node.js, что выбрать для вебсервиса?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    В Spring 5 есть WebFlux, который работает поверх Netty. А Netty это такой замечательный асинхронный фреймворк, про который один из инженеров Netflix'а писал, что у них один инстанс держит в среднем 20 000 одновременных соединений, пропуская через себя 40 Гбит/с трафика. На хабре ещё была статейка про написанную на Netty систему управления IoT-устройствами, которая обрабатывает 980 000 соединений с секунду, работая при этом на двух DO'шных VPS'ах за 20 и 40 баксов в месяц.
    Ответ написан
    2 комментария