Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Игра «История одной фермы» - увлекательное и бросающее вызов вашим серым клеточкам приключение, от которого невозможно оторваться!

История одной фермы - маджонг

Маджонг, Казуальные, Приключения

Играть

Топ прошлой недели

  • AlexKud AlexKud 40 постов
  • unimas unimas 13 постов
  • hapaevilya hapaevilya 2 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
6
Dedero
4 месяца назад
Лига программистов

Rate limiter спасёт ваше приложение⁠⁠

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

Итак, ваше приложение падает под нагрузкой. Нужно что-то делать, но вертикальное масштабирование дорогое, горизонтальное сложное, а кэш уже не помогает? Rate limiter спешит на помощь!

Зачем и как?

Rate limiter тарифицирует количество запросов, чтобы вашим приложением не злоупотребляли боты или реальные люди. Помните тот момент, когда вы третий раз просите прислать смс у сервиса, а вам говорят, что пришлют только через какое-то время? Или вы несколько раз вводите неверно логин и пароль, а сервис в ответ просит подождать некоторое время? Rate limiter работает по похожему принципу, но у него под капотом может много больше алгоритмов, которые мы разберём.

Какие бывают?

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

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

Внешний rate limiter

Внутренний rate limiter расположен внутри вашего приложения, может работать как middleware.

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

Внутренний rate limiter

Главное отличие в том, что внутренний может работать как библиотека на вашем языке программирования, либо вы сами можете его написать, а внешний может работать с любым стэком, особенно это актуально для приложений, которые написаны на скриптовых языках. Например, у вас приложение на php, а rate limiter написан на rust. Это даёт огромную производительность при небольших затратах.

Алгоритмы

Token Bucket

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

Работает так: есть ведро с токенами, оно пополняется с фиксированной скоростью, но есть потолок токенов, каждому запросу выдаётся токен. Если токенов не осталось, то есть ведро пусто, тогда запрос отклоняется.

Leaky Bucket

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

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

Fixed Window

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

На определённый промежуток времени, окно, мы позволяем пройти определённому количество запросов, остальные отбрасываются.

Sliding Window

Rate limiter спасёт ваше приложение IT, Интернет, Программирование, Backend, Длиннопост

Отличается от предыдущего тем, что окно постоянно скользит во времени. Если Fixed Window на границах окна резко обнуляет лимит, то Sliding Window делает это плавно, двигаясь во времени, сглаживая нагрузку.

Это не все алгоритмы, но самые часто используемые, остальные вы можете разобрать сами.

А чтобы поиграть с рабочим rate limiter зайдите на мой гитхаб, я написал внешний rate limiter с этими 4 алгоритмами. Не забудьте поставить звёздочку.

Показать полностью 7
IT Интернет Программирование Backend Длиннопост
8
13
Dedero
4 месяца назад
Так себе работа

Как я устроился на валютную удалёнку⁠⁠

Привет, меня зовут Илья, занимаюсь разработкой бэкенд приложений.

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

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

Обычно по собеседованию можно определить насколько технически сильна компания. Это собеседование было достаточно жёстким, но без лайв-кодинга, ответы на некоторые вопросы я не знал, например, что PostgreSQL хранит в себе статистику времени запросов и можно определить самые долгие запросы, или, что есть не только физическое разделение (шардирование), но и логические разделение (партиции). В общем, интервью для меня оказалось полезным и я блеснул знаниями, но было несколько моментов, которые меня смутили, но не обратил на них внимания, а стоило. Я был так окрылён, что это валютная удалёнка, что совсем забыл о мерах предосторожности. Первое - это легаси проект с разными технологиями (ruby, elixir, go). Второе - это аутсорс, переходящий из рук в рук, стало быть там огромный технический долг.

После пары дней мне пришёл оффер, я также подумал пару дней и принял, предварительно договорившись, что мне понадобиться неделя, чтобы открыть ИП и расчётный счёт. Поскольку санкции актуальны, то ИП надо было открывать во внешнем контуре, выбирал между двумя странами: Грузия и Киргизия. В Грузии налог 1%, в Киргизии 2%, но поскольку я уже был в Киргизии и там остались незавершённые дела, то полетел туда. ИП открыл за день, открывают в момент обращения. С открытием расчётного счёта оказалось сложнее, большинство банков не хочет открывать счёт, если вы гражданин РФ и занимаетесь IT. В итоге открыл счёт в Doscredobank. Оглядываясь назад, понимаю, что если заранее знать все тонкости, то можно уложиться в один день - утром прилетел, сделал и вечером улетел.

Вернувшись на родину я радостный сообщил, что можем начинать работу. И начался онбординг, где неожиданно узнал, что работаем по трекеру - на свою машину надо установить тулзу, которая трекает время, активность (мышь, клавиатура), какие приложения и на какие сайты ходите, а также периодически делает скриншоты. Тогда я знатно приуныл сразу на встрече, мне стоило отказаться, но да, это тот самый эффект, когда вложил так много, что отказаться уже не можешь. Забегая вперёд скажу, что если у вас есть проблема с постоянным сменой контекста, то это может помочь, поскольку видно, что вы делаете, это держит в тонусе.

Вернёмся к проекту. Сервисы связаны между собой RabbitMQ, у некоторых отдельная БД, у кого-то базы данных нет совсем, но дублируют данные в S3 на случай сбоя, чтобы восстановить, и это также является пайплайном, то есть в одном сервисе сохранят в S3, в другом достают из S3. Используется и REST и Graphql для внешних и внутренних сервисов, для фронта и бэка. Есть своя БД с OpenStreetMap, но для гео-данных также используется несколько провайдеров. Всё это крутиться в Kubernetes. И над всем этим колдует только один разработчик, вторым был я.

Достаточно быстро я понял, что проект полумёртвый, дышит только за счёт искусственных средств. Readme давно не обновлялись, засетапить проект - уже боль, второй разработчик вместо докера всю инфру развернул локально, все его действия по сетапу нигде не описаны, пришлось потратить пару часов вместе с ним в лайве, чтобы просто запустить проект. Ну, и начались сыпаться задачи, которые я, вроде как, начал решать. Самое унизительно, помимо трекера, что "тестов мы не пишем", отлавливать баги надо из веб ui, а дебажить через REPL.

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

Несомненный плюс работы контрактором в том, что вы можете разорвать трудовые отношения одним днём. Теперь у меня открыто ИП и расчётный счёт в другой стране, всё также нет работы. И самое забавное, что после отправки денег по свифту, компании вернулись деньги, но на $50 меньше, а мой банк говорит, что перевод ему не поступал и вообще, разбирайся сам.

Парам-парам-пам.

Показать полностью
[моё] Программирование Backend IT Программист Удаленная работа Текст
13
7838
rovercrimea
rovercrimea
5 месяцев назад
Скриншоты комментов

А ты с какой стороны дедлайна?⁠⁠

#comment_341682400

А ты с какой стороны дедлайна? Комментарии на Пикабу, Скриншот, Backend, Дедлайн
Показать полностью 1
Комментарии на Пикабу Скриншот Backend Дедлайн
127
5223
KOPOBOPOTEHb
KOPOBOPOTEHb
5 месяцев назад
Противозачаточные шутки

Девушка хочет в бэкэнд⁠⁠

Девушка хочет в бэкэнд Из сети, Юмор, Мужчины и женщины, Backend, Скриншот, Комментарии
Показать полностью 1
Из сети Юмор Мужчины и женщины Backend Скриншот Комментарии
216
3
DropTrigger
DropTrigger
5 месяцев назад
Серия Записки вкатуна

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT)⁠⁠

Термины в статье:

  1. Эндпоинт

  2. Аутентификация, Регистрация, JWT, Access, Refresh

К стеку добавился:

  • Vue.js

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Дописываю API

Потратив 2 ночи (и немного терпения), я наконец завершил реализацию всех эндпоинтов! В какой-то момент это очень наскучило, но я все равно продолжал писать их.

Как выглядят эндпоинты в этой статье - Создаю онлайн-сервис для чтения книг. День 4. Обработка первого запроса.

Архитектура папок теперь выглядит вот так:

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Всего реализовано 38 эндпоинтов , и это еще не конец — их количество будет расти! Последний из них ощущался как будто я пробежал марафон.


Разработка дизайна 🎨

Но как делать веб без дизайна? Верно, никак! 🤔
Зайдя в Figma и подсмотрев интерфейс GitHub'а , я накидал ориентировочный дизайн страниц регистрации и входа.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост
Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Верстка 🖥️

Верстка — это немного рутинное занятие, но результат того стоит!
Могу сказать, что получилось почти идентично дизайну.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Frontend с Vue.js

Почему Vue.js ? Просто такие условия 🙃. Если бы выбор был за мной, я бы взял React .

Добавлю в решение новый проект Веб-приложение ASP.NET Core (MVC) . Стандартный шаблон создаст такие папки:

  • wwwroot
    Это корневая папка для статических файлов, которые будут доступны напрямую через браузер.

  • Controllers
    Папка содержит классы контроллеров, которые управляют маршрутизацией.

  • Models
    Папка содержит модели данных, которые представляют сущности приложения.

  • Views
    Папка содержит представления — файлы, которые отвечают за отображение HTML-страниц пользователю.

В папку wwwroot/lib добавлю клиентскую библиотеку Vue.js .

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Создам новый контроллер для страниц аутентификации.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

В папке Views есть еще 2 папки:

  • Home

  • Shared

В папку Shared добавлю новый шаблон страницы Razor с названием _LoginLayout для страниц аутентификации.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Создам папку Auth, добавив туда пустую страницу Razor с названием _ViewStart. Этот файл указывает какой шаблон будут использовать страницы.

@{

Layout = "_LoginLayout";

}

Теперь закину в wwwroot/css свой файл со стилем, который наверстал.


Логика фронтенда 🧠

Начну со страницы входа, добавив HTML-разметку, которую наверстал.

Снизу файла напишу блок скриптов:

@Section scripts {

<script src="~/lib/vue/vue.global.js"></script>

<script>

...тут будут все скрипты...

</script>

}

Пример запроса на бэкенд:

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

На скрине показан метод ассинхронный метод login(), в нем реализована отправка запроса на эндпоинт /auth/login, если запрос проходит успешно, я записываю Access-токен в локальное хранилище и перенаправляю пользователя на страницу по адресу /home. В противном случае я показываю ошибку пользователю.

В ответе сервера я получаю Access и Refresh токены.

  • Access-токен записываю в локальное хранилище.

  • Refresh-токен храню в Http-only куках для большей безопасности 🛡️.

Пример записи куки на сервере:

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Здесь я записал новую куку с под названием refreshToken, и значением, равным Refresh-токену.

Вообще для чего мне Refresh-токен, если есть Access? Все очень просто, у Access-токена срок жизни 15 минут, поэтому через 15 минут его необходимо будет сгенерировать заново. Для этого как раз и понадобится Refresh-токен.

По истечению Access-токена я буду посылать на сервер запрос со своими куками. Сервер прочитает Refresh-токен из них и, если он валидный, вернет новый Access-токен.

Как это реализовано со стороны сервера:

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Со стороны клиента:

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

При загрузке страницы сразу же срабатывает метод checkRefreshToken, далее отправляется запрос на /auth/refresh. Если сервер возвращает положительный ответ, записываю новый Access в локальное хранилище и продолжаю пользоваться сервисом.

Тестирование 🧪

Запущу бэкенд и фронтенд.

После запуска я сразу попадаю на страницу входа.

Войду в аккаунт, который я создвал еще на начальных этапах.

Если сейчас обратиться по адресу /home, меня перекинет назад на страницу авторизации.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Попробую сначала ввести неправильный пароль.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

Теперь введу правильный пароль. Все сработало! Я попал на домашнюю страницу.

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

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

Создаю онлайн-сервис для чтения книг. День 6-9. CRUD, Дизайн+Верстка, Frontend(JWT) Разработка, Программирование, Aspnet, Frontend, Backend, Длиннопост

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

Показать полностью 15
[моё] Разработка Программирование Aspnet Frontend Backend Длиннопост
3
1
DELETED
5 месяцев назад
Лига программистов

Функциональная масштабируемость: что это и как ее достичь⁠⁠

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

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

💡Ключевая идея: вы не добавляете ресурсы всей системе целиком, а сосредотачиваетесь на отдельных частях, которые нуждаются в увеличении мощности.

Почему это важно?
1️⃣ Экономия ресурсов. Масштабируя только загруженные модули, вы не тратите деньги на те части системы, которые работают в штатном режиме.
2️⃣ Гибкость. Вы можете использовать разные подходы для разных модулей в зависимости от их задач.
3️⃣ Устойчивость. Проблемы в одном модуле не затрагивают работу всей системы.

Основные подходы к реализации
🔸 Микросервисная архитектура.
Система разбивается на множество небольших сервисов, каждый из которых выполняет одну задачу и может масштабироваться отдельно.
💡 Пример: в интернет-магазине сервис обработки заказов можно масштабировать отдельно от сервиса рекомендаций.

🔸 Асинхронное взаимодействие между модулями.
Использование асинхронного обмена данными между модулями позволяет разгрузить систему и ускорить выполнение задач.
💡 Пример: вместо ожидания ответа от сервиса платежей модуль заказов ставит задачу в очередь и продолжает работу.

