В asp.net приложении есть счетчики к которым нужен максимально быстрый доступ (как чтение так и инкримент и получение нового значения).
Сейчас они сделаны in memory с асинхронной записью в файл спустя таймаут после изменения.
Решение в целом неплохое, но — при крахе процесса, либо выгрузке домена, есть вероятность (и периодически реализуется) потери несохранённых изменений.
Хочется сделать решение на базе memory mapped files, тк при крахе процесса, то что было в эту память записано остается сохранённым.
И также потому что в этом случае нет cross-process коммуникаций и скорость доступа максимальна.
Подскажите коллеги, какую-нибудь простенькую inproc key-value store с бэкэндом на базе memory mapped file..
Здравствуйте, MadHuman, Вы писали:
MH>Всем привет!
MH>В asp.net приложении есть счетчики к которым нужен максимально быстрый доступ (как чтение так и инкримент и получение нового значения). MH>Сейчас они сделаны in memory с асинхронной записью в файл спустя таймаут после изменения. MH>Решение в целом неплохое, но — при крахе процесса, либо выгрузке домена, есть вероятность (и периодически реализуется) потери несохранённых изменений. MH>Хочется сделать решение на базе memory mapped files, тк при крахе процесса, то что было в эту память записано остается сохранённым. MH>И также потому что в этом случае нет cross-process коммуникаций и скорость доступа максимальна. MH>Подскажите коллеги, какую-нибудь простенькую inproc key-value store с бэкэндом на базе memory mapped file..
LiteDB посмотри. По производительности, имхо, оптимальным будет.
Правда там нет MMF из коробки. Но можно сделать свой декоратор поверх дефолтного IDiskService.
Но, имхо, для такой задачи зрелая embedded база — тяжеловатое решение.
Еще есть хардкорный вариант — сделать свою реализацию (e.g. на базе LSM-дерева).
А если количество счетчиков известно заранее и принять, что имя счетчика + значение всегда имеет фиксированный размер,
то можно без LSM обойтись. Просто мапить имя счетчика на смещение в MemoryMappedFile и писать байты.