backend developer, java, go
Алгоритмы быстрой обработки HTTP-строк
Александр Крижановский (krizhanovsky) основатель и системный архитектор Tempesta Technologies, эксперт в области высокопроизводительных вычислений в Linux/x86-64. Александр расскажет об особенностях структуры HTTP-строк, объяснит, почему стандартные библиотеки плохо подходят для их обработки, и представит решение Tempesta FW.
Под катом: как HTTP Flood превращает ваш HTTP-парсер в узкое место, проблемы x86-64 с branch mispredictions, кэшированием и не выровненной памятью на типичных задачах HTTP-парсера, сравнение FSM с прямыми переходами, оптимизация GCC, автовекторизация, strspn()- и strcasecmp()-like алгоритмы для HTTP-строк, SSE, AVX2 и фильтрация инъекционных атак с использованием AVX2.
Многопоточная сортировка с использованием пула потоков на Java
- Массив разбивается на части
- Каждая часть массива сортируется
- Идем по упорядоченным массивам, сливаем их в один
Здесь применяются идеи сортировки слиянием, но массив разбивается только на две части (рекурсия не используется).
Для слияния можно использовать следующую функцию:
Как начинающему инвестору законно снизить налоги: 4 работающих способа

Изображение: Unsplash
Во времена нестабильной ситуации на рынках у инвесторов появляется естественное желание минимизировать затраты. В том числе, благодаря снижению налоговой нагрузки. Сегодня мы разберем несколько практических способов законного снижения налогов, которые подойдут начинающим биржевым инвесторам.
Маршалинг и анмаршалинг нестандартных форматов дат в Go
Думаю, многие согласятся, что работа с датами практически в любом языке программирования это невероятная головная боль. Дата и время не десятичны, часовые пояса — господи, почему они не могут быть просто целыми — ну и конечно бесчисленное множество форматов даты и времени. Можно, конечно, возразить, что мол есть ISO 8601 и чего тебе дураку ещё надо, но давайте, положа руку на сердце, скажем — как часто вам доводилось сталкиваться с соблюдением этого стандарта в сторонних API? Не знаю, как с этим обстоят дела за рубежом, надеюсь, в комментариях мне подскажут, но на постсоветских просторах ситуация — обнять и плакать. Каждый использует свой собственный, только ему удобный, формат времени и даты и разбирайся с этим как хочешь.
Я расскажу про собственный опыт и про найденное решение.
Шаблон backend сервера на Golang — часть 1 (HTTP сервер)
UPD. Ссылка на новый репозиторий проекта с поддержкой развертывания в Kubernetes
Представленный ниже шаблон сервера на Golang был подготовлен для передачи знаний внутри нашей команды. Основная цель шаблона, кроме обучения — это снизить время на прототипирование небольших серверных задач на Go.
Шаблон включает:
- Передачу параметров сервера через командную строку github.com/urfave/cli
- Настройка параметров сервера через конфигурационный файл github.com/sasbury/mini
- Настройка параметров TLS HTTP сервера
- Настройка роутера регистрация HTTP и prof-обработчиков github.com/gorilla/mux
- Настройка уровней логирования без остановки сервера github.com/hashicorp/logutils
- Настройка логирования HTTP трафика без остановки сервера
- Настройка логирования ошибок в HTTP response без остановки сервера
- HTTP Basic аутентификация
- MS AD аутентификация gopkg.in/korylprince/go-ad-auth.v2
- JSON Web Token github.com/dgrijalva/jwt-go
- Запуск сервера с ожиданием возврата в канал ошибок
- Использование контекста для корректной остановки сервера и связанных сервисов
- Настройка кастомной обработки ошибок github.com/pkg/errors
- Настройка кастомного логирования
- Сборка с внедрением версии, даты сборки и commit
Вторая часть посвящена прототипированию REST API.
Третья часть посвящена развертыванию шаблона в Docker, Docker Compose, Kubernetes (kustomize).
Пятая часть посвящена оптимизации Worker pool и особенностям его работы в составе микросервиса, развернутого в Kubernetes.
Ссылка на репозиторий проекта.
Основы надежной передачи данных
Вопросы к собеседованию Java-backend, Java core (60 вопросов)

Добрый день! Представляю вашему вниманию список вопросов к собеседованию Java Backend, которые я оформлял на протяжении около 2х лет.
Вопросы разбиты по темам: core, collections, concurrency, io, exceptions, которые задают основные направления хода технического собеседования. Звездочками отмечен субъективный (с точки зрения автора) уровень сложности вопроса, в сноске спойлера — краткий ответ на вопрос. Ответ представляет для интервьювера правильное направления развития мысли кандидата.
HTTP-заголовок Feature-Policy и контроль поведения веб-страниц в браузерах

Этот заголовок — сравнительно новая возможность, которая позволяет разработчику сделать так, чтобы во время просмотра его сайта включались и отключались некоторые возможности браузера.
Например, можно сообщить браузеру о том, что он не должен позволять использовать API Geolocation, передав ему следующий заголовок:
Feature-Policy: geolocation 'none'У использования заголовка
Feature-Policy есть, с точки зрения безопасности и производительности, множество плюсов. Но мне сейчас особенно нравится то, как Feature-Policy можно использовать для того, чтобы сделать более заметными проблемы производительности сайтов, которые обычно легко проглядеть. Это можно сравнить с чем-то вроде «линтинга производительности». В частности, речь идёт о выявлении проблем с изображениями, используемыми в веб-проектах.Функциональные опции на стероидах

Функциональные опции — это парадигма в Go для чистых и расширяемых API. Она популяризирована Дейвом Чейни и Робом Пайком. Этот пост о практиках, которые появились вокруг шаблона с тех пор как он был впервые представлен.
Функциональные опции появились как способ создания хороших и чистых API с конфигурацией, включающей необязательные параметры. Есть много очевидных способов сделать это (конструктор, структура конфигурации, сеттеры и т. д.), но когда нужно передавать десятки опций они плохо читаются и не дают на выходе таких хороших API, как функциональные опции.
Структуры данных: список, который умеет всё*
Структур данных, которые реализуют список полно. У всех есть свои достоинства и недостатки. Например в мире Java — в зависимости от необходимых операций — можно использовать:
- add(obj), get(obj), set(index, obj): базовый набор почти всех списков, например ArrayList.
- add(index, obj): структуры в виде дерева, например TreeList из apache common-collections.
- remove(index): то же, что и выше.
- contains(obj), indexOf(obj): можно использовать связку ArrayList и HashMap.
- remove(obj): … затрудняюсь ответить. В некоторых случаях можно обойтись LinkedHashSet. Решается тривиально при наличии предыдущих двух пунктов, но какие структуры могут и то и другое быстро?
Когда мне понадобилась структура с быстрыми add(obj), get(index), remove(index) и indexOf(obj), то google не дал ответа. Ни примеров кода, ни описания подобных структур я не нашел. Возможно не там искал, пришлось выдумывать самому. Но если кто-то скинет ссылку в комментариях, то буду весьма признателен.
Возможно, кто-то догадался, что можно взять TreeList, который умеет быстро вставлять/удалять элементы в середине списка и добавить к нему HashMap из объекта в индекс в TreeList для быстрого выполнения indexOf(obj). И это будет простое, изящное, но неверное решение. Ведь при добавлении в середину или удалении из середины нужно будет пересчитать индексы, в среднем, для половины элементов. Это ухудшит производительность до O(n).
Дальше я расскажу о структуре данных, которая может всё из перечисленного выше. Которая выполняет любую операцию над одним элементом за O(log(n)) времени. Ну почти — за логарифм выполняется в том случае, когда все объекты в списке различны. Если в списке есть одинаковые объекты, то возможно проседание производительности вплоть до O(log(n) ^ 2).
Go vs Python. Виталий Левченко
Предлагаю ознакомиться с расшифровкой доклада Виталия Левченко Go vs Python
Go — волшебное слово, решение всех проблем продакшна разом и одновременно негодная технология без эксепшнов. Истина посередине, поэтому поговорим о конкретных примерах:
- asyncio vs горутины;
- производительность узких мест;
- лаконичность vs простота кода;
- порог входа;
- тулинг и паттерны поиска проблем и оптимизации производительности;
- обслуживание в продакшне.
Как мы оптимизировали наш DNS-сервер с помощью инструментов GO

Наш авторитативный DNS-сервер используют десятки тысяч веб-сайтов. Мы ежедневно отвечаем на миллионы запросов. В наши дни DNS-атаки становятся все более и более распространенными, DNS является важной частью нашей системы, и мы должны убедиться, что мы можем хорошо работать под высокой нагрузкой.
dnsflood — это небольшой инструмент, способный генерировать огромное количество udp запросов.
# timeout 20s ./dnsflood example.com 127.0.0.1 -p 2053Мониторинг систем показал, что использование памяти нашим сервисом росло так быстро, что нам пришлось остановить его, иначе мы столкнулись бы с OOM ошибками. Это было похоже на проблему утечки памяти; существуют различные причины «похожих на» и «реальных» утечек памяти в go:
Как не ошибиться с конкурентностью в Go
Почему мы вообще хотим писать конкурентный код? Потому что процессоры перестали расти по герцовке и начали расти по ядрам. С каждым годом увеличивается количество ядер процессора, и мы хотим их эффективно утилизировать. Go — тот язык, который создан для этого. В документации так и написано.
Мы берём Go, начинаем писать конкурентный код. Конечно, ожидаем, что легко сможем обуздать мощь каждого ядра нашего процессора. Так ли это?
Меня зовут Артемий. Этот пост — вольная расшифровка моего доклада с GopherCon Russia. Он появился как попытка дать толчок людям, которые хотят разобраться, как писать хороший, конкурентный код.
Видео с конференции GopherCon Russia
Как сделать API на любое Android приложение. На примере WhatsApp
[Nginx] Как победить response_status = 0
http2_max_field_size 8k; # всех спасет!На одном из проектов, после изменения некоторой внутренней логики бекенда, начал наблюдать странный response_code в логах, а именно — 0. В логах выглядит примерно так:
{
"timestamp": "2020-01-17T08:41:51+00:00",
"remote_addr": "zzz.zzz.zzz.zzz",
"request_time": 0,
"upstream_response_time": "",
"upstream_header_time": "",
"http_accept_language": "-language",
"response_status": 0,
"request": "",
"host": "example.com",
"upstream_addr": "",
"http_referrer": "",
"request_length": 5854,
"bytes_sent": 0,
"http_user_agent": ""
}
Автоопределение кодировки текста

Введение
Я очень люблю программировать, я любитель и первый и последний раз заработал на программировании в далёком 1996 году. Но для автоматизации повседневных задач иногда что-то пишу. Примерно год назад открыл для себя golang. В качестве инструмента создания утилит golang оказался очень удобным. Итак.
Возникла потребность обработать большое количество (больше тысячи, так и вижу улыбки профи) архивных файлов со специальной геофизической информацией. Формат файлов текстовый, простой. Если вдруг интересно то это LAS формат.
LAS файл содержит заголовок и данные.
Данные практически CSV, только разделитель табуляция или пробелы.
А заголовок содержит описание данных и вот в нём обычно содержится русский текст. Это может быть название месторождения, название исследований, записанных в файл и пр.
Файлы эти созданы в разное время и в разных программах, доходит до того, что в одном файле часть в кодировке CP1251, а часть в CP866. Файлы эти мне нужно обработать, а значит понять. Вот и потребовалось определять автоматически кодировку файла.
В итоге изобрёл велосипед на golang и соответственно родилась маленькая библиотечка с возможностью детектировать кодовую страницу.
Пишем Grafana reverse proxy на Go

Очень хотелось назвать статью «Proxy-сервис на Go в 3 строчки», но я выше этого.
В действительности так и есть, основную логику можно уместить в трёх строках. Для нетерпеливых и тех, кто хочет увидеть самую суть:
proxy := httputil.NewSingleHostReverseProxy(url)
r.Header.Set(header, value)
proxy.ServeHTTP(w, r)Под катом более подробный рассказ для новичков в языке Golang и тех, кому нужно создать обратный прокси в кратчайшие сроки.
Разберём, для чего нужен прокси-сервис, как его реализовать и что под капотом у стандартной библиотеки.
Websockets. Некоторый опыт разработки и эксплуатации. Модифицируем клиента
Но помимо серверной части, как известно, есть и клиентская часть. И вот здесь хотелось бы остановится более основательно и описать, с чем пришлось столкнуться и на что можно было повлиять. Конечно, при использовании JavaScript особо “порезвиться” не удастся, ибо всё готово и закрыто, а вот про клиента на Java можно что-то рассказать.
Какой бы хороший программист ты не был, а разрабатывать, придумывать что-то своё, уникальное, затем отлаживать эти свои вирши, всегда сложно. Поэтому и я в своё время поддался искушению найти что-либо уже готовое, позволяющее сразу же использовать в своих проектах. Критерии отбора готового модуля были просты. Хотелось получить законченный, работающий код на Java с минимальными издержками.
Go на десяточку: видео и фото с юбилейного митапа
Привет! 30 ноября в нашем офисе вместе с сообществом Golang Москва мы проводили митап по случаю десятилетия Go. На встрече обсуждали машинное обучение в Go-сервисах, решения для мультикластерной балансировки, приёмы для написания Go-приложений под Cloud Native и историю Go.
Заходите под кат, если вам интересны эти темы. Внутри поста — все материалы встречи: видеозаписи докладов, презентации спикеров, отзывы гостей митапа и ссылки на фотоотчёт.

Information
- Rating
- 2,117-th
- Location
- Москва, Москва и Московская обл., Россия
- Registered
- Activity