Масштабируемость - это очень широкий термин здесь.
Я думаю, что причина может заключаться в том, что эти платформы сильно поощряют программирование к интерфейсу и сборку приложения из нескольких слабосвязанных компонентов. Они также предоставляют контейнеры , которые могут прозрачно связывать компоненты независимо от сети и т. Д.
Это позволяет распределять компоненты (и, следовательно, загружать) по нескольким серверам или прозрачно отправлять похожие задачи на несколько серверов . Другими словами, вы можете начать с очень простого приложения, которое помещается в одну банку, но позже, если вы решите уменьшить масштаб, вам не нужно менять намного больше, чем конфигурацию контейнера (пути поиска и т. Д.).
Они также предоставляют множество удобных "инструментов" или функций, которые обычно легко комбинируются и используются вместе с минимальными усилиями. Простые в настройке серверы приложений или контейнеры, также обеспечивающие пулы соединений и управление транзакциями, мониторинг и т. Д. Обмен сообщениями. Таймеры. Объектно-реляционное отображение. Безопасность. И так далее.
Еще одним преимуществом этой архитектуры является расширяемость . Если вы решите, что вам нужно ввести что-то новое (например, кэширование или фоновые вычисления), изменения в существующем коде обычно минимальны. Очень часто вы можете просто изменить компонент другой реализацией того же интерфейса.
Такой код также намного проще для тестирования и более удобен в обслуживании. Слабосвязанные компоненты очень хорошо защищены автоматическими модульными тестами.
Это очень широкое и поверхностное описание, каждая тема может занять целую книгу, чтобы подробно объяснить (и большинство из них делают).