Коллеги,
Прошу откликнуться тех, кто имел отношение к построению хранилищ данных с низким временем доступа, а также тех, кто интересуется этой тематикой. Тема весьма распространенная, так что возможно многие из вас с ней сталкивались. Возможно кто-нибудь посоветует уже реализованный механизм или как минимум компоненты, которые можно положить в основу. Это было бы просто удачей.
Начну с задач, стоящих перед In-Memory Storage.
1. Быстрая скорость орбаботки запросов пользователей. Сами запросы от пользователей и наполнение данными самого хранилища происходит путем вызовов процедур, параметры которых -- примитивные типы данных (строка, int, double).
2. Устойчивость к отключениям питания и сбоям. Система хранит денюжки, а именно текущий (единственный и по этому актуальный) остаток на счетах абонентов. Следовательно денюжки терять нельзя. Нужно писать данные на энергонезависимую память.
3. Возможность "одновременной" обработки запросов многих бастродействующих клиентов (других серверных процессов).
4. Как можно более простая структура, программулина должна работать и на писюке с небольшой нагрузкой. В том числе и под Windows.
Теперь собственно несколько мыслей относительно архитектуры самого программного девайса.
1. Оправданно ли использование RPC? Для масштабирования необходимо запускать несколько RPC-серверов, которые будут кидать в очередь, из кторой будет выгребать процесс-обработчик? Или RPC может масштабироваться как-то по другому?
2. Стратегии записи в файл.
2.1. Запросы на диске в виде файлов? Типа очередь запросов с момента запуска и до момента, определенного в конфиге (или путем вызова соотв. метода). Например, раз в сутки, или путем вызова соотв. метода, который блокирует storage, все из этих файлов синхронизируется со структурами в памяти, которые в виде "снимка" скидываются на диск. Сами файлики запросов удаляются. При старте -- обрабатываем запросы из очереди сначала и до конца. Может занять много времени.
2.2. Change log с точками сохранения? Типа пишем приходящие запросы в файл change-log и храним их там до тех пор, пока не закончится таймаут или транзакция. Затем саму транзакцию или дельту за таймаут отражаем в другом файле -- типа снимке "статических" данных. Затем при сбое питания зачитываем снимок и по change-log'у восстанавливаем текущее положение вещей. Сам файл-снимок сделан в виде mmap(2).
2.3. Один "снимок", который сохраняется после каждой операции изменения или по таймауту (mmap+msync)? Типа приходит запрос, мы его обрабатываем, вносим изменения в нашу структуру в памяти, которая отражается на файл и сохраняем изменения путем вызова msync(2).
2.4. Кикие-то другие варианты?