Каналы Django: застрять через некоторое время

Я запускаю код из https://github.com/andrewgodwin/channels-examples/tree/master/multichat примерно для 50 пользователей.

Он застревает без какого-либо уведомления. Сервер не упал, в журнале доступа ничего особенного нет. Когда я останавливаю сервер daphne (с помощью Ctrl + C), для полного отключения требуется около 5-10 минут. Иногда мне приходится запускать команду kill.

Это очень странно, когда я помещаю daphne в супервизор, я перезапускаю его каждые 30 минут с помощью crontab, веб-сокет может быть подключен нормально. Это взломано, но работает.

Мой конфиг: HAProxy => Daphne

daphne -b 192.168.0.6 -p 8000 yyapp.asgi:application --access-log=/home/admin/daphne.log

backend daphne
        balance source
        option http-server-close
        option forceclose
        timeout check 1000ms
        reqrep ^([^\ ]*)\ /ws/(.*) \1\ /\2
        server daphne 192.168.0.6:8000 check maxconn 10000 inter 5s

Debian: 9.4 (исходное ядро) на сервере OVH.
Python: 3.6.4
Daphne: 2.2.1
Channels: 2.1.2
Django: 1.11.15
Redis: 4.0. 11

Я знаю, что этот вопрос может быть слишком общим, но у меня действительно нет идей по этому поводу. Я попытался обновить python, переустановить все пакеты, но это не сработало.


person anhtran    schedule 10.08.2018    source источник
comment
Вы когда-нибудь приходили к решению?   -  person kunambi    schedule 17.06.2019
comment
@kunambi В настоящее время я все еще использую хакерский метод, который перезапускает службу daphne каждые 30 минут (с помощью crontab). Пользователи могут испытывать небольшие неудобства, но это работает, и у меня нет времени заниматься этой проблемой.   -  person anhtran    schedule 22.06.2019


Ответы (1)


Ну, веб-серверы и балансировщики нагрузки, в общем, очень плохи с постоянными соединениями. Вам нужно дать Haproxy явные инструкции, чтобы он знал, когда и как отключать неиспользуемые туннели по тайм-ауту.

Haproxy нужно отслеживать четыре тайм-аута:

  1. клиент тайм-аута
  2. время ожидания подключения
  3. сервер тайм-аута
  4. туннель тайм-аута

Первые три связаны с начальной фазой HTTP-согласования подключения к сокету. Как только соединение установлено, имеет значение только тайм-аут туннеля. Вам нужно будет повозиться со значениями для вашего собственного приложения, но некоторые рекомендуемые значения для начала:

  1. тайм-аут клиента: 25 с
  2. время ожидания подключения: 5 с
  3. таймаут сервера: 25с
  4. тайм-аут туннеля: 3600 с

В вашем коде это будет:

backend daphne
    balance source
    option http-server-close
    option forceclose
    timeout check 1000ms
    timeout client 25s
    timeout connect 5s
    timeout server 25s
    timeout tunnel 3600s
    reqrep ^([^\ ]*)\ /ws/(.*) \1\ /\2
    server daphne 192.168.0.6:8000 check maxconn 10000 inter 5s

Возможно, вам придется повозиться с другими тайм-аутами, чтобы получить хорошую смесь. Некоторые тайм-ауты, которые могут повлиять на вашу настройку, и некоторые начальные значения:

  1. тайм-аут http-keep-alive: 1 с
  2. таймаут http-запроса: 15s
  3. очередь ожидания: 30 сек.
  4. таймаут tarpit: 60s

Конечно, читайте и настраивайте под свои нужды.

Ссылка: Haproxy — Балансировка нагрузки веб-сокетов

person ok123jump    schedule 03.08.2020