🔸 Использование очередей сообщений.
Очереди сообщений (например, RabbitMQ, Kafka) помогают организовать взаимодействие между модулями, чтобы избежать перегрузки и сбалансировать нагрузку.
💡 Пример: сервис обработки изображений получает задачи из очереди и обрабатывает их, не перегружая систему.

🔸 Serverless-архитектура для изолированных задач.
Serverless (например, AWS Lambda, Google Cloud Functions) подходит для задач, требующих обработки большого числа событий или коротких операций.
💡 Пример: при загрузке файла serverless-функция может автоматически обрабатывать его (например, сжимать или анализировать) без необходимости держать постоянный сервер.

Преимущества функциональной масштабируемости
✔️ Повышение производительности: вы можете оперативно масштабировать только те части системы, которые испытывают нагрузку.
✔️ Устойчивость к сбоям: изолированные модули упрощают локализацию и устранение проблем.
✔️ Ускорение разработки: команды могут работать над отдельными модулями независимо друг от друга.

Заключение
Функциональная масштабируемость — это путь к созданию современных, эффективных и устойчивых систем. Выбор подхода зависит от задач вашей системы, но главное правило остается неизменным: разделяйте и властвуйте!

#scaling #технологии #backend

Функциональная масштабируемость: что это и как ее достичь Кросспостинг, Технологии, Backend, Длиннопост
Показать полностью 1
Кросспостинг Технологии Backend Длиннопост
2
DELETED
5 месяцев назад
Лига программистов

Горизонтальная масштабируемость: ключ к мощным системам⁠⁠

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

Что такое горизонтальная масштабируемость?
Горизонтальная масштабируемость (Horizontal Scaling) — это способ увеличения мощности системы за счёт добавления новых серверов. Вместо того чтобы "усиливать" один сервер, нагрузка распределяется между несколькими узлами, работающими параллельно.
Пример: если сервер обрабатывает 10 000 запросов в секунду, но вам нужно обрабатывать 30 000, вы добавляете ещё два сервера, и каждый из них берёт свою долю.

Как это работает?
1️⃣ Балансировка нагрузки
Балансировщик равномерно распределяет запросы между всеми доступными серверами. Это защищает систему от перегрузки.
2️⃣ Распределение данных
Данные делятся между узлами с помощью шардирования или репликации, что ускоряет доступ к ним.
3️⃣ Кэширование
Популярные данные сохраняются в распределённом кэше, чтобы уменьшить нагрузку на базу данных.
4️⃣ Облачная инфраструктура
В облаке можно динамически добавлять или удалять ресурсы в зависимости от текущей нагрузки.

Преимущества
✅ Неограниченный рост производительности
Чем больше серверов, тем больше запросов система может обработать.
✅ Отказоустойчивость
Если один сервер выходит из строя, другие продолжают работать.
✅ Гибкость
Легко добавлять или убирать мощности по мере необходимости.

Минусы
❌ Сложность управления
С увеличением количества узлов система становится сложнее в администрировании. Требуется настройка и поддержка балансировщиков, распределённых баз данных и кэшей.
❌ Задержки при синхронизации
При работе с распределёнными данными может возникать задержка из-за необходимости синхронизации между серверами.
❌ Увеличение расходов
Каждый новый узел требует дополнительных затрат на инфраструктуру, лицензии и мониторинг.
❌ Повышенные требования к архитектуре
Для правильной работы системы нужно учитывать особенности горизонтального масштабирования на этапе проектирования.

Горизонтальная масштабируемость — это фундамент для построения мощных, отказоустойчивых и гибких систем. Но не забывайте, что её реализация требует грамотного подхода и ресурсов. Если ваша система сталкивается с ограничениями, возможно, пора задуматься о переходе на этот метод! 🚀

#scaling #технологии #backend

Горизонтальная масштабируемость: ключ к мощным системам Кросспостинг, Технологии, Backend
Показать полностью 1
Кросспостинг Технологии Backend
0
Партнёрский материал Реклама
specials
specials

Проголодались?⁠⁠

Тогда вам срочно нужно сыграть в три простых игры на везение. За победу раздаем промокоды на заказ пиццы и других аппетитных блюд. Попробуете?

Игры Награда Удача Текст
5
zhizait
zhizait
5 месяцев назад

Иногда полезно устроить внеплановый корпоратив⁠⁠

Иногда полезно устроить внеплановый корпоратив IT, Работа, Корпоратив, Backend, Тимлид, Разработчики, Истории из жизни, Telegram (ссылка)

Источник: «Жиза ИТ руководителя»

Показать полностью 1
IT Работа Корпоратив Backend Тимлид Разработчики Истории из жизни Telegram (ссылка)
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии