Как заставить мое приложение жить дольше?
Вот ситуация, в которой мы находимся.
Мы распространяем наши сборки (чисто DLL) среди наших клиентов (мы не контролируем их среду).
Они звонят нам, передавая список идентификаторов товара, и мы ищем в нашей огромной базе данных и возвращаем товары по самой высокой цене. Поскольку у нас есть SLA (30 миллисекунд), мы кэшируем наши элементы в кэш-памяти (используя Microsoft MemoryCache). Мы кэшируем около миллиона элементов.
Проблема в том, что он кэшируется только на протяжении всего срока службы наших клиентских приложений. Когда процесс завершится, все элементы кэшируются.
Можно ли как-нибудь продлить срок службы кэша памяти, чтобы последующий процесс мог повторно использовать кэшированные элементы?
Я рассмотрел возможность использования оконной службы и позволил бы всем этим различным процессам взаимодействовать с одним и тем же модулем, но это приведет к огромному беспорядку, когда дело доходит до развертывания.
Мы используем AppFabric в качестве распределенного кэша, но единственный способ достичь SLA - использовать кэш памяти.
Любая помощь будет принята с благодарностью. Спасибо
2 ответа
Я не вижу способа убедиться, что ваш домен приложений живет дольше - поскольку все, что нужно сделать вызывающей сборке, это выгрузить домен приложений...
Одним из вариантов может быть - даже довольно грязный - реализовать своего рода "постоянный MemoryCache"... для достижения производительности, которую вы могли бы / могли бы использовать ConcurrentDictionary
сохранился в MemoryMappedFile
...
Другой вариант будет использовать локальную базу данных - может быть даже Sqlite
и реализовать кеширование интерфейса в памяти таким образом, чтобы все операции записи / обновления / удаления были "сквозными", а чтения - чистым доступом к ОЗУ...
Другим вариантом может быть включение EXE (как, например, встроенного ресурса) и запуск его из библиотеки DLL, если он не запущен... EXE предоставляет MemoryCache, связь может осуществляться через IPC (например, разделяемая память...), Поскольку EXE - это отдельный процесс, он останется в живых даже после выгрузки вашего домена приложений... проблема в том, что клиенту нравится и / или разрешения позволяют это...
Мне действительно нравится подход Windows Service, хотя я согласен, что это может быть беспорядок развертывания...
Кажется, основная проблема заключается в том, что у вас нет контроля над Хостом во время выполнения - именно это контролирует продолжительность жизни (и, следовательно, кеш).
Я бы исследовал создание какого-нибудь (легковесного?) Хоста - может быть.exe или службы.
Большая часть вашей DLL будет зависать от нового хоста, но вы все равно можете развернуть "фасадную" DLL, которая, в свою очередь, называется вашим основным решением (привязанным к вашему хосту). Да, внешние клиенты могли бы вызывать ваш новый хост напрямую, но это означало бы изменение / переконфигурирование тех внешних вызывающих абонентов, когда сохранение исходной библиотеки DLL / API на месте изолировало бы внешних вызывающих абонентов от ваших внутренних изменений.
Это (я полагаю) означало бы полностью потрошить и реструктурировать ваше решение, особенно независимо от того, какие DLL обращаются к внешним вызывающим в настоящее время, потому что вместо обработки самих запросов он просто передает запрос вашему новому хосту.
Спектакль
Межпроцессное взаимодействие обходится дороже, чем сохранение его внутри процесса - я не уверен, как изменение подхода повлияет на вашу производительность и способность достичь SLA.
В частности, запуск нового экземпляра хоста приведет к снижению производительности.