и спасибо, что посмотрели на вопрос.
Фон
У меня есть несколько машин, которые непрерывно генерируют несколько (до 300) скриптов в PHP за очень короткий промежуток времени. Эти скрипты выполняются быстро (менее секунды), а затем выходят. Все эти сценарии должны иметь доступ только для доступа к большой структуре trie, которая будет очень дорого загружаться в память каждый раз, когда каждый из запускается скрипт. Сервер работает под управлением Linux.
Мое решение
Создайте C-демона, который сохраняет структуру trie в памяти и получает запросы от клиентов PHP. Он получит запрос от каждого из клиентов PHP, выполнит поиск по структуре памяти и ответит на ответ, сохранив скрипты PHP от выполнения этой работы. Оба запроса и ответы - короткие строки (не более 20 символов).
Моя проблема
Я очень новичок в C-демонах и межпроцессном общении. После долгих исследований я сузил выбор до "Очередей сообщений" и сокетов домена Unix. Очереди сообщений кажутся адекватными, потому что я думаю (возможно, ошибаюсь), что они ставят в очередь все запросы к демону, чтобы они отвечали последовательно. Однако сокеты домена Unix кажутся более простыми в использовании. Однако у меня есть различные вопросы, на которые я не смог найти ответы:
- Как PHP script отправлять и получать сообщения или использовать сокет UNIX для связи с демоном? И наоборот, как демона C отслеживает, на какой процесс PHP он должен отправить ответ?
- Большинство примеров демонов, которые я видел, используют бесконечный цикл while с условием сна. Моему демону необходимо обслуживать множество подключений, которые могут появиться в любое время, а задержка ответа имеет решающее значение. Как бы реагировал демон, если PHP script отправляет запрос во время сна? Я читал о опросе и epoll, будет ли это правильным способом дождаться получения сообщения?
- Каждый процесс PHP всегда будет отправлять один запрос, а затем будет ждать ответа. Мне нужно убедиться, что если демон недоступен/недоступен, процесс PHP будет ожидать ответа на заданное максимальное время, и если ответ не будет получен, он продолжит независимо, вместо того, чтобы висит. Это можно сделать?
Фактический поиск структуры данных очень быстрый, мне не нужно сложное многопоточное или подобное решение, так как я считаю, что обработка запросов в режиме FIFO будет достаточно. Мне также нужно, чтобы это было просто глупо, поскольку это критически важная услуга, и я довольно новичок в этом типе программы. (Я знаю, но у меня действительно нет никакого способа обойти это, и опыт обучения будет большим)
Мне бы очень понравились фрагменты кода, которые освещают конкретные вопросы, которые у меня есть. Также приветствуются ссылки на руководства и указатели, которые будут способствовать моему пониманию в этом мрачном мире IPC низкого уровня.
Спасибо за вашу помощь!
Update
Зная гораздо больше, чем я, когда я задавал этот вопрос, я просто хотел указать всем, кто заинтересован в том, что Thrift и ZeroMQ делают фантастическую работу по абстрагированию от жесткого программирования на уровне сокета. Thrift даже дает вам леса для сервера бесплатно!
На самом деле, вместо того, чтобы идти на все тяжелые работы по созданию сетевого сервера, подумайте о написании кода сервера приложений с помощью хорошего асинхронного сервера, который уже решил проблему для вас. Конечно, серверы, использующие асинхронный ввод-вывод, отлично подходят для сетевых приложений, которые не требуют интенсивной обработки процессора (или блоков цикла событий).
Примеры для python: Twisted, gevent. Я предпочитаю gevent, и я не включаю торнадо, потому что он сосредоточен на стороне сервера HTTP.
Примеры для Ruby: EventMachine
Конечно, Node.js в основном является выбором по умолчанию для асинхронного сервера в настоящее время.
Если вы хотите углубиться, прочитайте Проблема C10k и Сетевая программа Unix.