PHP, HighLoad. Как организовать разделяемый доступ к объектам?

Проект представляет из себя 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 но писать свой велосипед не хотелось бы и не понятно, будет ли он сколько то производительным.

Т.е. фактически хочется добиться хранения в памяти сервера пула объектов и при изменении параметра быть уверенным, что он изменился и в параллельном запросе.

Какие есть варианты?
  • Вопрос задан
  • 2776 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Nc_Soft
1. в редис есть транзакции
2. используется ли кеширование
3. почему так часто нужно перезаписывать объект? нет ли проблем с архитектурой?
Ответ написан
UnknownHero
@UnknownHero
Event Sourcing должен помогать с конкуренцией в базе.
Но могут возникнуть проблемы с нехваткой памяти.

Lua может помочь вам ускорить сборку снапшотов или добавить очистку истории для экономии памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы