{"id":14263,"url":"\/distributions\/14263\/click?bit=1&hash=b4dc4ce4b906960991e4705d10ce304ff5052bead202f1bda35bfb08e31596b1","title":"\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u043e\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0447\u0451\u0440\u043d\u044b\u0439","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"edca0fea-02f8-5eb8-ae8c-3678b2acc040"}

Как не уронить свой сервис под нагрузкой, на примере Signal

Люди массово переходят из вацапа в Signal. Серверы Signal не выдержали и совсем лежали почти 14 часов, а испытывали серьезные трудности больше суток. Не лучшее время, чтобы падать :( Официальный твиттер сигнала при этом хранил молчание, будто это не модный стартап, а какая-то древняя корпорация. Жаль. Надеюсь, позже они опубликуют подробный разбор, что случилось. Пока поделюсь, как мы однажды сами положили свои серверы и как от этого защищаемся теперь.

Почти все мобильные приложения отправляют запросы на сервер, например, для оформления заказа или отправки сообщения. Важно, как себя ведут мобильные приложения, если сервер ответил с ошибкой. Очевидное решение — просто повторить запрос ещё раз, как только получил ошибку, незаметно для пользователя.

В одном проекте именно так мы и сделали. Всё было хорошо, пока серверу не стало плохо на пару минут. Если обычно на сервер приходили 100 запросов в минуту (полтора запроса в секунду), то за три минуты скопились 300 запросов и теперь, стоило серверу очухаться, как ему насыпали все 300 запросов в одну секунду. То есть для сервера это выглядело как рост нагрузки в 200 раз и он опять ложился под нагрузкой. Очень неприятная ситуация. Мы сами себя задидосили, своими же собственными мобильными приложениями. 🙈

Есть две компоненты решения этой проблемы:

🛑 Первая: сервер должен уметь ответить «довольно!», и клиенты должны перестать повторять запрос, если получили такой ответ. Интересно, что именно этой функции в Android-клиенте Signal не было и они добавили её во время аварии.

⏱ Вторая, более сложная и интересная, но тоже классическая: exponential backoff (экспоненциальная задержка). Идея очень простая: если сервер не ответил в первый раз — ждем 1 секунду и повторяем запрос. Во второй раз — ждем 2 секунды, в третий — 4, в четвертый — 8. То есть с каждой неуспешной попыткой, даем серверу больше времени прийти в себя. У Signal эта функция реализована, но во время аварии они добавили jitter — небольшую случайную задержку, чтобы клиенты не набегали на серверу толпой, через одинаковые интервалы времени после его падения, а нагрузка была более плавной. Обычно, в этом же коде реализуют ещё паттерн circuit breaker, когда после определённого числа ошибок «выбивает пробки» и запросы прекращаются совсем.

Используйте оба приема и будьте здоровы!

💭 Есть твит и телеграм-пост в популярном канале, в которых утверждается, что причина падения сигнала — в само-дидосе (мол, анекдот). Это маловероятно. Во первых, exponential Backoff в сигнал внедрили больше 2 лет назад и он здорово распределяет нагрузку; во вторых, изменения коснулись только Android клиента. Не верьте советским газетам, читайте первоисточники.

0
13 комментариев
Написать комментарий...
Андрей Болконский

Автор вообще не в теме.
  
Signal это nonprofit organization, он никогда не был "модным стартапом" , это реально энтузиасты безопасности с открытым аудированным кодом. Это честные ребята, которые работают за идею, а не ради денег в отличие от Дурова и его хайпа. Там долгие годы всего 4 человека было и существуют они на донаты, как википедия. Сейчас чуть популярнее стали, поэтому 30 человек в штате. 

Так что ничего удивительного что серверы падали и винить их в этом нельзя. 

Ответить
Развернуть ветку
Икс Маска

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

Только уже при регистрации пытаются вас сразу идентифицировать по номеру телефона!

Пока вы пользуетесь сервисами и мессенджерами в которых есть регистрация по номеру телефона – вы полностью открыты и 100% ваши данные НЕ конфиденциальны! Даже если вы зарегистрируетесь в мессенджере на «левый» номер телефона, но среди ваших друзей будет хотя-бы один, кто зарегистрирован на идентифицированный номер телефона, то и вы автоматически становитесь идентифицированным пользователем.

Задайте себе вопросы: «Почему так важно идентифицировать пользователей?», «Почему некоторые страны периодически запрещают/разрешают различные мессенджеры?»

Это все потому, что ВСЯ ваша переписка и транскрибированные в текст аудио сообщения и звонки никого не интересуют до момента, пока в вашем коммуникационном графе не появится 1 пользователь прямо или косвенно связанный с террористической деятельностью (при этом доказывать факт такой деятельность не обязательно - достаточным основанием является «highly likely»-предположение).

Если бы пользователям было позволено оставаться анонимным, то перехват их данных со стороны мессенджеров имел бы значительно меньший смысл.

Ответить
Развернуть ветку
Андрей Болконский

И да и нет. Я понимаю почему большинство мессенджеров оставляют регистрацию по номеру - без этого не найти людей из своих контактов, а без этого нет сетевого эффекта. Такой мессенджер не станет хоть мало мальски популярным. Навскидку только threema да всякая экзотика типа matrix работали без привязки к номеру.

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

Ответить
Развернуть ветку
Uranus In Fire

В вотсап - разве? Сколько раз менял смартфон, ни разу не сохранялись история переписок, как раз таки пустой апп получается. Синхронизацию на гугл.диск не подключаю, даи с ней пароль от гугл.акка нужен.

Ответить
Развернуть ветку
Андрей Болконский

Я исходил из худшего, что юзер хочет удобства и включает бэкапы сообщений.

Ответить
Развернуть ветку
Икс Маска

RE: «юзер хочет удобства и включает бэкапы сообщений»
—-
Что там юзер «включает/отключает/удаляет» - это не имеет значения! Еще раз повторю для тех, кто в танке: ВСЯ ваша переписка и транскрибированные в текст аудио сообщения и звонки хранятся на серверах мессенджеров и доступ к ней (по запросу компетентных органов) может быть получен даже после удаления вашей учетной записи.

Ответить
Развернуть ветку
Федя и Самат
Автор

Риск не в сообщениях, риск в потере анонимности. Но американцам этого не понять, вот поэтому и не делают.

Ответить
Развернуть ветку
Федя и Самат
Автор

Автор в теме, сути не меняет.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Андрей Болконский

Вы это серьезно ? )) 

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Никита Гришанов

В лабораторных условиях нет такой нагрузки, а нагрузочное тестирование делают далеко не все.

Ответить
Развернуть ветку
10 комментариев
Раскрывать всегда