2008-11-27 2 views
1

В приложении ASP.NET, которое я пишу, мне нужно использовать подключения к определенному серверу (что-то вроде БД, но ... другое). Соединения довольно дороги для установки (несколько секунд, буквально), поэтому я пытаюсь написать пул для повышения масштабируемости.ASP.NET и длинные фоновые потоки - как они смешиваются?

Все довольно просто, до одной точки - переработка старых соединений. Со старым я имею в виду «соединения, которые были в пуле неиспользованными дольше, чем, скажем, 5 минут». Очистка их также освободит ресурсы на сервере, к которому они подключаются.

Мне нужна какая-то нить, которая просыпается каждые 5 минут, проверяет старые неиспользуемые соединения в пуле и закрывает их. Однако, как я понял из Google, ASP.NET и длинные потоки не смешиваются.

Я не боюсь, что весь процесс будет прекращен, потому что тогда мой бассейн тоже будет очищен (деструкторы и все). Я боюсь, что мой поток очистки может быть прерван до того, как мое приложение завершится (и мой пул останется без уборщика). Или наоборот - моя чистящая нить блокирует мое приложение от закрытия.

Как это осуществить правильно?


Несколько человек предложили внешнюю службу, которая сделает это. Я расскажу о «услуге« mysterios », чтобы вы могли понять, почему это невозможно.

«Таинственное обслуживание» - это бегемот приложения, написанное моей компанией более 10 лет. Это приложение учета Delphi, которое использует MSSQL или Oracle для своих данных. Другого сервера нет.

Недавно (как и несколько лет назад) он также приобрел интерфейс, который внешние приложения могут использовать для связи с ним. Это консольное приложение Windows, которое в основном является одним и тем же приложением, за исключением того, что вместо GUI он слушает сокет и использует некоторую сериализацию Delphi для передачи данных вперед и назад.

На стороне клиента есть .DLL (написанный на Java, позже модифицированный для компиляции под J #), который анализирует этот поток двоичных данных и имитирует бизнес-уровень в .NET. То есть - я получаю все те же бизнес-классы (700+), что и в исходном приложении в Delphi. Или что-то довольно близко к этому (я думаю, что у приложения есть> 3000 классов). И я должен использовать их для выполнения любой бизнес-логики, которую я хочу. Все мои вызовы перенаправляются на реальное приложение, которое затем выполняет эту работу.

Я не могу напрямую подключиться к БД MSSQL/Oracle, потому что на сервере существует много бизнес-логики bizzare, которую я должен был бы повторить и поддерживать (приложение постоянно разрабатывается). Я не могу воссоздать клиента .DLL, потому что это было бы слишком трудоемким, и протокол будет в любом случае диктовать почти такой же результат. Я не могу написать обертку вокруг него, так как мне пришлось бы обернуть все 700 + классы, которые там есть.

Другими словами - я не контролирую бизнес-уровень. Это как есть (и фактически несколько человек ушли, а не продолжали работать с ним). Я просто пытаюсь сделать все возможное.


Крис и другие любопытные люди.

код, чтобы использовать материал, что-то вроде этого:

ConnectionType con = new ConnectionType; 
con.OpenConnection("server", "port", "username", "password"); 
BLObjectNumber234 obj = (BLObjectNumber234)con.GetBLObject("BLObjectNumber234"); 
obj.GetByPK(123); 
// Do some stuff with obj's properties and methods 
// that are different for each BLObject type 

Эти BL объекты довольно бессистемно. Все они одиночные - вызов con.GetBLObject всегда возвращает тот же экземпляр.Большая часть данных получена как DataTable, вызвав специальный метод, но немало также находятся в свойствах; некоторые требуют вызова специальных методов с недокументированными константами bizzare; есть также свойства, которые являются экземплярами объекта BL (не уверены, являются ли эти синглеты тоже, я думаю, нет), и им нужен специальный код для заполнения и т. д.

В целом, я бы назвал систему «patchware» - поскольку кажется, что это было сделано миллионными патчами и обходными решениями, которые все сливались во что бы то ни было было наиболее удобным в то время.


Bump? (как вы все-таки натыкаетесь?)

ответ

0

Вы можете написать службу WCF, которая обертывает службу, которую вы пытаетесь вызвать, а затем обмениваться данными с этой таинственной услугой только через ваше сервисное приложение WCF.

WCF имеет различные модели для обработки пула и очистки.

1

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


Ok, просто обратиться собственное дополнение к этому вопросу - я думаю, что вы получаете слишком зацикливаться на значении «обертки». Я надеюсь, что вы все равно сделаете какую-то обертку, или, может быть, мне нужно прекратить это и задать вам вопрос напрямую: вы вызываете эту службу непосредственно из кода, стоящего за страницами asp.net, или вы создали отдельный классы для обработки связи между интерфейсом и сервисом? После того, как мы установим архитектуру, которую вы сейчас используете, мы увидим, можно ли переместить эту логику в отдельную службу (а затем воспользоваться преимуществами, которые может предложить WCF).

1

Я согласен с Крисом, было бы гораздо более уместно иметь всю вашу бизнес-логику (код, который общается со всеми таинственными бизнес-объектами) в отдельном слое, чем в веб-(презентационном) слое.

Это сделало бы ваш дизайн приложения более масштабируемым, и вы могли бы гораздо проще выполнять такие задачи, как объединение пулов, потоков и других задач, связанных с масштабированием.

Если вы решили использовать WCF для связи между веб-сайтом и бизнес-слоем (используйте каналы имен, если он находится на одном компьютере), вы получаете чистую, масштабируемую и совершенную архитектуру.

Смежные вопросы