Как Discord хранит миллиарды сообщений

Discord продолжает расти быстрее, чем мы ожидали, как и пользовательский контент. Чем больше пользователей — тем больше сообщений в чате. В июле мы объявили о 40 млн сообщений в день, в декабре объявили о 100 млн, а в середине января преодолели 120 млн. Мы сразу решили хранить историю чатов вечно, так что пользователи могут вернуться в любой момент и получить доступ к своим данным с любого устройства. Это много данных, поток и объём которых нарастает, и все они должны быть доступными. Как мы это делаем? Cassandra!
Что мы делали
Изначальную версию Discord написали быстрее чем за два месяца в начале 2015 года. Возможно, одной из лучших СУБД для быстрого выполнения итераций является MongoDB. Всё в Discord специально хранилось в едином реплисете (replica set) MongoDB, но мы также готовили всё для простой миграции в новую СУБД (мы знали, что не собираемся использовать шардинг MongoDB из-за его сложности и неизвестной стабильности). На самом деле это часть нашей корпоративной культуры: разрабатывай быстро, чтобы испытать новую функцию продукта, но всегда с курсом на более надёжное решение.
Сообщения хранились в коллекции MongoDB с единым составным индексом на channel_id и created_at . Примерно в ноябре 2015 года мы вышли на рубеж 100 млн сообщений в базе, и тогда начали понимать проблемы, которые нас ждут: данные и индекс больше не помещаются в ОЗУ, а задержки становятся непредсказуемыми. Пришло время мигрировать в более подходящую СУБД.
Выбор правильной СУБД
Перед выбором новой СУБД нам требовалось понять имеющиеся шаблоны чтения/записи и почему возникли проблемы с текущим решением.
- Быстро стало понятно, что операции чтения исключительно случайны, а соотношения чтение/запись примерно 50/50.
- Тяжёлые серверы голосовых чатов Discord практически не присылали сообщений. То есть они присылали одно или два сообщения каждые несколько дней. За год сервер такого типа вряд ли достигнет рубежа в 1000 сообщений. Проблема в том, что даже несмотря на такое малое количество сообщений, эти данные труднее доставлять пользователям. Просто возвращение пользователю 50-ти сообщений может привести к многим случайным операциям поиска на диске, что приводит к вытеснению дискового кэша.
- Тяжёлые серверы приватных текстовых чатов Discord отправляют приличное количество сообщений, легко попадая в диапазон между 100 тыс. и 1 млн сообщений в год. Запрашивают они обычно только самые последние данные. Проблема в том, что на этих серверах обычно менее 100 участников, так что скорость запроса данных низкая и вряд ли они будут в дисковом кэше.
- Большие публичные серверы Discord отправляют очень много сообщений. Там тысячи участников, отправляющих тысячи сообщений в день. Легко набираются миллионы сообщений в год. Они почти всегда запрашивают сообщения, отправленные в последний час, и это происходит часто. Поэтому данные обычно находятся в дисковом кэше.
- Мы знали, что в наступающем году у пользователей появится ещё больше способов генерировать случайные чтения: это возможность просматривать свои упоминания за последние 30 дней и затем перескакивать в тот момент истории, просмотр и переход к прикреплённым сообщениям и полнотекстовый поиск. Всё это означает ещё больше случайных чтений!
- Линейная масштабируемость — Мы не хотим пересматривать решение позже или вручную переносить данные в другой шард.
- Автоматическая отказоустойчивость — Нам нравится спать по ночам и делать Discord настолько самоисцеляющимся, насколько это возможно.
- Небольшая поддержка — Она должна работать сразу же, как мы её установим. От нас требуется только добавлять больше нод по мере увеличения данных.
- Доказано в работе — Мы любим пробовать новые технологии, но не слишком новые.
- Предсказуемая производительность — Нам отправляются сообщения, если время отклика API в 95% случаев превышает 80 мс. Мы также не хотим сталкиваться с необходимостью кэшировать сообщения в Redis или Memcached.
- Не хранилище блобов — Запись тысяч сообщений в секунду не будет отлично работать, если нам придётся непрерывно десериализировать блобы и присоединять к ним данные.
- Open source — Мы верим, что управляем собственной судьбой, и не хотим зависеть от сторонней компании.
Сделав выбор, нужно было доказать, что он действительно оправдан.
Моделирование данных
Лучший способ описать новичку Cassandra — это аббревиатура KKV. Две буквы “K” содержат в себе первичный ключ. Первая “K” — это ключ раздела. Он помогает определить, в какой ноде живут данные и где их найти на диске. Внутри раздела множество строк, и конкретную строку внутри раздела определяет вторая “K” — ключ кластеризации. Он работает как первичный ключ внутри раздела и определяет способ сортировки строк. Можете представить раздел как упорядоченный словарь. Все эти качества вместе взятые позволяют очень мощное моделирование данных.
Помните, что сообщения в MongoDB индексировались с использованием channel_id и created_at ? channel_id стал ключом раздела, поскольку все сообщения работают в канале, но created_at не даёт хорошего ключа кластеризации, потому что два сообщения могут быть созданы в одно время. К счастью, каждый ID в Discord на самом деле создан в Snowflake, то есть хронологически сортируется. Так что можно было использовать именно их. Первичный ключ превратился в (channel_id, message_id) , где message_id — это Snowflake. Это значит, что при загрузке канала мы можем сказать Cassandra точный диапазон, где искать сообщения.
Вот упрощённая схема для нашей таблицы сообщений (она пропускает примерно 10 колонок).
CREATE TABLE messages ( channel_id bigint, message_id bigint, author_id bigint, content text, PRIMARY KEY (channel_id, message_id) ) WITH CLUSTERING ORDER BY (message_id DESC);
Хотя схемы у Cassandra и похожи на схемы реляционных БД, их легко изменять, что не оказывает какого-либо временного влияния на производительность. Мы взяли лучшее от хранилища блобов и реляционного хранилища.
Как только начался импорт существующих сообщений в Cassandra, мы сразу увидели в логах предупреждения, что найдены разделы размером более 100 МБ. Да ну?! Ведь Cassandra заявляет о поддержке разделов 2 ГБ! По всей видимости, сама возможность не означает, что так нужно делать. Большие разделы накладывают сильную нагрузку на сборщик мусора в Cassandra при уплотнении, расширении кластера и т.д. Наличие большого раздела также означает, что данные в нём нельзя распределить по кластеру. Стало ясно, что нам придётся как-то ограничить размеры разделов, потому что некоторые каналы Discord могут существовать годами и постоянно увеличиваться в размере.
Мы решили распределить наши сообщения блоками (buckets) по времени. Мы посмотрели на самые большие каналы в Discord и определили, что если хранить сообщения блоками примерно по 10 дней, то комфортно вложимся в лимит 100 МБ. Блоки нужно получать из message_id или метки времени.
DISCORD_EPOCH = 1420070400000 BUCKET_SIZE = 1000 * 60 * 60 * 24 * 10 def make_bucket(snowflake): if snowflake is None: timestamp = int(time.time() * 1000) - DISCORD_EPOCH else: # When a Snowflake is created it contains the number of # seconds since the DISCORD_EPOCH. timestamp = snowflake_id >> 22 return int(timestamp / BUCKET_SIZE) def make_buckets(start_id, end_id=None): return range(make_bucket(start_id), make_bucket(end_id) + 1)
Ключи разделов Cassandra могут быть составными, так что нашим новым первичным ключом стал ((channel_id, bucket), message_id) .
CREATE TABLE messages ( channel_id bigint, bucket int, message_id bigint, author_id bigint, content text, PRIMARY KEY ((channel_id, bucket), message_id) ) WITH CLUSTERING ORDER BY (message_id DESC);
Для запроса недавних сообщений в канале мы сгенерировали диапазон блоков от текущего времени до channel_id (он тоже хронологически сортируется как Snowflake и должен быть старше, чем первое сообщение). Затем мы последовательно опрашиваем разделы до тех пор, пока не соберём достаточно сообщений. Обратная сторона такого метода в том, что изредка активным инстансам Discord придётся опрашивать много разных блоков, чтобы собрать достаточно сообщений со временем. На практике оказалось, что всё в порядке, потому что для активного инстанса Discord обычно находится достаточно сообщений в первом разделе, и таких большинство.
Импорт сообщений в Cassandra прошёл без помех, и мы были готовы опробовать её в производстве.
Тяжёлый запуск
Выводить новую систему в производство всегда страшно, так что хорошей идеей будет проверить её, не затрагивая пользователей. Мы настроили систему на дублирование операций чтения/записи в MongoDB и Cassandra.
Немедленно после запуска в баг-трекере появились ошибки, что author_id равен нулю. Как он может быть нулевым? Это обязательное поле!
Согласованность в конечном счёте
Cassandra — система типа AP, то есть гарантированная целостность здесь приносится в жертву доступности, что мы и хотели, в общем. В Cassandra противопоказано чтение перед записью (операции чтения более дорогие) и поэтому всё, что делает Cassandra, — это обновление и вставку (upsert), даже если предоставить только определённые колонки. Вы также можете писать в любую ноду, и она автоматически разрешит конфликты, используя семантику «последняя запись выигрывает» по каждой колонке. Так как это нас коснулось?
Пример состояния гонки редактирование/удаление
В случае, если пользователь редактировал сообщение, в то время как другой пользователь удалял то же самое сообщение, у нас появлялась строка с полностью отсутствующими данными, за исключением первичного ключа и текста, потому что Cassandra записывает только обновления и вставки. Для этой проблемы есть два возможных решения:
- Записывать обратно целое сообщение во время редактирования сообщения. Тогда есть возможность воскрешения удалённых сообщений и добавляются шансы конфликтов для одновременных записей в другие колонки.
- Выявить повреждённое сообщение и удалить его из базы.
Решая эту проблему, мы заметили, что были весьма неэффективны с операциями записи. Поскольку Cassandra согласована в конечном счёте, то она не может вот так взять и немедленно удалить данные. Ей нужно реплицировать удаления на другие ноды, и это следует сделать даже если ноды временно недоступны. Cassandra справляется с этим, приравнивая удаление к своеобразной форме записи под названием “tombstone” («надгробие»). Во время операции чтения она просто проскакивает через «надгробия», которые встречаются по пути. Время жизни «надгробий» настраивается (по умолчанию, 10 дней), и они навсегда удаляются во время уплотнения базы, если срок вышел.
Удаление колонки и запись нуля в колонку — это абсолютно одно и то же. В обоих случаях создаётся «надгробие». Поскольку все записи в Cassandra являются обновлениями и вставками, то вы создаёте «надгробие» даже если изначально записываете нуль. На практике, наша полная схема сообщения состояла из 16 колонок, но среднее сообщение имело только 4 установленных значения. Мы записывали 12 «надгробий» в Cassandra, обычно без всякой причины. Решение проблемы было простым: записывать в базу только ненулевые значения.
Производительность
Известно, что Cassandra быстрее выполняет операции записи, чем чтения, и мы наблюдали в точности это. Операции записи происходили в интервале менее миллисекунды, а операции чтения — менее 5 миллисекунд. Такие показатели наблюдались независимо от типа данных, к которым осуществлялся доступ. Производительность сохранялась неизменной в течение недели тестирования. Ничего удивительного, мы получили в точности то, чего ожидали.

Задержка чтения/записи, по данным из лога
В соответствии с быстрой, надёжной производительностью чтения, вот пример перехода к сообщению годичной давности в канале с миллионами сообщений:
Большой сюрприз
Всё прошло гладко, так что мы выкатили Cassandra как нашу основную базу данных и вывели из строя MongoDB в течение недели. Она продолжала безукоризненно работать… примерно 6 месяцев, пока однажды не перестала реагировать.
Мы заметили, что Cassandra непрерывно останавливается на 10 секунд во время сборки мусора, но совершенно не могли понять, почему. Начали копать — и нашли канал Discord, который требовал 20 секунд для загрузки. Виновником был публичный Discord-сервер подреддита Puzzles & Dragons. Поскольку он публичный, мы присоединились посмотреть. К нашему удивлению, на канале было только одно сообщение. В тот момент стало очевидно, что они удалили миллионы сообщений через наши API, оставив только одно сообщение на канале.
Если вы внимательно читали, то помните, как Cassandra обрабатывает удаления при помощи «надгробий» (упомянуто в главе «Согласованность в конечном счёте»). Когда пользователь загружает этот канал, хоть там одно сообщение, Cassandra приходится эффективно сканировать миллионы «надгробий» сообщений. Тогда она генерирует мусор быстрее, чем JVM может собрать его.
Мы решили эту проблему следующим образом:
- Уменьшили время жизни надгробий с 10 дней до 2 дней, потому что мы каждый вечер запускаем починку Cassandra (противоэнтропийный процесс) на нашем кластере сообщений.
- Изменили код запросов, чтобы отслеживать пустые блоки на канале и избегать их в будущем. Это значит, что если пользователь снова инициировал этот запрос, то в худшем случае Cassandra будет сканировать только самый последний блок.
Будущее
В данный момент у нас работает кластер из 12 нодов с коэффициентом репликации 3, и мы продолжим добавлять новые ноды Cassandra по мере надобности. Мы верим, что этот подход работоспособен в долговременной перспективе, но по мере роста Discord просматривается отдалённое будущее, когда придётся сохранять миллиарды сообщений в день. У Netflix и Apple работают кластеры с сотнями нодов, поэтому пока что нам не о чем волноваться. Однако хочется иметь пару идей про запас.
Ближайшее будущее
- Обновить наш кластер сообщений с Cassandra 2 на Cassandra 3. Новый формат хранения в Cassandra 3 может сократить объём хранения более чем на 50%.
- Более новые версии Cassandra лучше справляются с обработкой большего количества данных в каждом ноде. Мы сейчас храним примерно 1 ТБ сжатых данных в каждом из них. Думаем, что можно безопасно сократить количество нодов в кластере, увеличив этот лимит до 2 ТБ.
Отдалённое будущее
- Изучить Scylla — это СУБД, совместимая с Cassandra и написанная на C++. В нормальной работе наши ноды Cassandra в реальности потребляют немного ресурсов CPU, однако в непиковые часы во время починки Cassandra (противоэнтропийный процесс) они довольно сильно зависят от CPU, а время починки возрастает в зависимости от количества данных, записанных с момента прошлой починки. Scylla обещает значительно увеличить скорость починки.
- Создать систему для архивации неиспользуемых каналов в Google Cloud Storage и загрузки их обратно по требованию. Мы хотим избежать этого и не думаем, что такое придётся делать.
Заключение
Прошло уже больше года с момента перехода на Cassandra, и несмотря на «большой сюрприз», это было спокойное плавание. Мы вышли с более 100 миллионов общего количества сообщений на более чем 120 миллионов сообщений в день, сохранив производительность и стабильность.
Благодаря успеху этого проекта, с тех пор мы перенесли все остальные наши данные в производстве на Cassandra, и тоже успешно.
В продолжении этой статьи мы исследуем, как мы осуществляем полнотекстовый поиск по миллиардам сообщений.
У нас до сих пор нет специализированных инженеров DevOps (только четыре инженера бэкенда), так что очень классно иметь систему, о которой не приходится волноваться. Мы набираем сотрудников, так что обращайтесь, если подобные задачки щекочут ваше воображение.
- Высокая производительность
- Мессенджеры
- MongoDB
- Тестирование веб-сервисов
Офис в Discord. Наши лайфхаки по организации рабочего пространства студии в геймерском софте
Конкретные советы, полезные боты и наш практический опыт по работе в Discord.
На удаленке многие команды организовали свое рабочее пространство для общения в Discord, и мы не исключение. В этой статье поделимся опытом и конкретными лайфхаками, как мы смогли обойти все первоначальные неудобства Discord, и какие операции в этом мессенджере можно упростить и автоматизировать.
Почему Discord?
На VC уже вышло минимум 2 классных обзорных материала про переход на этот софт: от Владимира Золотарева из Kode и Петра Доронина из Multiways. Во многом именно они вдохновили нас на переход из ненавистного многими Slack. А еще, Discord абсолютно бесплатный – для любого количества сотрудников. Но главная проблема в том, что это всё-таки сервис для геймеров, и ни одна служба поддержки или дружелюбный FAQ не предложат вам советы по тому, как решать рабочие вопросы быстро и безболезненно с помощью встроенных функций программы.
При переходе на новый софт вопросов у сотрудников практически не возникло: интерфейс интуитивно понятен, а мы заранее создали необходимые чаты, назначили ответственных и написали методички. Discord стал лучшим другом сотрудников, которым нужно только отправить сообщение и что-то обсудить голосом. Но в любом корпоративном мессенджере функций должно быть больше, и Discord не так нативен, чтобы сразу эти функции обнаружить.
Совет 1. Анализируй
Чтобы понять основные запросы команды, после того, как все освоились, мы провели опрос и выяснили, чего не хватает в Discord и какие функции наши коллеги не смогли найти. В результате мы получили список запросов к Discord, часть из которых смогли решить, и делимся этим решением с вами.
Для начала, сразу скажем, какие проблемы Discord не позволяет решить простым способом (или мы не нашли этот способ и будем рады вашим решениям в комментариях):
- Пересылать сообщения между чатами
- Формировать ветки сообщений
- Получать отчет о прочтении сообщения собеседником
- Настроить автоматическое выключение уведомлений в нерабочее время
- Вставлять гиперссылки в слова в обычных сообщениях
- Копировать текст сообщения с сохранением форматирования
- Отправлять стикеры
- Отправлять отложенные личные сообщения
- Отправлять голосовые сообщения
- А еще тут слетает кириллица в названиях файлов…
Совет 2. Властвуй
А теперь о более веселом – как и что мы смогли решить. Вот основные функции, которые мы смогли организовать в Discord:
- Отправлять себе напоминания (даже о сообщениях, как в Slack)
- Закреплять сообщения в чате
- Отмечать сообщения непрочитанными
- Форматировать сообщения
- Устраивать голосования
- Просматривать все передаваемые файлы и ссылки в чате
- Делать повторяющуюся рассылку в чатах
Это позволило нам закрыть несколько самых популярных болей, которые коллеги отметили в опросе:
- «Достали уведомления!»
- «Постоянно боюсь, что я сижу в голосовом чате и у меня включен микрофон»
- «У значка Discord висит красный шарик, но я не могу найти непрочитанные сообщения»
- «Не могу найти черновик сообщения в личке!»
- «При отправке фоток с телефона каждую приходится искать в галерее заново»
- «Фото из чата очень сложно сохранять на компьютер»
Все эти проблемы в Discord мы решали двумя путями: разобрались в имеющихся настройках и возможностях более подробно или подключили бота.
Совет 3. Подключай
Боты расширяют функционал Discord и делают вашу жизнь значительно легче. Они не добавляют дополнительные кнопки и работают через команды: нужно написать боту или собеседнику, например, !help в каком-нибудь чате, и бот среагирует на нее и выполнит привязанную к этой команде функцию.
Чтобы установить определенного бота, нужно зайти на сайты с ботами (1, 2), найти подходящего по функционалу и нажать «установить». Дальше бот сам подскажет, как закончить установку. Учитывайте, что для установки бота вам нужны права на управление ролями сервера и, собственно, установку ботов.
На нашем сервере установлено 2 бота: Carl bot и Groovy bot.
Groovy разнообразил наш рабочий процесс: с его помощью мы сделали голосовой канал с радио, где постоянно крутится музыка – довольно бесполезно, но очень приятно 🙂
А вот милейшая черепашка по имени Карл реально помогает нам в рабочих вопросах. Какие задачи решает Carl Bot:
1. Распределяет новых работников по ролям. У нас все работники разделены по отделам: аккаунт-менеджеры, дизайнеры, проектные менеджеры и т.д. Чтобы вручную не распределять новых сотрудников по ролям, мы сделали небольшой welcome-чат, в котором при нажатии на определенную реакцию сотруднику назначается роль и он сразу попадает в чат отдела.
2. Напоминает о сообщениях (как в Slack) и не только. В переписке с Карлом можно сделать свою собственную площадку с напоминалками. А если в текст напоминания поместить ссылку на сообщение, то Карл напомнит и о нем!
Пошаговая инструкция, как создать напоминание с помощью Карла
• Зайти в личную переписку с carl-bot (написать ему в личку как любому человеку из команды)
• Написать боту следующую команду (обычным текстом):
!rm временной_отрезок ссылка_или_текст
пояснение:
временной_отрезок устанавливает, через сколько нужно прислать напоминание, выражается в минутах 1m, часах 1h и/или днях 1d
ссылка_или_текст – любой текст, который должно содержать напоминание
пример:
чтобы получить от Карла через 1 день 15 минут напоминание о выгуле собаки, напиши Карлу в личку:
!rm 1d15m выгулять пёселя
и через 1 день 15 минут тебе об этом напомнит Карл в той же личке
3. Отправляет еженедельные напоминания для коллег в чатах. Более сложные функции Карл позволяет использовать в отдельном окне браузера, а не через текстовые команды: так проще работать с настройками отправляемых в чаты сообщений. И еженедельные напоминания как раз одна из таких функций. Каждую пятницу мы просим наших коллег рассказать о том, как прошла неделя: какие проекты закрылись, как над ними работалось. Карл помогает нам не тратить время на еженедельную отправку сообщений со сбором отчетов. У него есть функция Autofeed, в которой можно задать оформление отправляемого поста, время, дату и периодичность отправки. Описывать порядок настройки нет смысла, потому что браузерная версия Карла интуитивно понятна: нужно только найти необходимую вкладку в списке функций и заполнить соответствующие поля.
4. Создает красивые опросы. На них можно отвечать с помощью реакций – очень удобно! Эта функция работает только в чатах на сервере. Указанные команды нужно написать прямо в тексте сообщения в нужном чате.
Пошаговая инструкция, как создать опрос с помощью Карла
Для вопросов с вариантами ответа да/нет, написать в нужном чате команду
!poll текст_вопроса
Подставить сам вопрос вместо текст_вопроса
Для вопросов с любым количеством ответов любого формата, написать в нужном чате команду
!quickpoll текст_вопроса | вар1 | вар2 | вар3
Написать сам вопрос вместо текст_вопроса, а затем написать варианты ответа, разделяя их одним из знаков: , или |
Совет 4. Не тупи!
Все остальные проблемы мы решили, просто разобравшись в кнопках и настройках. Для кого-то эти советы могут оказаться немного кэповскими, но кнопок и настроек в Discord так много, что иногда действительно нужна дополнительная инструкция. Рассказываем основные:
- Форматирование сообщений. На этапе отправки сообщения можно форматировать. Для этого нужно просто выделить необходимый текст мышкой, чтобы открылось меню редактирования. Далее можно сделать текст жирным, курсивом или зачеркнутым, оформить текст как цитату, как код, или скрыть часть сообщения под спойлером (тогда текст станет виден только после нажатия на закрытую область).
- Работа с отправленными сообщениями. Если навести мышку на сообщение и нажать на три точки справа, откроется полное меню. Можно редактировать уже отправленное сообщение (только свое), отметить сообщение непрочитанным, скопировать ссылку на конкретное сообщение и попросить робота зачитать сообщение вслух.
- Поиск среди сообщений. Он расположен в верхней панели в Discord. Здесь можно не просто найти сообщение по слову, но и посмотреть все передаваемые ссылки, файлы и изображения в любом чате.
- Список непрочитанных уведомлений. На той же панели можно посмотреть список непрочитанных уведомлений. Если висит красный шарик на значке Discord, но найти непрочитанные сообщения трудно, то можно зайти во вкладку «Почта» в правом верхнем углу окошка.
- Имитация тредов. В Discord можно закреплять сообщение в канале – на сервере эта функция доступна только тем пользователям, у которых есть права на управление сообщениями. Сообщение появится в меню закрепленных сообщений в верхней части чата. Так можно сделать подобие треда: закрепить первое сообщение темы, чтобы быстро к нему вернуться при необходимости.
- Настройка уведомлений. Во-первых, можно настроить все уведомления приложения. Эта функция доступна в настройках аккаунта, во вкладке «Уведомления». Здесь можно отключить уведомления о конкретных действиях, настроить время бездействия (через какое время бездействия аккаунта на компьютере уведомления начнут приходить на телефон) и т.д. Во-вторых, можно отключить уведомления конкретного сервера или чатов – навсегда или на время. Для этого нужно нажать правой кнопкой мыши на сервер или текстовый канал, и в выпавшем меню можно заглушить уведомления или настроить конкретные оповещения.
- Режим рации. Эта функция отлично помогает от паранойи включенного микрофона. В настройках аккаунта, во вкладке «Голос и видео» в разделе «Режим ввода» можно включить «Режим рации». В этом режиме, даже при включенном микрофоне, пользователя будет слышно только при нажатии и удержании заданной клавиши (CAPS LOCK, например).
- Отправка нескольких фотографий с телефона. В Discord при отправке фото открывается предпросмотр последних ~20 сделанных фотографий, а если нужно поискать дальше, то каждое фото придется выбирать каждый раз вручную, пролистывая папки снова и снова… Поэтому лучше всего зайти в галерею, отметить нужные фото, и уже оттуда экспортнуть их нужному человеку в Discord.
- Сохранение фото на компьютер. Чтобы сохранить фотографию в исходном качестве, нужно открыть ее в чате, нажать снизу слева «открыть оригинал» и в окне браузера скачать фотографию. Но если исходник не нужен и достаточно менее качественной превьюшки, можно просто перетащить фотографию из чата на рабочий стол или в любую другую папку – так сохранить картинку намного быстрее.
Совет 5. Помогай
Мы только познаем Discord и точно знаем: его можно улучшать и дальше. Например, использовать вебхуки, дополнительные сервисы интеграций вроде Zapier, а можно даже научиться кодить и сделать нового бота под свои нужды. Будем рады, если наш опыт и инструкции упростят вашу работу. Если вы тоже задумались о переходе на этот софт, то мы искренне рекомендуем вам подготовить понятную инструкцию для сотрудников. Шаблон для инструкции в формате ppt можно бесплатно скачать в нашем Телеграм-канале.
А если вы уже стали Discord-гуру, делитесь своими лайфхаками в комментариях!
Как прочитать все сообщения ВКонтакте сразу
Активно используя диалоги на сайте социальной сети ВКонтакте, вы могли сталкиваться с проблемой, когда скапливается множество непрочитанных сообщений. В этой статье мы расскажем обо всех доступных на сегодняшний день методах их прочтения.
Веб-сайт
Если вы относитесь к числу пользователей полной версии ВК, возможно прибегнуть сразу к нескольким способам. При этом все они не являются взаимоисключающими.
Способ 1: Tool 42
Лучший на сегодняшний день метод прочтения всех сообщений ВКонтакте заключается в использовании расширения Tool 42 для интернет-браузера Google Chrome, позволяющего осуществить данную процедуру практически моментально вне зависимости от количества диалогов. Однако учтите, метод распространяется сразу на все переписки без возможности управления или отката.
Шаг 1: Подготовка расширения
- Кликните по выше представленной ссылке и на официальной странице расширения нажмите кнопку «Установить». Для инсталляции также потребуется выполнить подтверждение через всплывающее окно.

- После этого на верхней панели Хрома должна будет появиться новая иконка, иногда отображающаяся только при открытии главного меню «…». Так или иначе, щелкните по данной пиктограмме левой кнопкой мыши и на представленной странице нажмите «Авторизоваться через ВКонтакте».

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

Шаг 2: Прочтение сообщений
- Закончив с подготовкой и наконец оказавшись в главном меню Tool 42, разверните пункт «Сообщения» в блоке «Категории». Отсюда необходимо перейти в раздел «Прочитать сообщения».
Дальше начнется проверка списка диалогов, обычно заканчивающаяся моментально. Однако задержки все же могут быть при слишком большом количестве переписок.
Если расширение не обнаружит подходящие диалоги, будет выдано соответствующее уведомление. 
- При успешном завершении поиска на странице «Прочитать сообщения» отобразится общее количество непрочитанных переписок, управлять выбором которых по-отдельности невозможно. Для прочтения же попросту нажмите кнопку «Прочитать все».
Как было упомянуто ранее, прочтение происходит моментально и в случае успеха завершается на странице с иконкой галочки. После этого вкладку можно закрыть и проверить диалоги на сайте ВКонтакте. 
Представленное расширение, к сожалению, доступно только для Google Chrome, в то время как поддержка других веб-браузеров не была и скорее всего не будет предусмотрена разработчиком. Но несмотря на это, в качестве альтернативы вы все же можете воспользоваться одноименным приложением для мобильных устройств на платформах Android и iOS, следуя этой же инструкции из-за полностью идентичного управления.
Способ 2: AutoVK
Рассматриваемая программа предназначена для пользователей операционной системы Виндовс и может быть вами использована, если предшествующий метод по каким-либо причинам не устраивает лично вас. При этом доверять стороннему разработчику свои данные от аккаунта или нет – решать также должны вы сами.

