2013-06-30 3 views
4

У меня есть приложение, которое было запрограммировано с кодом MVC/EF First. Он выполняет большую часть обработки на стороне сервера и довольно ресурсоемкий.Масштабирование приложения платформы Entity Framework/нескольких приложений, попавших в одну базу данных?

Я знаю, как настроить балансировку нагрузки, но я хочу знать, как масштабировать приложение EF так же просто, как создание нового сервера, развертывание приложения и указание на кластер БД - или есть ли какие-либо проблемы, которые я буду что касается нескольких приложений EF, попавших на тот же сервер баз данных?

Я не могу найти никаких советов и руководств для этого, и я беспокоюсь, что сделал неправильный выбор, выбрав EF над чем-то более простым или более прямым!

+1

Для исполнения: это зависит от того, где узкое место. Если у вас есть один запрос, который особенно дорог для запуска, и он должен запускаться несколько раз, то распространение этих исполнений в нескольких экземплярах DB могло бы быть способом. Но если у вас много легких запросов, и большая часть времени проводится внутри вашего приложения, то кластер БД не поможет. Если вы этого еще не сделали, попробуйте профилировать ваше приложение и посмотрите, сколько процентов времени потрачено на ваш код, а не на внешний код и внешние ресурсы (база данных, вызовы веб-сервисов). –

+0

Но на более фундаментальном уровне одной из сложностей обращения с несколькими экземплярами приложения MVC является управление состоянием. Например. Если вы сохраняете некоторую информацию о запросе следующей страницы в памяти, но пользователь получает баланс нагрузки на другой сервер ... Как этот сервер знает о том, что первый сервер получил в памяти? –

+0

@ te.speot.is - Проблема в значительной степени связана с I/O ... Приложение не намного больше, чем API ... У меня есть клиенты, которые отправляют большие запросы, содержащие большое количество данных, и мое приложение должно процесс/сортировка/фильтр перед хранением в БД ... Мне нужно поддерживать еще много клиентов и просто хочу узнать о масштабировании EF/Я беспокоюсь о том, что произойдет, когда обе передние концы должны будут записываться в одну и ту же таблицу. – Wil

ответ

3

... проблемы ... относительно нескольких приложений EF, попавших на тот же сервер баз данных?

Пересмотрите вопрос о том, что ваше приложение представляет собой приложение на основе ASP.NET MVC. Наличие нескольких экземпляров этого, вероятно, приведет к появлению призрака государственного управления.

MSDN имеет очень хорошее введение в why this is an issue:

HTTP является протоколом без. Это означает, что веб-сервер обрабатывает каждый HTTP-запрос для страницы как независимый запрос. Сервер не знает значений переменных, которые использовались во время предыдущих запросов. Состояние сеанса ASP.NET идентифицирует запросы из одного и того же браузера в течение ограниченного времени в виде сеанса и предоставляет возможность сохранять значения переменных в течение всего сеанса. По умолчанию состояние сеанса ASP.NET включено для всех приложений ASP.NET.

Альтернативы состояния сеанса включают в себя следующее: состояние

  • Применение, в котором хранятся переменные, которые могут быть доступны всем пользователям приложения ASP.NET.

Эта точка является чрезвычайно распространенным способом хранения состояния, но ломается, когда есть несколько экземпляров приложения вовлеченное (состояние «видит» только один из экземпляров).

Обычно это работает с использованием StateServer или SQLServer значения SessionStateMode. В той же статье приводится довольно хорошее резюме каждого варианта (акцент мой).

  • StateServer режим, который хранит состояние сеанса в отдельном процессе, называемом государственную службу ASP.NET. Это гарантирует сохранение состояния сеанса при повторном запуске веб-приложения , а также состояние сеанса доступа к нескольким веб-серверам в веб-ферме.

  • SQLServer режим сохраняет состояние сеанса в базе данных SQL Server. Это гарантирует сохранение состояния сеанса при повторном запуске веб-приложения , а также состояние сеанса доступа к нескольким веб-серверам в веб-ферме.

Если ваше приложение является лицом без гражданства, это спорный вопрос.

Я волнуясь, я сделал неправильный выбор, выбрав EF

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

Вот базовый сценарий: скажем, ваше приложение отправляет приветственные письма пользователям по расписанию.

Учитывая таблицу Users:

UserId | Email   | WelcomeLetterSent 
-------+-----------------+------------------ 
    1 | [email protected] | 0 

И некоторые псевдо-код:

foreach (var user in _context.Users.Where(u => !u.WelcomeLetterSent)) 
{ 
    SendEmailForUser(user); 
    user.WelcomeLetterSent = true; 
} 

_context.SaveChanges(); 

Там в race condition, где оба экземпляра один и экземпляр два из вашего приложения может одновременно оценить _context.Users.Where(...), прежде чем любой из них имеет возможность установить WelcomeLetterSent = true и позвонить по номеру SaveChanges. В этом случае два приветственных письма могут быть отправлены каждому пользователю, а не одному.

Параллелизм может быть коварной вещью. Есть руководство по управлению параллелизмом с Entity Framework над here, но это только верхушка айсберга.

Ответ на ваш вопрос? Это зависит от того, что делает ваше приложение :)

Кроме того, я в идеале хочу создать некоторые «дополнительные» приложения поддержки, которые подключаются к одному и тому же БД ... и я просто не уверен, как EF будет обрабатывать несколько приложений в одном и том же БД ....

Если ваше приложение может терпеть несколько экземпляров самого себя, обращаясь к одной базе данных, то обычно это не так, чтобы заставить эти «поддерживающие приложения» играть хорошо. Совсем не так, отличается ли параллелизм от нескольких экземпляров одного приложения или нескольких приложений с одним экземпляром каждый.

+0

Вы не упомянули EF Migrations. Как вы можете выполнять миграции, не опуская всех серверов? – Kugel

+0

@ Кугель Возьми их всех. OP не требует наличия 100% доступности. –