ASP.NET и длительные фоновые потоки - как они смешиваются? - PullRequest
1 голос
/ 27 ноября 2008

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

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

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

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

Как правильно это реализовать?


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

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

Недавно (как и несколько лет назад) он также приобрел интерфейс, который внешние приложения могут использовать для связи с ним. Это консольное приложение для Windows, которое в основном является тем же приложением, за исключением того, что вместо графического интерфейса оно слушает сокет и использует некоторую сериализацию 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 (я не думаю, что они тоже являются синглетами), для заполнения которых требуется специальный код и т. д.

В целом, я бы назвал систему «заплаткой» - поскольку кажется, что она была сделана миллионами исправлений и обходных путей, склеенных друг с другом любым удобным для вас способом в то время. <Ч /> Удар? (как вы тут наталкиваетесь?)

Ответы [ 3 ]

1 голос
/ 27 ноября 2008

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


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

1 голос
/ 27 ноября 2008

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

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

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

0 голосов
/ 27 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...