Используйте WebTorrent для загрузки медиа-объектов

Привет! Я администратор на https://discuss.pixls.us — сообществе фотографов, использующих свободное программное обеспечение. Нам повезло, что наши расходы покрываются за счёт пожертвований участников, но я не уверен, насколько долго это будет устойчивым по мере нашего роста. Я также очень серьёзно отношусь к обязанности тратить пожертвования людей и постоянно ищу способы снизить наши расходы.

Поскольку мы создаём изображения, наш форум крайне насыщен ими. Наши самые большие расходы — это трафик Amazon S3 (почти исключительно исходящий). Затраты на хранение в S3 крайне незначительны.

Было бы полезно загружать изображения и другие медиафайлы через webtorrent, как это сделано в Peertube.

Я вижу эту функцию в двух аспектах: (1) пользователи, посещающие сайт, загружают медиафайлы от других участников с помощью webtorrent; (2) некий RSS-канал, на который я могу подписаться в торрент-клиенте, чтобы пользователи могли стать «супер-сидерами», просто обеспечивая сайт трафиком.

1 лайк

Вы используете S3 без CDN :scream::scream::scream:

Вам действительно стоит настроить CDN, даже если это бесплатный тариф Cloudflare, чтобы разместить его перед загрузками в S3, иначе вы утонете в расходах на исходящий трафик. Если возможно, включите Origin Shield, чтобы ещё больше сократить исходящий трафик.

Ознакомьтесь с материалом Использование объектного хранилища для загрузок (клонирование S3).

5 лайков

Буквально только что ждал ответа от @Falco (:sweat_smile:), так как он отлично справился с приведением S3 к стандартам Discourse.

Я бы рассмотрел более дешёвый аналог S3. DigitalOcean Spaces — это стандартный выбор после S3, если у вас очень много данных. Возможно, стоит обратить внимание на игроков, специализирующихся на больших объёмах хранилища, таких как BlackBlaze или Wasabi, чтобы ещё больше снизить стоимость.

Это позволит устранить большую часть расходов на трафик, так как тарифы у них значительно ниже (Wasabi вообще не взимает плату за трафик).

Кроме того, для повышения производительности я бы добавил CDN. Я искал недорогой CDN, так как мой сообщество едва окупается через AdSense, и нашёл BunnyCDN. Он не самый быстрый, но справляется с задачей и быстро настраивается.

Реферальная ссылка на BunnyCDN :see_no_evil:

С такой настройкой вы значительно сократите расходы. Можно либо просто подключить CDN перед AWS S3, либо использовать другого провайдера S3 вместе с CDN.

Я полагаю, что @paperdigits знает точный объем исходящего трафика в месяц в счете AWS, поэтому мы можем использовать эти данные для расчета стоимости CDN.

Я бы остался на S3 и сначала просто добавил CDN.

6 лайков

Спасибо, я изучу CDN.

WebTorrent при этом ничего нам не будет стоить :wink:

Я почти уверен, что это обойдётся вам дороже, чем что угодно: вам потребуется настроить P2P-сеть, используя сервер Discourse (или seedbox) в качестве источника истины или основного раздачи для всего медиаконтента.

Такой seedbox должен обладать достаточными ресурсами для обработки каждого нового подключения, инициируемого каждым запросом, поскольку каждый медиафайл будет представлять собой отдельный torrent-файл. Я знаю, что WebRTC довольно эффективен, но установление подключения обычно является наиболее ресурсоёмкой частью веб-приложения.

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

3 лайка

У торрентов есть файл-раздатчик (seed file), поэтому, если файл недоступен в сварме, он загружается из другого источника, например из S3.

Приложение Discourse только отдаёт торрент- или магнет-ссылку, оно не занимается раздачей. Пользователи, у которых уже загружены изображения, раздают их, и дополнительно, если медиаактивы раздаются также традиционными клиентами BitTorrent, то могут использоваться и они. Торрент-клиент работает на стороне браузера/клиента, поэтому нагрузка на сервер сводится лишь к отдаче большего количества JavaScript-кода.

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

Вы продолжаете использовать S3 как основной источник для загрузки файлов, что на самом деле не сэкономит вам много денег.

Вам всё равно нужны сидеры для обслуживания соединений, и вам нужны ненадёжные сидеры из-за разной скорости интернета.

Конечно, вы можете добавить переключатель в диалоговом окне, включить эту опцию в настройки или использовать что-то вроде Privacy Badger, чтобы предотвратить загрузку этой библиотеки. Или можно определить, что браузер используется на мобильном устройстве, и полностью отключить эту функцию. Вариантов довольно много.

Это работает примерно как кэш. Если медиафайлы не раздают (seed), то данные загружаются из веб-источника (в нашем случае это S3). Однако, поскольку WebTorrent может также получать данные от традиционных торрент-клиентов, таких как Transmission, rtorrent и других, у нас может быть несколько раздающих (например, я), которые просто раздают множество файлов через домашнее подключение. На самом деле для жизнеспособности системы достаточно всего нескольких раздающих.

Действительно, но мы решим эту проблему силами сообщества.

Сейчас это уже не невозможно, вы просто усложнили функцию до уровня, который почти ни у одной функции не встречается. Например, команда Discourse просто отказалась от поддержки IE11 из-за головной боли, которую это вызывало при поддержке кода. Представьте себе подобную логику: возможно, если вы перейдете в раздел Marketplace, кто-то заинтересуется этим.

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

Что было обоснованно отклонено с четким и логичным объяснением (без жалоб с моей стороны).

Лично я бы не стал этим пользоваться и не заинтересован в том, чтобы заставить это работать. Проще, надежнее и дешевле разместить CDN перед этим и забыть об этом.

И базовый план Cloudflare тоже :wink: