Самая быстрая синхронизация между процессами

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

Самая быстрая синхронизация между процессами

Сообщение Nex-Otaku » 2018.05.02, 14:56

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

Кто-нибудь с похожим сталкивался? Что порекомендуете? Что будет быстрее работать? Какие проблемы или подводные камни предвидите?

Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

Re: Самая быстрая синхронизация между процессами

Сообщение Nex-Otaku » 2018.05.02, 20:35

Изучив тему, решил, что самое быстрое решение, это, кажется, встроенные в PHP семафоры + разделяемая память.

Буду копать в этом направлении.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Самая быстрая синхронизация между процессами

Сообщение zelenin » 2018.05.03, 00:01

5. Микросервис на Go.

как влитой ложится. несколько воркеров в рамках одного процесса с синхронизацией через каналы.

Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

Re: Самая быстрая синхронизация между процессами

Сообщение Nex-Otaku » 2018.05.04, 21:54

Не вышло с семафорами, также не вышло с блокировкой через "flock". Они блокируют на один процесс, а мне это не подходит, так как скрипты PHP могут выполняться в рамках одного процесса в разных потоках. Так работает веб-сервер.

Микросервис на Go писать долго.

Пока что закостылил через Beanstalkd. Скорость около 8000 операций в секунду, это медленно, но как временное решение сойдёт.

Ещё нашёл такую штуку - FLoM. По идее, то, что нужно.
https://github.com/tiian/flom
Но она не завелась на Убунте 16.04 с PHP7.2, несмотря на все усилия.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Самая быстрая синхронизация между процессами

Сообщение zelenin » 2018.05.04, 22:34

Что только не придумаешь, чтобы на го не писать)

Ответить