Соединение с высоким трафиком между Php и Redis

У меня есть бэкэнд на php, который работает с Redis.

Но когда запросы увеличились и их больше 2000 запросов в секунду я получаю ошибку:

99 - Cannot assign requested address

Все сокеты в TIME_WAIT.


Пример подключения:

$this->_socket = @stream_socket_client(
    'tcp://' . $this->hostname . ':' . $this->port,
    $errorNumber,
    $errorDescription,
    ini_get('default_socket_timeout'),
    STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT
);

Я нашел решение: http://redis4you.com/articles.php?id=012&name=redis

Но /proc/sys/net/ipv4/tcp_tw_recycle я не могу установить 1. Не хочу терять пакеты в сети между приложением и Redis.

Php по новому запросу от API создает новый сокет.

Любые идеи?


person SiJey    schedule 20.06.2016    source источник
comment
Можете ли вы отправить несколько запросов, используя один и тот же сокет?   -  person Master DJon    schedule 20.06.2016
comment
Как я могу отправить несколько запросов, используя один и тот же сокет?   -  person SiJey    schedule 20.06.2016
comment
redis.io/topics/pipelining   -  person Master DJon    schedule 20.06.2016
comment
Эта страница PHP вызывается разными клиентами?   -  person Master DJon    schedule 20.06.2016
comment
Да и нет. Он может вызывать разных клиентов.   -  person SiJey    schedule 20.06.2016
comment
У вас установлен APC на сервере?   -  person Master DJon    schedule 20.06.2016
comment
Что выдает ulimit -a на вашем сервере? Я предполагаю, что вы используете какой-то Linux / Unix, верно?   -  person N.B.    schedule 20.06.2016


Ответы (2)


Я не знаю всего вашего дизайна, но вот что вы могли бы сделать:

  • Создайте страницу PHP, которая всегда работает (с циклом while (true))
  • Эта страница будет ожидать содержимого с вашей начальной страницы (где раньше был код сокета)
  • Используя метод конвейерной обработки, вы будете отправлять все запросы, используя один и тот же сокет.
  • Не хватает только того, как передать данные с начальной страницы на эту новую страницу.

Для этой последней части я вижу несколько решений (хотя не уверен, что все они работают):

  • Использование APC для хранения данных с начальной страницы и использования их для получения с новой.
  • Создайте СЕССИЯ на новой странице, которая будет иметь два режима: обработка, отправка. Затем вы должны вызвать эту страницу, используя ваш локальный сервер внутри начальной страницы.

В обоих решениях один экземпляр этой новой страницы должен выполняться локально, поэтому активируется «Обработка/Ожидание».

person Master DJon    schedule 20.06.2016

Исправлена ​​проблема. Используйте протокол tcp и время ожидания для наборов сокетов в 10 секунд. Php работает с сокетом в постоянном режиме

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

Таким образом, даже при 2 000 запросов в секунду используется не более 61 сокета.

person SiJey    schedule 22.06.2016