Представьте, что вы хотите создать сервис кэширования.Эта служба кэширования будет независимой от приложений, поэтому вы можете использовать ее со многими приложениями.Вы также хотели бы поддерживать множество различных веб-серверов.
Заметьте, как он находится между сервером и фреймворком?Это пример промежуточного программного обеспечения.Это не логика приложения и не очень низкоуровневая сеть, но она предоставляет услугу где-то посередине.Вот некоторые примеры: QoS (качество обслуживания), безопасность, кэширование, ...
Было бы неплохо, если бы ваш сервис поддерживал все n популярных (и некоторые не очень)-популярные) серверы (тонкие, вебрик).Если вы поддержите их, все больше людей смогут использовать ваше замечательное программное обеспечение.Вы могли заметить, что это будет очень сложно, вам нужно будет поддерживать каждый сервер специальным серверным кодом.
Теперь это только половина проблемы, потому что есть также множество веб-фреймворков.Рельсы - это 500-фунтовая горилла, но есть и другие рамки, такие как Merb и Sinatra .Их поддержка в вашей службе кэширования - это еще одна m поддержка.Теперь вы поддерживаете nxm разных путей.Что за сопротивление.
Введите Стойка .Rack находится между фреймворками и серверами и дает вам интерфейс для кодирования вашего кеширующего сервера.Если серверы и фреймворки поддерживают стойки, а большинство из них поддерживают, ваша служба просто должна поддерживать интерфейс стоек, и вы получаете поддержку для всех фреймворков и сервисов, поддерживаемых стойкой.(Это немного похоже на латексную компиляцию в dvi и затем превращение dvi в ps, pdf, ....).Вам не нужен конвертер из Merb в WEBrick и другой из Sinata в Thin.Если ваша служба кэширования поддерживает стойки, вы изолированы от различий.
С помощью этой «узкой талии», где все m-фреймворки собираются вместе перед разветвлением на n-серверы между приложением и сервером, вы также можете увидеть, как это обеспечивает хорошее место для добавления таких функций, как маршрутизация, ведение журналастатическое обслуживание, которое обходит медлительность вашей интерпретируемой структуры и т. д.