Проект представляет из себя Web-сервис, Json-API.
Изначально - нагрузка была небольшая, порядка 500 записей в секунду и отлично хватало использования mongodb
Следующим этапом - был внедрен Redis прослойкой - отлично справляется с онлайном в 25 000 человек, но, если отправить одновременно два запроса, то может получиться следующая история:
Запрос 1 приходит в 0.01 секунду, завершается в 0.04 секунду.
Запрос 2 приходит в 0.02 секунду, завершается в 0.03 секунду.
Оба запроса изменяют объект. Когда приходит запрос - объект загружается в память, происходят манипуляции с объектом, и объект записывается.
Таким образом в схеме выше - изменения от запроса 2 - проигнорируются, т.к. они будут перезаписаны запросом 1, который ничего не знал про запрос 2
Пока видим следующие пути решения:
1) использовать редис для организации блокировок (т.е. вообще не давать параллельного доступа к 1 объекту) - минус в увеличении ожидания ответа пользователем
2) организовать partial-update объектов (т.е. разбить объект в редисе и за "раз" апдейтить только свою часть) - не дает 100% гарантий отсутствия перезаписи
3) делать запрос объекта перед каждым изменением - очень накладно по ресурсам
4) отказаться от редис, но вот монго - не справляется(уже вынесли на сервер c SSD с кучей оперативки), хотя монго отлично поддерживает атомарные операции. Но чем заменить.. в php есть
php.net/manual/ru/book.shmop.php но писать свой велосипед не хотелось бы и не понятно, будет ли он сколько то производительным.
Т.е. фактически хочется добиться хранения в памяти сервера пула объектов и при изменении параметра быть уверенным, что он изменился и в параллельном запросе.
Какие есть варианты?