- Откройте указанный сайт и кликните по кнопке «Скачать AutoVK Single».
- Завершив загрузку инсталлятора, установите и запустите программу.
Примечание: В бесплатной версии присутствует реклама и ограничение некоторых возможностей.



Для работы с сообщениями покупка программы не требуется.
- Дважды кликните по значку с подписью «Сообщения».

- Вверху открывшегося окна найдите блок «Фильтры» и выставите значения на свое усмотрение.

- Исходя из темы статьи, вам в обязательном порядке потребуется выбрать в указанном нами списке пункт «Непрочитанные» и нажать рядом расположенную кнопку «Загрузить».

- После загрузки данных в блоке «Опции списка» кликните по кнопке «Выделить все» или выберите нужные переписки самостоятельно.

- С правой стороны в списке «Опции с отмеченными» нажмите кнопку «Отметить прочитанными». То же самое можно сделать через нижнее меню программы.

- По окончании работы AutoVK Single предоставит уведомление, а все письма ВК будут прочитаны.

В случае возникновения проблем с каким-либо описанным средством – обращайтесь к нам в комментариях.
Способ 3: Стандартные средства
Возможности сайта ВКонтакте позволяют вам читать сообщения, но только по одному диалогу за раз. Таким образом, действия из данного способа вам нужно будет повторить ровно столько раз, сколько непрочитанных диалогов скопилось.
Через главное меню откройте страницу «Сообщения» и в общем списке по очереди откройте нужные переписки. При наличии множества непрочитанных диалогов, показанных вперемешку с обычными, можно выполнить сортировку, переключившись на вкладку «Непрочитанные» через меню в правой части страницы.

Главным преимуществом данного метода является возможность самостоятельно выбирать диалоги, которые требуется сделать прочитанными. При этом их целостность не будет как-либо нарушена, в отличие от действий из следующего раздела.
Способ 4: Удаление
В этом случае вам нужно обратиться к одной из наших статей и, руководствуясь методами множественного удаления, избавиться от всех непрочитанных диалогов. Актуальность данного метода продиктована тем, что зачастую необходимость прочтения всех сообщений возникает лишь в случае с теми из них, что являются ненужными.

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

- В предпочтительном порядке откройте сообщения, рядом с которыми имеется значок непрочитанных.

Как бы то ни было, это единственный возможный вариант, доступный в стандартном приложении на сегодняшний день. При этом ранее рассмотренное расширение ViKey Zen может быть установлено и в качестве отдельного приложения на мобильные устройства, но нужные возможности там временно отсутствуют.
Мы же надеемся, что вам удалось достичь желаемого результата и завершаем данную статью.
Как удалить все сообщения сразу в Discord
Приложение Discord – идеальное место для общения с друзьями и создания сплоченного сообщества. Однако когда приходится управлять собственным сервером, могут возникать различные ситуации, с которыми ранее вы не встречались. Одна из административных проблем – управление старыми текстами. В статье разберем, как удалить все сообщения в Дискорде сразу, можно ли это делать одновременно встроенными инструментами, и как помогут решить эту задачу боты.

Как удалить все сообщения в Discord сразу, а не по одному
Ситуации могут быть совершенно разными, соответственно и методы можно применить различные. Например, вы можете закрыть переписку с одним из юзеров, хранение диалогов которой уже неактуально. Однако этот способ чреват тем, что как только один из ее участников напишет сообщение, все появится снова. Инструкция будет следующей:
- На панели слева нажмите на пункт с диалогами.
- Выберите переписку, которую будете удалять.
- Наведите курсор мышкой на название чата.
- Появится иконка в виде крестика, нажмите на него.
Текущая беседа будет полностью удалена. Но не забывайте, что как только в этом чате одна из сторон напишет сообщение, все восстановится. Есть вариант полностью убрать сообщения, и очистить данные безвозвратно. Но в этой методике используется поочередное удаление посланий, а не одновременное.

Стандартная встроенная опция предусмотрена в мессенджере именно для того, чтобы удалять тексты по одному. Выполняется это таким образом:
- В списке диалогов выберите нужный.
- Откройте данную переписку.
- Наведите курсор на текст сообщения, справа находятся три точки, тапните на них.
- В контекстном меню нажмите на строку «Удалить сообщение».
- После этого всплывет окно с уведомлением, где нужно подтвердить свое действие кнопкой «Удалить».
Поочередно удаляя сообщения, вы сможете полностью очистить свой чат с пользователем. Затем просто удалите его, как это описано ранее. Минус этой методики – большие временные затраты. Но во встроенных инструментах иных вариантов не предусмотрено. Этот же способ используйте для очистки реплик на сервере в текстовом канале.

