Для моей задачи требуется синхронизировать два процесса PHP.
Описание задачи
Процесс 1 хранит и периодически обновляет некоторую информацию в формате "ID" => "значение", при этом ID не изменяются, меняются только значения.
Значение - это короткая строка, скорее всего просто хеш md5 по каким-то данным.
Процесс 2, получив список ID, опрашивает по этим ID значения и работает по ним.
При этом, значения на диске хранить не требуется, так что в идеале всё должно крутиться только в оперативной памяти, и редко-редко перезаполняться целиком. Запись значений (изменения) будет очень редко, чтение - очень часто. По сути, нужен супербыстрый кеш в оперативке с доступом из разных процессов.
Стек
Стек технологий обычный, стандартный LAMP на Ubuntu 16.04 (PHP 7.2). Распределение на несколько серверов пока что не планируется, так что задачи будут выполняться все на одной машине. Ограничений по объёму памяти и объёму диска нет, так как объём данных небольшой.
Проблема
Нагрузки планируются высокие, сотни тысяч операций в секунду, поэтому раздумываю, как лучше сделать?
MySQL слишком медленное решение.
Пока что рассматриваю такие варианты:
1. Встроенные в PHP семафоры.
2. Костыльное решение через Beanstalkd.
3. Файлы.
4. MemCache.
5. Микросервис на Go.
6. Самодельное расширение PHP.
7. NoSQL-база без сохранения на диск.
Кто-нибудь с похожим сталкивался? Что порекомендуете? Что будет быстрее работать? Какие проблемы или подводные камни предвидите?
Самая быстрая синхронизация между процессами
Re: Самая быстрая синхронизация между процессами
Изучив тему, решил, что самое быстрое решение, это, кажется, встроенные в PHP семафоры + разделяемая память.
Буду копать в этом направлении.
Буду копать в этом направлении.
Re: Самая быстрая синхронизация между процессами
5. Микросервис на Go.
как влитой ложится. несколько воркеров в рамках одного процесса с синхронизацией через каналы.
как влитой ложится. несколько воркеров в рамках одного процесса с синхронизацией через каналы.
Re: Самая быстрая синхронизация между процессами
Не вышло с семафорами, также не вышло с блокировкой через "flock". Они блокируют на один процесс, а мне это не подходит, так как скрипты PHP могут выполняться в рамках одного процесса в разных потоках. Так работает веб-сервер.
Микросервис на Go писать долго.
Пока что закостылил через Beanstalkd. Скорость около 8000 операций в секунду, это медленно, но как временное решение сойдёт.
Ещё нашёл такую штуку - FLoM. По идее, то, что нужно.
https://github.com/tiian/flom
Но она не завелась на Убунте 16.04 с PHP7.2, несмотря на все усилия.
Микросервис на Go писать долго.
Пока что закостылил через Beanstalkd. Скорость около 8000 операций в секунду, это медленно, но как временное решение сойдёт.
Ещё нашёл такую штуку - FLoM. По идее, то, что нужно.
https://github.com/tiian/flom
Но она не завелась на Убунте 16.04 с PHP7.2, несмотря на все усилия.
Re: Самая быстрая синхронизация между процессами
Что только не придумаешь, чтобы на го не писать)