У меня странная проблема с ZMQ, которую я просто не могу отладить. Это компоненты:
Клиент PHP — Простой ответ на запрос с сокетом REQ. Это поток запросов:
$zcontext = new ZMQContext();
$socket = new ZMQSocket($zcontext, ZMQ::SOCKET_REQ);
$socket->connect(<address>);
$startTime = microtime(true);
$socket->send(<request>);
$result = $socket->recv();
$totalTime = microtime(true) - $startTime;
Сокеты ZMQ используют TCP, и сервер, и клиент находятся на одном компьютере.
Скрипт PHP обслуживается Apache, и я тестирую нагрузку с помощью Apache Benchmark. Я делаю 5000 запросов с параллелизмом 200. На клиенте PHP я регистрирую время, которое требуется для ответа на запрос ($totalTime
). В большинстве случаев это время очень мало (менее 500 мс), но иногда это занимает очень много времени — иногда даже 60 секунд (для отправки + получения).
Я добавил несколько дополнительных журналов, чтобы выяснить, где происходит проблема, и выясняется, что, когда это занимает очень много времени, почти все время находится между отправкой PHP и получением Java — таким образом, пакеты достигают сервера очень долго.
Я не устанавливаю никаких специальных настроек ZMQ или иным образом занимаюсь чем-то необычным, поэтому не знаю, что является причиной проблемы. Следует также отметить, что проблема сохраняется даже при более низких параллелизмах (я также тестировал на 100 и 150), но максимальное время запроса меньше.
Извините, если вопрос кажется расплывчатым — я предоставлю любые другие детали, которые могут понадобиться.
Задача ещё не решена.
Других решений пока нет …