37.1K subscribers
1.46K photos
33 videos
5 files
1.62K links
加入频道
👣 Тестовое задание для стажера в юнит Market Intelligence

Нужно реализовать HTTP сервис для голосования. Например, для выбора самого популярного покемона. UI не нужен, достаточно сделать JSON API сервис. Должна быть возможность:

Задача

Нужно реализовать HTTP сервис для голосования. Например, для выбора самого популярного покемона. UI не нужен, достаточно сделать JSON API сервис. Должна быть возможность:

Создать новое голосование с разными вариантами ответов
Отдать свой голос за какой-либо вариант
Получить текущий результат голосования

Реализовать методы:

- POST /api/createPoll/ создать голосование c вариантами ответов
- POST /api/poll/ проголосовать за конкретный вариант: <poll_id, choice_id>
- POST /api/getResult/ получить результат по конкретному голосованию: <poll_id>

Структура и формат входных и выходных данных на ваше усмотрение.

Описание идеального решения
Задание декомпозировано, составлен иерархический список работ. Каждый пункт из этого списка может быть реализован за небольшое время.
Составлена схема архитектуры со всеми сущностями и их связями в Miro
Код слабо связан, функции не имеют побочных эффектов
История коммитов осмысленная. По ней видно, в каком порядке решалась задача.
Покрытие тестами >70%

Требования
Язык: Go
Результаты голосования должны храниться в базе данных. Мы обычно используем PostgreSQL и MongoDB, но можно выбрать любую другую.
Код нужно выложить на github (просьба не делать форк этого репозитория, чтобы не плодить плагиат)
Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой docker-compose up
Сервис должен отвечать на 8000 порту

Усложнения
Написаны тесты (постарайтесь достичь покрытия в 70% и больше)
Опишите, как изменится архитектура, если мы ожидаем большую нагрузку (Реализация не требуется)
Опишите, как можно защититься от накруток (Реализация не требуется)
Попробуйте оценить, какую нагрузку в RPS сможет выдержать ваш сервис

Что будет оцениваться
Декомпозиция задачи (например, в виде вложенного списка подзадач)
Архитектура решения
Корректность реализации
Подход к тестированию
Понятность инструкций и документации
Codestyle

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 conc: better structured concurrency for go

conc — это ваш набор инструментов для структурирования конкуренции в Go, который делает обычные задачи проще и безопаснее.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Pagoda — набор инструментов для быстрой и простой фуллстек-разработки на Go. Под капотом: echo, ent, Postgres, Redis, htmx, Alpine.js и Bulma.

git clone [email protected]:mikestefanello/pagoda.git
cd pagoda
make up


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DevOps
🖥 Введение в Docker для начинающих

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

Чтобы сохранить собственную репутацию, я начал производить отладку. Проект не запускался потому, что тому человеку нужно было обновить программное обеспечение, чтобы у него работали новые функции. Я помог ему в этом, и, о чудо, всё заработало!

А теперь представьте, если бы мне нужно было разослать данный проект не одному человеку, а десятерым. Тогда мне пришлось бы помогать каждому, перенастраивать их компьютеры, чтобы новые функции успешно работали. Думаю, я бы испытал огромный стресс…

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

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

➡️ Читать дальше

@DevOPSitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 WebPty

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

brew install abdfnx/tap/tran

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Разбираемся с работой шлюза API на Golang: на примере одного симпатичного платья

Какое чудесное платье! Стоит только поискать платья в веб-пространстве, как потом практически невозможно избежать интернет-рекламы с новыми моделями. Что же происходит при нажатии на такие коммерческие предложения? Мы попадаем на сайт магазина, где представлена подробная информация о товаре. Но вот вопрос: эти данные поступают из одного и того же сервиса или собираются из разных сервисов и отправляются пользователям? В статье мы рассмотрим второй вариант, а именно шлюз API.

➡️ Читать дальше

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Backend Clean Architecture

