ЗАДНИЙ ПЛАН
У меня есть давно работающий дискорд-бот (3+ года), написанный на разногласия.py
который всегда работал на GCP, зона us-east4-a. Бот работает в к8с
используя discord.py 1.7.2 и python 3.9.
ПРОБЛЕМА
За последний месяц или два я стал замечать все большее количество прерываний соединения, [Ошибка 104] Сброс соединения узлом. Сбросы не связаны напрямую с активностью бота. Они происходят с перерывами в течение дня в производственной среде (в среднем каждые несколько минут).
Эти сбросы вызывают случайные сбои в HTTP API разногласий и приводят к высокому уровню отключений в WebSocket. Многие из этих отключений сегментов могут ВОЗОБНОВИТЬСЯ, но многие (~ 200 в день) в конечном итоге приводят к вызову IDENTIFY, например, к новому подключению, и иногда вызывают длительные ожидания отсрочки и частичные сбои.
ПРИМЕР
Вот пример отключения:
Traceback (последний последний вызов):
Файл "/opt/venv/lib/python3.9/site-packages/discord/shard.py", строка 187, при повторном подключении
self.ws = ожидание asyncio.wait_for(coro, timeout=60.0)
Файл "/usr/local/lib/python3.9/asyncio/tasks.py", строка 481, в wait_for
вернуть фут.результат()
Файл "/opt/venv/lib/python3.9/site-packages/discord/gateway.py", строка 305, в from_client
gateway = gateway или await client.http.get_gateway()
Файл "/opt/venv/lib/python3.9/site-packages/discord/http.py", строка 967, в get_gateway
data = await self.request(Route('GET', '/шлюз'))
Файл "/opt/venv/lib/python3.9/site-packages/discord/http.py", строка 192, в запросе
async с self.__session.request(method, url, **kwargs) as r:
Файл "/opt/venv/lib/python3.9/site-packages/aiohttp/client.py", строка 1117, в __aenter__
self._resp = ждать self._coro
Файл "/opt/venv/lib/python3.9/site-packages/aiohttp/client.py", строка 544, в _request
ждать resp.start(conn)
Файл "/opt/venv/lib/python3.9/site-packages/aiohttp/client_reqrep.py", строка 890, в начале
message, payload = await self._protocol.read() # тип: ignore
Файл "/opt/venv/lib/python3.9/site-packages/aiohttp/streams.py", строка 604, чтение
ждать себя._waiter
aiohttp.client_exceptions.ClientOSError: [Errno 104] сброс соединения узлом
ЭКСПЕРИМЕНТ ДЛЯ ВЫЯВЛЕНИЯ ПРОБЛЕМЫ
Я провел эксперимент, чтобы определить причину проблемы. Я развернул контейнер с моим ботом на виртуальной машине (не к8с
) и изолировал его таким образом, чтобы он общался только с разногласиями (без внешней базы данных) и автоматически отправлял ему команды для имитации поведения пользователя и загрузки (я отправляю около 60 команд в минуту на том же сервере — это хорошо при моей производственной нагрузке). Я запускаю это в течение 20 минут или пока не наблюдаю, происходит ли сброс соединения, и вижу следующее:
- В
сша-восток4-а
, я могу воспроизвести периодические сбросы соединения.
- В
сша-восток4-б
, я могу воспроизвести периодические сбросы соединения.
- В
сша-восток4-c
, я могу воспроизвести периодические сбросы соединения.
- В
us-central1-a
, Я не удалось воспроизвести какие-либо сбросы соединения (даже по прошествии 3 часов - ни один шард не отключается).
- В
us-east1-b
, Я не удалось воспроизвести какие-либо сбросы соединения.
- На моем ноутбуке (жилой интернет на восточном побережье) я не удалось воспроизвести какие-либо сбросы соединения.
Во всех экспериментах используется один и тот же контейнер, один и тот же тип машины и одна и та же процедура испытаний.
Я повторил эксперимент в сша-восток4-а
с несколькими типами машин до 8 виртуальных ЦП и с премиальным и стандартным сетевыми уровнями, и я все еще вижу сбросы. Я также попробовал другую виртуальную машину в другом проекте, но проблемы с подключением всегда сохраняются в сша-восток4
.
У меня открыта заявка на поддержку в GCP, так как проблема связана с конкретным регионом.
Есть ли какие-либо дополнительные эксперименты, которые я мог бы предоставить, чтобы попытаться сузить причину этого? Существуют ли какие-либо распространенные проблемы с конфигурацией GCP, которые могут привести к этой проблеме?
Если не считать переезда в другой регион, я чувствую, что у меня нет вариантов.