Forwarded from Pavel Klyuev
🔍 Сравнение микросервисной архитектуры и монолита
💩 В процессе разговоров с парой своих коллег, я начал сомневаться в премиуществах микросервисной архитектуры, тут хочу изложить общие термины и личное мнение, которое не претендует на истину.
Цитата для привлечения внимания:
"Микросервисная архитектура придумана не разработчиками/архитекторами/админами, а эффективными менеджерами и бизнесом, так как больше преимуществ это дает заказчику, позволяя ему нанимать любых колхозников, прошедших курсы разработки на любых языках."
Накидаете в панамку? Комментарии приветствуются.
https://mire-saw-919.notion.site/8d8dba0b816e43a4a1ad4bcae368e8a5
💩 В процессе разговоров с парой своих коллег, я начал сомневаться в премиуществах микросервисной архитектуры, тут хочу изложить общие термины и личное мнение, которое не претендует на истину.
Цитата для привлечения внимания:
https://mire-saw-919.notion.site/8d8dba0b816e43a4a1ad4bcae368e8a5
🔥7👍1
Динамический ресайзинг ресурсов с 1.27 в Kubernetes
https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/
https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/
Kubernetes
Resize CPU and Memory Resources assigned to Containers
FEATURE STATE: Kubernetes v1.35 [stable](enabled by default) This page explains how to change the CPU and memory resource requests and limits assigned to a container without recreating the Pod.
Traditionally, changing a Pod's resource requirements necessitated…
Traditionally, changing a Pod's resource requirements necessitated…
Investigating Linux Phantom Disk Reads
Не так давно один из наших пользователей обратился за странным использованием оборудования. Они использовали наш клиент ILP (InfluxDB Line Protocol) для вставки строк в свою базу данных QuestDB, но наряду с записью на диск они также наблюдали значительные чтения на диск. Этого определенно не ожидается от рабочей нагрузки только для записи, поэтому нам пришлось разобраться в этой проблеме. Сегодня мы делимся этой историей, полной взлетов и падений, а также магии ядра Linux.
Не так давно один из наших пользователей обратился за странным использованием оборудования. Они использовали наш клиент ILP (InfluxDB Line Protocol) для вставки строк в свою базу данных QuestDB, но наряду с записью на диск они также наблюдали значительные чтения на диск. Этого определенно не ожидается от рабочей нагрузки только для записи, поэтому нам пришлось разобраться в этой проблеме. Сегодня мы делимся этой историей, полной взлетов и падений, а также магии ядра Linux.
Forwarded from Грефневая Кафка (pro.kafka)
Jack Vanlightly конечно, графоман, но никто не пишет про бенчмарки так как он. В последнем опубликованном посте, он сравнил производительность Apache Kafka® и redpanda. И на удивление (на самом деле нет) AK оказалась быстрее. Если кратко
Его тесты производительности показали, что Redpanda значительно уступает Apache Kafka по нескольким параметрам. Тесты проводились на идентичном оборудовании с одинаковыми настройками. Вот несколько ключевых выводов:
- Изменение количества продюсеров и консьюмеров с 4 до 50 резко снизило производительность Redpanda, несмотря на сохранение пропускной способности.
- Постоянная нагрузка на Redpanda в течение 24 часов приводила к замедлению дисков NVMe, вызывая высокие задержки. - С Kafka таких проблем не возникало из-за его более последовательного IO доступа.
- При достижении лимита хранения Redpanda показывала большие конечные задержки. Kafka оставался стабильным.
- Использование записей-ключей приводило к снижению пропускной способности и увеличению задержек у Redpanda. Kafka показывал лучшую производительность.
- Только Kafka смог полностью использовать пропускную способность дисков NVMe в 2 ГБ/с.
- Консьюмеры могли только сократить задержки с Kafka при постоянной нагрузке продюсера.
- Несмотря на утверждения, Redpanda не может обеспечить работу с нагрузкой 1 ГБ/с с тремя брокерами i3en.6xlarge.
Более подробные детали с картинками в блоге у Jack Vanlightly.
Его тесты производительности показали, что Redpanda значительно уступает Apache Kafka по нескольким параметрам. Тесты проводились на идентичном оборудовании с одинаковыми настройками. Вот несколько ключевых выводов:
- Изменение количества продюсеров и консьюмеров с 4 до 50 резко снизило производительность Redpanda, несмотря на сохранение пропускной способности.
- Постоянная нагрузка на Redpanda в течение 24 часов приводила к замедлению дисков NVMe, вызывая высокие задержки. - С Kafka таких проблем не возникало из-за его более последовательного IO доступа.
- При достижении лимита хранения Redpanda показывала большие конечные задержки. Kafka оставался стабильным.
- Использование записей-ключей приводило к снижению пропускной способности и увеличению задержек у Redpanda. Kafka показывал лучшую производительность.
- Только Kafka смог полностью использовать пропускную способность дисков NVMe в 2 ГБ/с.
- Консьюмеры могли только сократить задержки с Kafka при постоянной нагрузке продюсера.
- Несмотря на утверждения, Redpanda не может обеспечить работу с нагрузкой 1 ГБ/с с тремя брокерами i3en.6xlarge.
Более подробные детали с картинками в блоге у Jack Vanlightly.
🤔1
🐳 Distroless контейнеры - это минимальные Docker-образы, предназначенные для запуска приложений. Они созданы с целью устранения необходимости в операционных системах внутри контейнера. Вместо этого они содержат только необходимые компоненты для работы приложения, такие как исполняемые файлы и библиотеки.
🔍 Преимущества:
• ⚡️ Уменьшение размера образов: Отсутствие операционной системы позволяет значительно сократить размер контейнера, что улучшает время загрузки и экономит ресурсы.
• 👮♀️ Улучшенная безопасность: Уменьшение поверхности атаки за счет исключения неиспользуемых компонентов операционной системы.
• 🚫 Отсутствие необязательных уязвимостей: Меньше компонентов - меньше вероятность наличия уязвимостей.
⚙️ Distroless предоставляет базовые образы для различных языков программирования, таких как Java, Python, Node.js и других, что позволяет разработчикам сосредоточиться только на своем приложении, не заботясь о настройке и обновлении операционной системы.
🔗 Ссылка на репозиторий Distroless: https://github.com/GoogleContainerTools/distroless
#Docker #Контейнеры #Distroless #Безопасность
🔍 Преимущества:
• ⚡️ Уменьшение размера образов: Отсутствие операционной системы позволяет значительно сократить размер контейнера, что улучшает время загрузки и экономит ресурсы.
• 👮♀️ Улучшенная безопасность: Уменьшение поверхности атаки за счет исключения неиспользуемых компонентов операционной системы.
• 🚫 Отсутствие необязательных уязвимостей: Меньше компонентов - меньше вероятность наличия уязвимостей.
⚙️ Distroless предоставляет базовые образы для различных языков программирования, таких как Java, Python, Node.js и других, что позволяет разработчикам сосредоточиться только на своем приложении, не заботясь о настройке и обновлении операционной системы.
🔗 Ссылка на репозиторий Distroless: https://github.com/GoogleContainerTools/distroless
#Docker #Контейнеры #Distroless #Безопасность
GitHub
GitHub - GoogleContainerTools/distroless: 🥑 Language focused docker images, minus the operating system.
🥑 Language focused docker images, minus the operating system. - GitHub - GoogleContainerTools/distroless: 🥑 Language focused docker images, minus the operating system.
👍1
📣 Вопрос безопасности: сохранение сертификата, зашифрованного паролем, в Git 🔒
🤔 Возник вопрос: является ли безопасным сохранение сертификата, зашифрованного паролем, в Git-репозиторий? При этом пароль не сохраняется рядом с сертификатом.
🔐 Ответ: Хранение сертификата, зашифрованного паролем, в Git может быть безопасным, при условии, что пароль не сохраняется в репозитории рядом с сертификатом. Пароль должен быть сохранен в надежном и безопасном месте, отдельно от репозитория.
💡 Рекомендуется следующий подход:
1️⃣ Сохраняйте сертификат в Git-репозитории, но не сохраняйте пароль вместе с ним.
2️⃣ Храните пароль в безопасном хранилище, таком как система управления паролями или ключами.
3️⃣ При использовании сертификата из Git, ваше приложение или скрипт должны запрашивать пароль из безопасного хранилища для расшифровки сертификата перед его использованием.
🔒 Этот подход обеспечит дополнительный уровень безопасности, так как пароль будет храниться отдельно и защищен от несанкционированного доступа.
🤔 Возник вопрос: является ли безопасным сохранение сертификата, зашифрованного паролем, в Git-репозиторий? При этом пароль не сохраняется рядом с сертификатом.
🔐 Ответ: Хранение сертификата, зашифрованного паролем, в Git может быть безопасным, при условии, что пароль не сохраняется в репозитории рядом с сертификатом. Пароль должен быть сохранен в надежном и безопасном месте, отдельно от репозитория.
💡 Рекомендуется следующий подход:
1️⃣ Сохраняйте сертификат в Git-репозитории, но не сохраняйте пароль вместе с ним.
2️⃣ Храните пароль в безопасном хранилище, таком как система управления паролями или ключами.
3️⃣ При использовании сертификата из Git, ваше приложение или скрипт должны запрашивать пароль из безопасного хранилища для расшифровки сертификата перед его использованием.
🔒 Этот подход обеспечит дополнительный уровень безопасности, так как пароль будет храниться отдельно и защищен от несанкционированного доступа.
👍1
Кубертатный период
📣 Вопрос безопасности: сохранение сертификата, зашифрованного паролем, в Git 🔒 🤔 Возник вопрос: является ли безопасным сохранение сертификата, зашифрованного паролем, в Git-репозиторий? При этом пароль не сохраняется рядом с сертификатом. 🔐 Ответ: Хранение…
🔐 Я кстати использую passwordstore для безопасного хранения паролей в Git 💻
💡 Как это работает:
1️⃣ Создайте Git-репозиторий для паролей.
2️⃣ Используйте passwordstore для сохранения паролей, которые автоматически шифруются с помощью GPG.
3️⃣ Коммитте и пушьте изменения в Git, где пароли будут зашифрованы.
🔒 Этот подход обеспечивает доступ к паролям с любого устройства, обеспечивая безопасность с помощью шифрования. Git обеспечивает контроль версий и восстановление предыдущих версий паролей.
🔐 Помните, безопасность паролей - важно! Используйте passwordstore и Git, чтобы защитить свои пароли и обеспечить безопасность аккаунтов.
💡 Как это работает:
1️⃣ Создайте Git-репозиторий для паролей.
2️⃣ Используйте passwordstore для сохранения паролей, которые автоматически шифруются с помощью GPG.
3️⃣ Коммитте и пушьте изменения в Git, где пароли будут зашифрованы.
🔒 Этот подход обеспечивает доступ к паролям с любого устройства, обеспечивая безопасность с помощью шифрования. Git обеспечивает контроль версий и восстановление предыдущих версий паролей.
🔐 Помните, безопасность паролей - важно! Используйте passwordstore и Git, чтобы защитить свои пароли и обеспечить безопасность аккаунтов.
www.passwordstore.org
Pass: The Standard Unix Password Manager
Pass is the standard unix password manager, a lightweight password manager that uses GPG and Git for Linux, BSD, and Mac OS X.
👍1🔥1
NetBox - ведущее решение для моделирования и документирования современных сетей. Сочетая традиционные дисциплины управления IP-адресами (IPAM) и управления инфраструктурой центров обработки данных (DCIM) с мощными API и расширениями, NetBox обеспечивает идеальный "источник правды" для автоматизации сети.
Демо: https://demo.netbox.dev/
Есть Terraform provider, что позволяет управлять инфраструктурой
А также Ansible Plug-in, среди модулей которого есть модуль для управления Ansible inventory
Демо: https://demo.netbox.dev/
Есть Terraform provider, что позволяет управлять инфраструктурой
А также Ansible Plug-in, среди модулей которого есть модуль для управления Ansible inventory
👍5
NiFi Kop (Kubernetes operator) - это оператор Kubernetes, предназначенный для управления развертыванием и масштабированием Apache NiFi в Kubernetes. Он облегчает установку и управление инфраструктурой NiFi на Kubernetes, предоставляя возможность масштабировать и управлять экземплярами NiFi в среде Kubernetes. 💪
Основные преимущества NiFi Kop:
- Установка: NiFi Kop легко устанавливается в кластер Kubernetes и имеет настраиваемые параметры для развертывания. 🚀
- Масштабирование: Оператор обеспечивает автоматическое масштабирование экземпляров NiFi в зависимости от нагрузки, что обеспечивает гибкое управление ресурсами. ⚖️
- Управление конфигурацией: NiFi Kop упрощает управление конфигурацией NiFi, позволяя определить параметры конфигурации в манифестах Kubernetes. ⚙️
- Мониторинг и логирование: Оператор интегрируется с системами мониторинга и логирования, такими как Prometheus и Grafana. 📊
- Обновления и восстановление: NiFi Kop предоставляет механизмы обновления версий NiFi без прерывания работы приложения и восстановления состояния NiFi в случае сбоев. 🔁
NiFi Kop облегчает развертывание и управление Apache NiFi на Kubernetes, позволяя сосредоточиться на разработке приложений NiFi. 🛠
Основные преимущества NiFi Kop:
- Установка: NiFi Kop легко устанавливается в кластер Kubernetes и имеет настраиваемые параметры для развертывания. 🚀
- Масштабирование: Оператор обеспечивает автоматическое масштабирование экземпляров NiFi в зависимости от нагрузки, что обеспечивает гибкое управление ресурсами. ⚖️
- Управление конфигурацией: NiFi Kop упрощает управление конфигурацией NiFi, позволяя определить параметры конфигурации в манифестах Kubernetes. ⚙️
- Мониторинг и логирование: Оператор интегрируется с системами мониторинга и логирования, такими как Prometheus и Grafana. 📊
- Обновления и восстановление: NiFi Kop предоставляет механизмы обновления версий NiFi без прерывания работы приложения и восстановления состояния NiFi в случае сбоев. 🔁
NiFi Kop облегчает развертывание и управление Apache NiFi на Kubernetes, позволяя сосредоточиться на разработке приложений NiFi. 🛠
👍1
📢 Обработка ошибок в Kubernetes операторе
При разработке оператора Kubernetes существуют два способа сообщать об ошибках:
Пример:
Отсутствует API-токен. Оператор пытается прочитать секрет, но пока такого секрета нет, и оператор не может выполнить свою работу.
Преимущества
✅ Легко видеть последние события (k9s :events shift L).
Недостатки
❌ Нельзя определить, когда событие снова в порядке, если не генерировать событие о успешном восстановлении. Однако, генерация события при каждом успешном обнаружении API-токена в секрете приведет к созданию событий для каждого вызова, что не имеет смысла.
Преимущества
✅ Можно установить состояние "fine" (нормальное). Это гарантирует видимость только последнего состояния, а не устаревших состояний.
Недостатки
❌ Нельзя легко просмотреть предыдущие статусы и состояния, которые не были в порядке. Это легко делается с помощью
При разработке оператора Kubernetes существуют два способа сообщать об ошибках:
Event (событие) и status.Condition (состояние).Пример:
Отсутствует API-токен. Оператор пытается прочитать секрет, но пока такого секрета нет, и оператор не может выполнить свою работу.
Преимущества
Event:✅ Легко видеть последние события (k9s :events shift L).
Недостатки
Event:❌ Нельзя определить, когда событие снова в порядке, если не генерировать событие о успешном восстановлении. Однако, генерация события при каждом успешном обнаружении API-токена в секрете приведет к созданию событий для каждого вызова, что не имеет смысла.
Преимущества
status.Condition:✅ Можно установить состояние "fine" (нормальное). Это гарантирует видимость только последнего состояния, а не устаревших состояний.
Недостатки
status.Condition:❌ Нельзя легко просмотреть предыдущие статусы и состояния, которые не были в порядке. Это легко делается с помощью
Event, но другого простого способа просмотра недавних сбоев нет.👍1
Модель зрелости MLOps
Тулинг для MLOps должен покрывать следующие задачи:
- Версионирование данных/модели/конфигурации/схемы
- Оркестрация для создания наборов данных и сбора данных
- Оркестрация для автоматического обучения модели (по триггеру, по расписанию и т. д.)
- Оркестрация для автоматического развертывания модели (+ A/B-тестирование, canary)
- Сервинг моделей
- Автоматическая подготовка вычислительных ресурсов локально или в облаке
- Обнаружение сдвига в данных
- Мониторинг модели в производстве
- Юнит/интеграционные тесты и тесты для данных
Тулинг для MLOps должен покрывать следующие задачи:
- Версионирование данных/модели/конфигурации/схемы
- Оркестрация для создания наборов данных и сбора данных
- Оркестрация для автоматического обучения модели (по триггеру, по расписанию и т. д.)
- Оркестрация для автоматического развертывания модели (+ A/B-тестирование, canary)
- Сервинг моделей
- Автоматическая подготовка вычислительных ресурсов локально или в облаке
- Обнаружение сдвига в данных
- Мониторинг модели в производстве
- Юнит/интеграционные тесты и тесты для данных
👍4
📢 Kubernetes предоставляет три механизма проверки состояния контейнеров: Startup, Readiness и Liveness пробы. 🔄
🚀 Startup Probe:
Startup Probe используется для проверки, завершился ли процесс запуска контейнера и готов ли он обрабатывать запросы
Применяется только во время запуска контейнера
Проверка повторяется до тех пор, пока контейнер не пройдет пробу запуска
Если проба запуска завершается неуспешно, контейнер считается неисправным и Kubernetes может принять соответствующие меры, такие как перезапуск контейнера ⏰
✅ Readiness Probe:
Readiness Probe используется для проверки, готов ли контейнер принимать трафик и обрабатывать запросы от клиентов
Применяется после успешного запуска контейнера
Проверка повторяется в течение жизни контейнера
Если проба готовности завершается неуспешно, контейнер помечается как неготовый, и Kubernetes перестает направлять трафик на него 🛠
💡 Liveness Probe:
Liveness Probe используется для проверки, находится ли контейнер в рабочем состоянии или возникла ли внутренняя проблема
Применяется после успешного запуска контейнера
Проверка повторяется в течение жизни контейнера
Если проба жизнеспособности завершается неуспешно, Kubernetes решает, что контейнер не работает должным образом, и может принять меры, такие как перезапуск контейнера 🔍
🌟 Таким образом, Startup Probe используется для проверки завершения процесса запуска, Readiness Probe - для проверки готовности контейнера принимать трафик, а Liveness Probe - для проверки жизнеспособности контейнера во время его работы.
🚀 Startup Probe:
Startup Probe используется для проверки, завершился ли процесс запуска контейнера и готов ли он обрабатывать запросы
Применяется только во время запуска контейнера
Проверка повторяется до тех пор, пока контейнер не пройдет пробу запуска
Если проба запуска завершается неуспешно, контейнер считается неисправным и Kubernetes может принять соответствующие меры, такие как перезапуск контейнера ⏰
✅ Readiness Probe:
Readiness Probe используется для проверки, готов ли контейнер принимать трафик и обрабатывать запросы от клиентов
Применяется после успешного запуска контейнера
Проверка повторяется в течение жизни контейнера
Если проба готовности завершается неуспешно, контейнер помечается как неготовый, и Kubernetes перестает направлять трафик на него 🛠
💡 Liveness Probe:
Liveness Probe используется для проверки, находится ли контейнер в рабочем состоянии или возникла ли внутренняя проблема
Применяется после успешного запуска контейнера
Проверка повторяется в течение жизни контейнера
Если проба жизнеспособности завершается неуспешно, Kubernetes решает, что контейнер не работает должным образом, и может принять меры, такие как перезапуск контейнера 🔍
🌟 Таким образом, Startup Probe используется для проверки завершения процесса запуска, Readiness Probe - для проверки готовности контейнера принимать трафик, а Liveness Probe - для проверки жизнеспособности контейнера во время его работы.
👍5
Как OpenAI масштабировали Kubernetes кластер до 7500 узлов для рабочей нагрузки
🔬 Для задач машинного обучения и исследований требуется создание масштабируемой инфраструктуры для больших моделей, таких как GPT-3, CLIP и DALL·E, а также для быстрых мелкомасштабных итеративных исследований.
🚀 Масштабирование одного кластера Kubernetes до такого размера выполняется редко и требует особой осторожности, но плюсом является простая инфраструктура, которая позволяет командам машинного обучения двигаться быстрее и масштабироваться без изменения своего кода.
🔑 Ключевые тезисы:
- Для рабочей нагрузки задач машинного обучения требуется доступ ко всем низкоуровневым ресурсам, таким как видеокарта, например, которая доступна по сети через NVLink или GPUDirect.
- Один под в большинстве случаев занимают целиком узел полностью.
- Host-level контейнерная сеть.
- Маркируют пакеты через iptables, чтобы мониторить трафик по namespaces.
- Kube API и etcd на выделенных машинах в количестве 5 штук: полезные алерты статуса HTTP 429 (слишком много запросов) и 5xx (ошибка сервера сервера API) в качестве высокоуровневого индикатора проблем.
- Автомасштабирование кластера отсутствует, так как масштабирование в таких объемах приводит к резкому росту запросов в Kube API при вводе узла в кластер и перегружает API.
- Мониторинг ошибок железа.
🔬 Для задач машинного обучения и исследований требуется создание масштабируемой инфраструктуры для больших моделей, таких как GPT-3, CLIP и DALL·E, а также для быстрых мелкомасштабных итеративных исследований.
🚀 Масштабирование одного кластера Kubernetes до такого размера выполняется редко и требует особой осторожности, но плюсом является простая инфраструктура, которая позволяет командам машинного обучения двигаться быстрее и масштабироваться без изменения своего кода.
🔑 Ключевые тезисы:
- Для рабочей нагрузки задач машинного обучения требуется доступ ко всем низкоуровневым ресурсам, таким как видеокарта, например, которая доступна по сети через NVLink или GPUDirect.
- Один под в большинстве случаев занимают целиком узел полностью.
- Host-level контейнерная сеть.
- Маркируют пакеты через iptables, чтобы мониторить трафик по namespaces.
- Kube API и etcd на выделенных машинах в количестве 5 штук: полезные алерты статуса HTTP 429 (слишком много запросов) и 5xx (ошибка сервера сервера API) в качестве высокоуровневого индикатора проблем.
- Автомасштабирование кластера отсутствует, так как масштабирование в таких объемах приводит к резкому росту запросов в Kube API при вводе узла в кластер и перегружает API.
- Мониторинг ошибок железа.
Openai
Scaling Kubernetes to 7,500 nodes
We’ve scaled Kubernetes clusters to 7,500 nodes, producing a scalable infrastructure for large models like GPT-3, CLIP, and DALL·E, but also for rapid small-scale iterative research such as Scaling Laws for Neural Language Models.
👍3🔥1
CloudNativePG
CloudNativePG — это оператор с открытым исходным кодом, предназначенный для управления рабочими нагрузками PostgreSQL в любом поддерживаемом кластере Kubernetes, работающем в приватных, публичных, гибридных или мульти-облачных средах. CloudNativePG придерживается принципов и концепций DevOps, таких как декларативная конфигурация и неизменяемая инфраструктура.
CloudNativePG — это оператор с открытым исходным кодом, предназначенный для управления рабочими нагрузками PostgreSQL в любом поддерживаемом кластере Kubernetes, работающем в приватных, публичных, гибридных или мульти-облачных средах. CloudNativePG придерживается принципов и концепций DevOps, таких как декларативная конфигурация и неизменяемая инфраструктура.
cloudnative-pg.io
CloudNativePG
None
Forwarded from Мониторим ИТ
Say Hello to Grafana OnCall
Практический гайд по использованию Grafana OnCall. Сохраните, чтобы не потерять. Читать статью.
Используете у себя этот полезный инструмент для управления алертами?
Практический гайд по использованию Grafana OnCall. Сохраните, чтобы не потерять. Читать статью.
Используете у себя этот полезный инструмент для управления алертами?
Forwarded from Уютный IT адочек
При расследовании инцидентов в достаточно крупной экосистеме зачастую начинаются поиски сбоящего компонента. Один из способов это сделать — смотреть на HTTP-коды и двигаться по направлению к источнику. Получил 502 на фронте — ищешь кто вернул 502 ему, и так далее, до причины.
И это помогает и работает, пока мы не сталкиваемся с восхитительным кодом 499.
Гугл говорит нам, что смысл этой ошибки — client closed request. То есть она указывает, что наше приложение такое выполняло свою логику, готовило-готовило ответ, но при попытке отправить очередную порцию ответа получателю обнаружило, что тот уже закрыл соединение, отправлять некуда.
Неочевидная же мысль, следующая из этого — корневую причину нужно искать не глубже по цепочке вызовов, а ближе в “поверхности”, в получателе, разорвавшем соединение. Или в его получателе. И так вплоть до клиентского приложения.
Очень может быть причина — в каком-то timeout/keepalive-параметре или более крупный косяк (например, пришедший OOM). Если пофиксить проблему в клиенте — ошибки уйдут.
И это помогает и работает, пока мы не сталкиваемся с восхитительным кодом 499.
Гугл говорит нам, что смысл этой ошибки — client closed request. То есть она указывает, что наше приложение такое выполняло свою логику, готовило-готовило ответ, но при попытке отправить очередную порцию ответа получателю обнаружило, что тот уже закрыл соединение, отправлять некуда.
Неочевидная же мысль, следующая из этого — корневую причину нужно искать не глубже по цепочке вызовов, а ближе в “поверхности”, в получателе, разорвавшем соединение. Или в его получателе. И так вплоть до клиентского приложения.
Очень может быть причина — в каком-то timeout/keepalive-параметре или более крупный косяк (например, пришедший OOM). Если пофиксить проблему в клиенте — ошибки уйдут.
👍3