Пример Go проекта с чистой архитектурой на базе Gin, mongo go driver, JWT viper, bcrypt, testify, mockery и других пакетов.

Вы можете использовать этот проект в качестве шаблона для создания вашего проекта на Go.

$ cd your-workspace

# Clone this project into your workspace
$ git clone https://github.com/amitshekhariitbhu/go-backend-clean-architecture.git

# Move to the project root directory
$ cd go-backend-clean-architecture


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 cdule (pronounce as Schedule)

Библиотека планировщика заданий с поддержкой базы данных

go get github.com/deepaksinghvi/cdule

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 Gh-prx

Расширение GitHub (gh) CLI для автоматизации повседневной работы с ветками, коммитами и запросами на GO.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳🚢 Docker-Kubernetes-101

Инструкция и подход к развертыванию проектов с использованием Docker и Kubernetes.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 webpty

WebPty - проект на Go, который позволяет запускать серверный терминал из браузера. Работает с любого Linux-сервера с любой программой.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание для Mail.Ru Group

Текст задания:
Процессу на stdin приходят строки, содержащие интересующие нас URL. Каждый такой URL нужно дернуть и посчитать кол-во вхождений строки "Go". В конце работы приложение выводит на экран общее кол-во найденных строк "Go" во всех переданных URL, например:

$ echo -e 'https://golang.org\nhttps://golang.org\nhttps://golang.org' | go run 1.go
Count for https://golang.org: 9
Count for https://golang.org: 9
Count for https://golang.org: 9
Total: 27


Введенный URL должен начать обрабатываться сразу после вычитывания и параллельно с вычитыванием следующего. URL должны обрабатываться параллельно, но не более k=5 одновременно.

Обработчики url-ов не должны порождать лишних горутин, т.е. если k=1000 а обрабатываемых URL-ов нет, не должно создаваться 1000 горутин.

Нужно обойтись без глобальных переменных и использовать только стандартные библиотеки.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание для GoLang-разработчика

Описание задания
Необходимо разработать приложение, предоставляющее HTTP API для получения данных о парковках такси в г. Москва. Данные необходимо брать с этой страницы ("Актуальная версия").

Описание необходимого функционала
Приложение должно реализовывать:

Функционал загрузки данных из файла (локального и/или по ссылке) в хранилище данных (данные на источнике могут как удаляться, так и добавляться);

Обслуживание HTTP запросов к API-endpoints, которые реализуют поиск по хранимым данным;
Обслуживание HTTP запросов к роуту, возвращающему метрические данные (в формате prometheus) работы приложения.

Обновление данных в хранилище должно происходить без остановки обслуживания HTTP запросов к API с учетом того, что их объем может быть очень большим (и маппинг данных на источнике может изменяться).

Методы HTTP API должны возвращать ответ в формате json. Время обработки одного запроса к HTTP API (не загрузка данных в хранилище) - не более 2 мс. до первого байта HTTP ответа (TTFB). Проектирование самих методов API - на ваше усмотрение (минимально необходимый функционал - это поиск по global_id, id и mode).

Метрические данные должны включать в себя как минимум следующие метрики:

Общее количество обработанных запросов к API-endpoints;
Количество ошибок обработки HTTP запросов к API-endpoints (плюсом будет "разведение" по различным кодам ответов);
Данные по времени обработки HTTP запросов к API-endpoint;
Дополнительные метрики, на ваше усмотрение.

Требования к реализации

В качестве хранилища данных необходимо использовать Redis;
Все функции (экспортируемые и не экспортируемые) должны сопровождаться понятным комментарием (если возможно - на английском языке);
Не стоит излишне сокращать имена переменных и констант - код пишется для людей, и он должен быть максимально простым и понятным;
Можно использовать любые сторонние пакеты, но не использовать какой-либо фреймворк;
Весь ключевой функционал должен быть зафиксирован unit-тестами;
После завершения работы над заданием необходимо написать сопроводительную документацию по работе с приложением в файле README.md в корне репозитория;
Конфигурация параметров подключения к хранилищу данных должна иметь возможность управляться как флагами запуска, так и переменными окружения. Возможности конфигурирования должны быть описаны в файле README.md вашего репозитория.

Плюсами будут являться
Настройка CI (силами GitHub actions, TravisCI, etc) выполняющая запуск тестов и сборки на каждый коммит;
Автоматическая сборка Docker-образа с приложением;
Интуитивно-понятное разбитие коммитов - одной конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);
Написание всех текстов коммитов - на английском языке.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 GoReplay — это инструмент для мониторинга сети с открытым исходным кодом, который может записывать ваш трафик в реальном времени и использовать его для теневого копирования, нагрузочного тестирования, мониторинга и подробного анализа.

🖥 Github
📝 Документация

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Задание на разработку сервиса "Анти-брутфорс"

Общее описание
Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе.

Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку.

Предполагается, что сервис используется только для server-server,т.е. скрыт от конечного пользователя.

Алгоритм работы

Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, например:

не более N = 10 попыток в минуту для данного логина.
не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force).
не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT).

Для подсчета и ограничения частоты запросов, можно использовать например алгоритм leaky bucket. Или иные аналогичные: https://en.wikipedia.org/wiki/Rate_limiting

Причем сервис будет поддерживать множество bucket-ов, по одному на каждый логин/пароль/ip.

Bucket-ы можно хранить:

в памяти (в таком случае нужно продумать удаление неактивных bucket-ов, чтобы избежать утечек памяти).
во внешнем хранилище (например redis или СУБД, в таком случае нужно продумать производительность).

White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом:

Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true);
Если - в blacklist, то отклоняет (ok=false).

Архитектура

Микросервис состоит из API, базы данных для хранения настроек и black/white списков. Опционально - хранилище для bucket'ов. Сервис должен предоставлять GRPC или REST API.

Описание методов API
Попытка авторизации

Запрос:

login
password
ip

Ответ:

ok (true/false) - сервис должен возвращать ok=true, если считает что запрос нормальный и ok=false, если считает что происходит bruteforce.

Сброс bucket
Должен очистить bucket-ы соответствующие переданным login и ip.

login
ip

Добавление IP в blacklist
подсеть (IP + маска)
Удаление IP из blacklist
подсеть (IP + маска)
Добавление IP в whitelist
подсеть (IP + маска)
Удаление IP из whitelist
подсеть (IP + маска)

Достаточно IPv4
Пример подсети: 192.1.1.0/25 - представляет собой адрес 192.1.1.0 с маской 255.255.255.128
Во время работы сервиса при поступлении очередного IP мы проходимся по подсетям в черных и белых списках и вычисляем, принадлежит ли IP одной из них.

Конфигурация
Основные параметры конфигурации: N, M, K - лимиты по достижению которых, сервис считает попытку брутфорсом.

Command-Line интерфейс
Необходимо так же разработать command-line интерфейс для ручного администрирования сервиса. Через CLI должна быть возможность вызвать сброс бакета и управлять whitelist/blacklist-ом. CLI может работать через GRPC/HTTP интерфейс.

Развертывание
Развертывание микросервиса должно осуществляться командой make run (внутри docker compose up) в директории с проектом.

Тестирование
Рекомендуется выделить модуль обработки одного bucket и протестировать его с помощью unit-тестов.

Так же необходимо написать интеграционные тесты, проверяющие все вызовы API.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 ACP

Минималистичный инструмент командной строки на GO
для передачи файлов P2P.


🖥 Github
📝 Инструкция

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 CROC

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

обеспечивает сквозное шифрование 
обеспечивает простую межплатформенную передачу (Windows,Mac, Linux)
поддерживает прокси
позволяет передавать сразу несколько файлов
позволяет возобновить прерванные передачи
локальный сервер или перенаправление портов не требуется

#golang #go #shell

🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 VBalancer

VBalancer - это проект, направленный на создание гибкой и масштабируемой системы балансировки нагрузки.

