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

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

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

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

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

Войти через центр авторизации
Похожие вопросы