Як відрізняється багатопотоковість у веб-додатку на базі Java порівняно з окремим додатком Java


13

Я досить новачок у Java, і мій досвід обмежений веб-додатками, що працюють на веб-контейнері (у моєму випадку Jboss).

Чи правильно я кажу, що для веб-додатків веб-контейнер піклується про багатопотоковість? Якщо так, чи можна вводити нові протектори у веб-додатки? Чи є якась перевага в цьому і в якому сценарії потрібно було б це зробити?


До EE6 не потрібно використовувати нитки; EE7 представляє Concurrency Utilities.
Відновіть Моніку - М. Шредер

Відповіді:


20

Чи правильно я кажу, що для веб-додатків веб-контейнер піклується про багатопотоковість?

Більшість веб-серверів (Java та в іншому випадку, включаючи JBoss) дотримуються моделі "один потік на запит", тобто кожен HTTP-запит повністю обробляється точно одним потоком. Цей потік часто витрачає більшу частину часу на очікування таких речей, як запити БД. Веб-контейнер створить нові потоки за необхідності.

Деякі сервери (в екосистемі Java в першу чергу Netty ) виконують асинхронну обробку запитів, або за допомогою моделі «один потік робить все», або чогось більш складного. Основна ідея полягає в тому, що, маючи багато ниток очікування, витрачає ресурси, тому робота асинхронно може бути ефективнішою.

Якщо так, чи можна вводити нові протектори у веб-додатки?

Це можливо, але слід робити це дуже обережно, оскільки помилки (наприклад, витоки пам'яті або відсутність синхронізації) можуть спричинити помилки, які дуже важко відтворити, або збити весь сервер.

Чи є якась перевага в цьому і в якому сценарії потрібно було б це зробити?

Ну, перевага в тому, що ви можете робити речі паралельно. Використання потоків для покращення чистої обчислювальної швидкості - це те, що ви не повинні робити на веб-сервері, оскільки це уповільнить обробку інших запитів. Такі речі слід робити на окремому сервері, ймовірно, використовуючи якусь чергу завдань.

Правомірним сценарієм багатопотокової читання в контексті обробки HTTP-запиту може бути, якщо вам потрібно отримати доступ до інших мережевих ресурсів, наприклад, зателефонувати до декількох різних веб-служб. Якщо ви робите це в один тред, вам доведеться чекати, коли кожен дзвінок закінчиться по черзі. Але якщо ви використовуєте кілька потоків, загальний час очікування - це лише затримка одного найповільнішого виклику.


3
Має сенс. Чи найкращий спосіб створити нові теми у веб-додатку ExecutorService Interface?
капікаріон

4
@kapricanon: так, якщо у вас немає певних вимог, з якими він не може впоратися, або у вашого веб-сервера вже є щось подібне.
Майкл Боргвардт

2

У відповідь на ваше запитання:

Як відрізняється багатопотоковість у веб-додатку на базі Java порівняно з окремим додатком Java

Це не відрізняється. Зазвичай на веб-програмах, створених на основі програмного забезпечення, будуть надаватися деякі багатопотокові нитки, роблячи кожен новий запит ниткою. Ви можете використовувати / створювати теми так само, як і будь-який інший додаток.

Дійсно, багаторівнева нарізка може призвести до значного підвищення продуктивності, якщо правильно використовувати. Для інтенсивних завдань вводу / виводу, таких як доступ до мережі та доступ до дискового диска, підвищення продуктивності майже завжди гарантується. Для обчислювально інтенсивних завдань слід дотримуватися правила одного потоку на ядро ​​на сервері. Наприклад, якщо у вашому ядрі є процесор i7, вам слід дотримуватися 7 потоків, щоб виконувати обчислювальні завдання.

У відповідь на ваше запитання:

Чи є якась перевага в цьому і в якому сценарії потрібно було б це зробити?

Майкл Боргварт каже, що не слід робити цього для покращення обчислювальної швидкості. Я не погоджуюсь, оскільки ця стаття передбачає, що багатопотокова передача може допомогти забезпечити чуйність, коли користувачі потребують обчислювально важкого завдання. Простий англійською мовою користувачам не доведеться чекати, щоб виконати обчислювально важкі завдання з багатопотоковою нарізкою.

Якщо ви збираєтесь багато використовувати теми, пропоную використовувати пул потоків. Це зменшить накладні витрати на створення ниток.


як це відповідає на поставлене запитання?
гнат

1
Відповіді мають базуватися на власних заслугах. Якщо ви хочете прокоментувати, вам потрібно спочатку заробити 50 балів репутації.
ChrisF

1

Ну, це приємне питання, і я думаю, що більшість розробників, які працюють у розробці веб-додатків, не використовують багатопотоковість явно. Причина цілком очевидна, оскільки ви використовуєте сервер додатків для розгортання програми, сервер додатків внутрішньо управляє пулом потоків для вхідних запитів.

Тоді навіщо явно використовувати багатопотоковість? Що потрібно розробнику веб-додатків піддавати себе на багатопотоковість?

Коли ви працюєте над широкомасштабним додатком, де вам доведеться одночасно подавати багато запитів, важко синхронно обслуговувати кожен вид запиту, оскільки певний тип запиту міг би багато обробляти, що може знизити ефективність вашої програми.

Візьмемо приклад, коли веб-додаток після обслуговування певного виду запитів повинен сповіщати користувачів електронною поштою та SMS. Це синхронно з потоком запиту може знизити продуктивність вашого веб-додатку. Отож, тут виходить роль багатопрофільної читання. У таких випадках доцільно розробити окрему багатопоточну програму через мережу, яка відповідає за надсилання електронної пошти та SMS.


чому ця відповідь спростована?
Анураг Шарма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.