Как удалить сообщения одновременно на своем сервере
Если же вы владеете своим сервером, и вам требуется очистить текстовые чаты в нем, то поможет приглашение специального бота. С этой задачей отлично справится бот Mee6, имеющий в своих параметрах команду «! Clear».
Она удалит последние 100 сообщений в конкретном канале. После команды поставьте @ и скопируйте имя пользователя. Еще одна команда «! ясно хх Удалить хх последние сообщения» позволяет очистить до 1000 текстовых отправлений.

Но для владельцев сервера предусмотрена альтернативная помощь, если бота у вас нет. Инструмент позволяет удалить текстовой канал на созданном вами сервере. Алгоритм будет следующим:
- Выберите сервер, щелкнув правой кнопкой мышки, перейдите в раздел настроек.
- В дополнительном меню нажмите пункт «Удалить канал».
- Подтвердите свое действие.
В этом случае вернуть всю переписку уже не получится. Зато такой способ удаляет все сообщения одновременно, не используя ручное поштучное удаление текстов.
Частые вопросы:
- Как удалить личные сообщения в Дискорд Онлайн
- Как в Discord удалить переписку и личные сообщения с телефона
- Как удалить переписку с человеком в Дискорд Онлайн
- Что такое Дискорд Онлайн, и как им пользоваться