Как заставить мое приложение жить дольше?

Вот ситуация, в которой мы находимся.

Мы распространяем наши сборки (чисто 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.

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

Другие вопросы по тегам