Код синхронизации каналов Django вызывает проблемы под нагрузкой (SyncConsumer и AsyncConsumer w/database_sync_to_async)
Мы используем Channels для обслуживания части огромного ERP-приложения, которое занимается обработкой транзакций. Очевидно, что пока мы не можем быть чисто асинхронными, и у нас есть проблемы с нагрузочным тестированием против крупных арендаторов (3000 WS-клиентов, делающих запрос каждую секунду)
Мы пробовали масштабировать и увеличивать (96 ядер на 4 серверах или 96 серверов с 4 ядрами), но ограничение, как я полагаю, сосредоточено вокруг кода синхронизации (в основном DB). Как только данный запрос съедает поток ASGI и занимает больше секунды или двух, мы начинаем получать ошибки (соединение закрывается, соединения не проходят).
Я создал тестовую установку, которая, запуская чистый async-потребитель даже с симулированной задержкой, летает и никогда не ошибается. Как только я меняю установку на использование database_sync_to_async(), вызывая метод, имитирующий задержку БД, она быстро слетает.
Все еще пытаюсь понять, как настроить Channels/Guicorn/Uvicorn, чтобы справиться с этой нагрузкой. Может быть, кто-нибудь сможет просветить меня...