... проблемы ... относительно нескольких приложений 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 будет обрабатывать несколько приложений в одном и том же БД ....
Если ваше приложение может терпеть несколько экземпляров самого себя, обращаясь к одной базе данных, то обычно это не так, чтобы заставить эти «поддерживающие приложения» играть хорошо. Совсем не так, отличается ли параллелизм от нескольких экземпляров одного приложения или нескольких приложений с одним экземпляром каждый.
Для исполнения: это зависит от того, где узкое место. Если у вас есть один запрос, который особенно дорог для запуска, и он должен запускаться несколько раз, то распространение этих исполнений в нескольких экземплярах DB могло бы быть способом. Но если у вас много легких запросов, и большая часть времени проводится внутри вашего приложения, то кластер БД не поможет. Если вы этого еще не сделали, попробуйте профилировать ваше приложение и посмотрите, сколько процентов времени потрачено на ваш код, а не на внешний код и внешние ресурсы (база данных, вызовы веб-сервисов). –
Но на более фундаментальном уровне одной из сложностей обращения с несколькими экземплярами приложения MVC является управление состоянием. Например. Если вы сохраняете некоторую информацию о запросе следующей страницы в памяти, но пользователь получает баланс нагрузки на другой сервер ... Как этот сервер знает о том, что первый сервер получил в памяти? –
@ te.speot.is - Проблема в значительной степени связана с I/O ... Приложение не намного больше, чем API ... У меня есть клиенты, которые отправляют большие запросы, содержащие большое количество данных, и мое приложение должно процесс/сортировка/фильтр перед хранением в БД ... Мне нужно поддерживать еще много клиентов и просто хочу узнать о масштабировании EF/Я беспокоюсь о том, что произойдет, когда обе передние концы должны будут записываться в одну и ту же таблицу. – Wil