Он реализует функциональность, поддерживающую на данный момент стратегию Round Robin. VBalancer является одной из свободно-распространяемых утилит, которые можно использовать, чтобы увеличить производительность, доступность, надежность и расширяемость работы сетевых служб.

Основные преимущества проекта:

удобно расширять сетевую инфраструктуру, через конфигурационный YMAL файл добавляя или удаляя конечные сетевые узлы

в проекте реализован Dockerfile что позволяет легко развернутьVBalancer в облаке

гибко настраиваемое логирование в CSV формате (может писать логи по времени или по объемы), а так же их архивировать

на сайте проекта уже есть готовые бинарные файлы под любую платформу: Linux/MacOS/Win

проект написан на GO

git clone https://github.com/microup/vbalancer.git

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Задание на разработку демона, осуществляющего "Системный мониторинг"

Общее описание

Демон - программа, собирающая информацию о системе, на которой запущена, и отправляющая её своим клиентам по GRPC.

Архитектура
GRPC сервер;
допускается использование временных (/tmp) файлов;
статистика хранится в памяти, долговременное хранение не предусмотрено.

Требования
Необходимо каждые N секунд выдавать информацию, усредненную за последние M секунд.

Например, N = 5с, а M = 15с, тогда демон "молчит" первые 15 секунд, затем выдает снапшот за 0-15с; через 5с (в 20с) выдает снапшот за 5-20с; через 5с (в 25с) выдает снапшот за 10-25с и т.д.

N и M указывает клиент в запросе на получение статистики.

Что необходимо собирать:

Средняя загрузка системы (load average).

Средняя загрузка CPU (%user_mode, %system_mode, %idle).

Загрузка дисков:

-tps (transfers per second);
-KB/s (kilobytes (read+write) per second);

Информация о дисках по каждой файловой системе:

-использовано мегабайт, % от доступного количества;
-использовано inode, % от доступного количества.
Top talkers по сети:

- по протоколам: protocol (TCP, UDP, ICMP, etc), bytes, % от sum(bytes) за последние M), сортируем по убыванию процента;
-по трафику: source ip:port, destination ip:port, protocol, bytes per second (bps), сортируем по убыванию bps.

Статистика по сетевым соединениям:

- слушающие TCP & UDP сокеты: command, pid, user, protocol, port;
-количество TCP соединений, находящихся в разных состояниях (ESTAB, FIN_WAIT, SYN_RCV и пр.).

Разрешено использовать только стандартную библиотеку языка Go!
Команды, которые могут пригодиться:

$ top -b -n1
$ df -k
$ df -i
$ iostat -d -k
$ cat /proc/net/dev
$ sudo netstat -lntup
$ ss -ta
$ tcpdump -ntq -i any -P inout -l
$ tcpdump -nt -i any -P inout -ttt -l
Статистика представляет собой объекты, описанные в формате Protobuf.

Информацию необходимо выдавать всем подключенным по GRPC клиентам с использованием однонаправленного потока.

Выдавать "снапшот" системы можно как отдельными сообщениями, так и одним жирным объектом.

Сбор информации, её парсинг и пр. должен осуществляться как можно более конкурентно.

Конфигурация

Через аргументы командной строки можно указать, на каком порту стартует сервер.
Через файл можно указать, какие из подсистем сбора включены/выключены.
Тестирование

Юнит-тесты
по возможности мок интерфейсов и проверка вызовов конкретных методов;
тесты вспомогательных функций и пр.

Интеграционные тесты

потестировать факт потока статистики, можно без конкретных цифр;
можно посоздавать файлы, пооткрывать сокеты и посмотреть на изменение снапшота.

Клиент

Необходимо реализовать простой клиент, который в реальном времени получает и выводит в STDOUT статистику по одному из пунктов (например, сетевую информацию) в читаемом формате (например, в виде таблицы).

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 ChatGPT-bot

Реализация Telegram бота с ChatGPT на GO.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM