Одноранговый сервер состояний ASP.NET
ОГЛАВЛЕНИЕ
Данная статья раскрывает распределенную реализацияю службы состояний ASP.NET
Введение
Веб-разработчики ASP.NET имеют три встроенных средства для сохранения состояния сеанса, а именно: внутрипроцессная память, сервер SQL и сервер состояний.
Внутрипроцессная память обеспечивает наибольшее быстродействие, но не подходит для использования в пуле веб-серверов, так как данные сеанса хранятся в памяти работающего процесса ASP.NET.
Сервер SQL – средство хранения состояния сеанса вне процесса, работающее с пулом веб-серверов. Он хранит данные сеанса в базе данных сервера SQL. Это самый надежный вариант, но наименее быстродействующий. Главная проблема данного варианта в том, что очень часто разработчики хотят кэшировать данные, извлеченные из базы данных в состоянии сеанса, чтобы уменьшить поиск по базе данных. Состояние сеанса сервера SQL разрушает эту цель, так как кэширование в базе данных извлеченных из нее же данных не повышает быстродействие.
Сервер состояний - средство хранения состояния сеанса вне процесса, работающее с пулом веб-серверов. Он сохраняет данные сеанса в памяти и обеспечивает большее быстродействие, чем сервер SQL. Он представляется хорошим компромиссом между внутрипроцессным вариантом и вариантом сервера SQL. Однако он имеет несколько недостатков.
Во-первых, несколько веб-серверов обычно зависят от одного сервера состояний в состоянии сеанса, что вводит критическую единую точку отказа.
Во-вторых, в среде выравнивания нагрузки балансировщик нагрузки может перенаправить запрос пользователя веб-серверу, отличному от веб-сервера, обслужившего предыдущий запрос пользователя. Если новый веб-сервер связывается с другим сервером состояний, исходное состояние сеанса пользователя не будет найдено, и веб-приложение может работать неправильно.
Данная проблема возникает даже в постоянных («липких») балансировщиках нагрузки ошибочно или из-за сбоя сервера.
В-третьих, проблема, о которой многие разработчики не знают, состоит в том, что веб-сервер и сервер состояний общаются на незашифрованном тексте. Перехватчик легко может захватить данные о состоянии сеанса, перемещающиеся по сети. Это может не быть угрозой, если все серверы работают во внутренней сети, но, безусловно, является основанием для тревоги, когда веб-серверы и серверы состояний разбросаны по интернету.
Одноранговый сервер состояний ASP.NET, представленный в данной статье, решает вышеуказанные проблемы, в то же время явно заменяя сервер состояний, предоставленный Microsoft.
Краткое описание
В основе однорангового сервера состояний лежит простая идея – позволить серверам состояний в сети безопасно общаться и при необходимости передавать друг другу данные о состоянии сеанса, как показано ниже.
Данная схема повышает масштабируемость, так как веб-серверы могут совместно использовать несколько серверов состояний, устраняя единую точку отказа. Более того, если балансировщик нагрузки ошибочно или намеренно перенаправит пользователя на другой веб-сервер, присоединенный к отдельному серверу состояний, состояние сеанса пользователя будет запрошено у сервера состояний, обслужившего предыдущий запрос пользователя.
Безопасность также повышается, так как одноранговые узлы сети могут быть настроены на шифрование данных сеанса во время совместного использования состояния сеанса. Передачи данных между веб-сервером и сервером состояний остаются нешифрованными, но атаки по перехвату данных можно исключить, держа веб-серверы и связанные с ними серверы состояний в защищенных сетях или на одном и том же компьютере.
Одноранговый сервер состояний полностью совместим с предыдущими версиями сервера состояний, предоставленного Microsoft, и включает в себя все упомянутые ранее преимущества.