Как стать автором
Обновить
0
0
Anton Szyko @AntonSz

Java Developer

Отправить сообщение

Как создать свой Spring Boot 3 — стартер?

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров10K

Допустим, Вы разрабатываете несколько приложений или микросервисов на Java. Каждое из них уникальное, и содержит свою собственную бизнес логику. Однако, в каждом из них может быть необходимость использовать общую логику. Например, логику аутентификации, как это часто бывает в мире микросервисов.

Spring Boot starter'ы - отличный способ управлять созданием, развитием и поставкой общей кодовой базы. О том как создать свой Spring Boot 3 стартер и поговорим в этой статье.

Читать далее
Всего голосов 13: ↑12 и ↓1+12
Комментарии8

Фильтр Блума – вероятностная структура данных для проверки принадлежности элемента множеству

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров7.6K

Структуры данных такие как HashSet могут использоваться для небольшого набора данных, позволяя проверять принадлежность элемента множеству. При этом использование проверки принадлежности элемента на большом наборе данных может быть затратным. Временная и пространственная сложность могут быть линейными в худшем случае.

Вероятностные структуры данных предоставляют постоянную временную и пространственную сложность за счет предоставления недетерминированного ответа. Примером вероятностной структуры данных является фильтр Блума.

Читать далее
Всего голосов 13: ↑12 и ↓1+14
Комментарии5

Kafka Connect на примере Debezium PostgresConnector

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров15K

В предыдущей статье про микросервисную архитектуру на основе событий с использованием Kafka Streams достаточно поверхностно был упомянут io.confluent.connect.jdbc.JdbcSourceConnector, который использовался для вычитания данных из SQLite и отправки их в топик Kafka. Сейчас я бы хотел более подробно разобрать технологию Kafka Connect на примере io.debezium.connector.postgresql.PostgresConnector. Как и в прошлый раз, я реализовал небольшой демо проект, код которого доступен на GitHub. В проекте кода совсем немного, однако чтобы понять все настройки, примененные в коннекторе, придется достаточно подробно пройтись по теоретической части. Итак, приступим.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии2

Почему B-деревья быстрые?

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров50K

B-дерево — это структура, помогающая выполнять поиск в больших объёмах данных. Она была изобретена более сорока лет назад, однако по-прежнему используется в большинстве современных баз данных. Хотя существуют и более новые структуры индексов, например, LSM-деревья, B-дерево пока никто не победил в обработке большинства запросов баз данных.

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

Читать далее
Всего голосов 151: ↑150 и ↓1+183
Комментарии13

Рассчитываем рейтинг товара на основе оценок пользователей с KafkaStreams и OpenSearch

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров4.1K

Всем привет! Меня зовут Александр. Последний год тружусь фрилансером на проекте по созданию очередного маркетплейса. Мои задачи включают разработку скоринговой системы продуктов, которая бы позволяла формировать выборку товаров по популярности на основе нескольких показателей. Одним из показателей являются оценки пользователей по шкале от 1 до 5. Думаю, что не станет открытием Америки то, что расчет рейтинга товара по среднему арифметическому всех оценок приводит к насовсем корректным результатам выборки. Например, при таком подходе товар "А" с одной оценкой 5 в рейтинге будет выше товара "Б", у которого сотня оценок 5 и одна оценка 4. Решение данной проблемы давно найдено - для расчета следует применить доверительный интервал биномиального распределения по методу Уилсона (Wilson Score Confidence Interval).

Читать далее
Всего голосов 9: ↑9 и ↓0+9
Комментарии0

Проектирование аналога Google Docs

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров14K

Google docs – это сервис для совместного редактирования документов. В целом подобные сервисы можно спроектировать двумя способами:

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

Большинство коммерческих решений ориентированы на клиент-серверный подход ввиду предоставляемого им более детального контроля. Так что и мы в этой статье разберём проектирование сервиса с использованием именно клиент-серверной архитектуры.
Читать дальше →
Всего голосов 45: ↑40 и ↓5+53
Комментарии1

Добавление micrometer-метрик для взаимодействий по SOAP

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров1.7K

Когда мы хотим знать, в каком состоянии находятся системы, с которыми наше приложение взаимодействует, мы используем механизм метрик. Самым распространенным механизмом работы с метриками в приложениях на Spring Boot является micrometer.

Для интеграций по HTTP с использованием REST очень удобно использовать spring-boot-starter-actuator. Актуатор уже из коробки предоставляет набор из http_client_requests и http_server_requests метрик с разбивкой по uri, method и результату.

Но остались еще проекты, которые взаимодействуют по протоколу SOAP. Хотя экосистема Spring (как и ванильная Java) предоставляют возможность собирать веб-сервисы и клиенты для протокола SOAP, но коробочного решения для снятия метрик с таких клиентов не существует.

Читать далее
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Сжатие сообщений в Apache Kafka

Время на прочтение6 мин
Количество просмотров7.3K

Apache Kafka способен обеспечивать невероятно высокую пропускную способность. Он славится такими впечатляющими достижениями, как поддержка 20 миллионов заказов в час для рассылки тестов на COVID гражданам США во время пандемии. Достичь такого уровня масштабируемости позволяет подход Kafka к партиционированию топиков.

Читать далее
Всего голосов 10: ↑6 и ↓4+4
Комментарии1

Распределённые транзакции

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров43K

На собеседованиях на позицию middle/senior разработчика часто задают вопросы по распределенным транзакциям в микросервисной архитектуре.

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

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

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

Читать далее
Всего голосов 22: ↑19 и ↓3+20
Комментарии2

Kafka за 20 минут. Ментальная модель и как с ней работать

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров115K

Привет! Меня зовут Глеб Гончаров, и я руковожу подгруппой ИТ-инфраструктуры в СберМаркете. В работе мы широко используем Kafka как шину данных для микросервисов и не раз убедились на практике, что к инструменту важно подобрать правильный подход. Об этом сегодня и поговорим в двух частях — сначала обсудим основы, а в конце статьи будет ссылка на практические задания.

Читать далее
Всего голосов 41: ↑41 и ↓0+41
Комментарии15

Spring AOP. Маленький вопросик с собеседования

Время на прочтение20 мин
Количество просмотров130K
Довелось мне тут на днях побывать на очередном собеседовании. И задали мне там вот такой вот вопрос. Что на самом деле выполнится (с точки зрения транзакций), если вызвать method1()?

public class MyServiceImpl {
  
  @Transactional
  public void method1() {
    //do something
    method2();
  }

  @Transactional (propagation=Propagation.REQUIRES_NEW)
  public void method2() {
    //do something
  }
}

Ну, мы же все умные, документацию читаем или, по крайней мере, видео выступлений Евгения Борисова смотрим. Соответственно и правильный* ответ знаем (правильный* — это такой, который от нас ожидает услышать тот, кто спрашивает). И звучать он должен примерно так.

«В связи с тем, что для поддержки транзакций через аннотации используется Spring AOP, в момент вызова method1() на самом деле вызывается метод прокси объекта. Создается новая транзакция и далее происходит вызов method1() класса MyServiceImpl. А когда из method1() вызовем method2(), обращения к прокси нет, вызывается уже сразу метод нашего класса и, соответственно, никаких новых транзакций создаваться не будет».

Но знаете, как это бывает, вроде и ответ правильный уже давно знаешь. И применяешь это знание регулярно. А вдруг раз… и неожиданно задумаешься: «Подождите-ка, ведь если мы используем Spring AOP, то там могут создаваться прокси и через JDK, а могут и с CGLIB; а еще возможно, что CTW или LTW подключили. И что такой ответ всегда будет верен?».

Ну что ж: интересно? Надо проверить.
Читать дальше →
Всего голосов 24: ↑23 и ↓1+22
Комментарии16

Переходим на Go: 16 материалов для самостоятельного изучения языка

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров51K

Привет! Меня зовут Владислав Попов, я автор курса «Go-разработчик» Яндекс Практикума. Когда-то я сам был студентом — хотел учиться Go, но такого курса в Практикуме не было, поступил на Python. Прошёл вводную часть — и тут стартовал желанный курс по Go. В тот же вечер оформил возврат и перепоступил. Попал в первый поток, прошёл его, и после сдачи итогового проекта мне предложили стать тестером курса «Продвинутый Go-разработчик».

Оба курса были ещё не идеальны — что-то требовало доработки, некоторые темы казались мне недостаточно раскрытыми. Я сообщил об этом команде курса и предложил варианты, что можно улучшить. В какой-то момент о них узнал продакт-менеджер — и так я получил приглашение поработать с командой Практикума. Мне предстояло разработать концепцию и внести предложения по рефакторингу курса, но я сделал бросок пантеры и написал несколько уроков с нуля. Команде они понравились. Так я стал работать в Практикуме.

За время работы с Go я понял, что сам язык не очень сложный и подходит даже в качестве первого, но нужно выучить синтаксис и погрузиться в некоторые особенности, которые отличают Go от других языков: например, интерфейсы и особенности встраивания. А ещё важно на старте хорошо знать Git и ориентироваться в работе SQL (причём любого).

Эта подборка составлена менторами нашего курса по Go-разработке для практикующих программистов. Она родилась благодаря коллективному разуму наших наставников, которые занимают позиции синьор-разработчиков на Go в разных компаниях.

Читать далее
Всего голосов 16: ↑12 и ↓4+11
Комментарии12

Лучшие практики для Java-приложений в Kubernetes

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров12K

В этой статье вы прочитаете о лучших практиках запуска Java-приложений в Kubernetes. Большинство из этих рекомендаций будут справедливы и для других языков. 

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

Некоторые из этих рекомендаций по Kubernetes навязаны дизайном при использовании самых популярных Java-фреймворков, таких, как Spring Boot или Quarkus. Я покажу вам, как эффективно использовать их для упрощения жизни разработчиков.

Читать далее
Всего голосов 11: ↑9 и ↓2+8
Комментарии0

Шаблон backend сервера на Golang — часть 3 (Docker, Docker Compose, Kubernetes (kustomize)

Уровень сложностиСложный
Время на прочтение27 мин
Количество просмотров9.6K

Шаблон backend сервера на Golang — часть 3 (Docker, Docker Compose, Kubernetes (kustomize)


Схема развертывания в Kubernetes


Первая часть шаблона посвящена HTTP серверу.


Вторая часть шаблона посвящена прототипированию REST API.


Третья часть посвящена развертыванию шаблона в Docker, Docker Compose, Kubernetes (kustomize).


Четвертая часть будет посвящена развертыванию в Kubernetes с Helm chart и настройке Horizontal Autoscaler.


Пятая часть посвящена оптимизации Worker pool и особенностям его работы в составе микросервиса, развернутого в Kubernetes.


Для корректного развертывания в Kubernetes, в шаблон пришлось внести изменения:


  • способа конфигурирования — YAML, ENV, Kustomize
  • подхода к логированию — переход на zap
  • способа развертывания схемы БД — переход на liquibase
  • добавление метрик prometheus

Ссылка на новый репозиторий.


Шаблон goapp в репозитории полностью готов к развертыванию в Docker, Docker Compose, Kubernetes (kustomize), Kubernetes (helm).


Настоящая статья не содержит детального описание используемых технологий


Содержание


  1. Изменение подхода к конфигурированию
  2. Добавление метрик prometheus
  3. Изменение подхода к логированию
  4. Развертывание схемы БД
  5. Сборка Docker image
  6. Сборка Docker-Compose
  7. Схема развертывания в Kubernetes
  8. Подготовка YAML для Kubernetes
  9. Kustomization YAML для Kubernetes
  10. Тестирование Kubernetes с kustomize
Читать дальше →
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Spring Boot. Настройка профилирования времени выполнения

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров6.8K

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

Т.к. речь шла о сервисе, который был написан довольно давно, и в него многие месяцы не вносились изменения, повинуясь принципу “работает - не трогай”, я решил постараться сделать это, не прикасаясь к самому коду сервиса.

Читать далее
Всего голосов 6: ↑5 и ↓1+5
Комментарии13

Тестирование Kafka Streams: глубокий разбор

Время на прочтение12 мин
Количество просмотров3.4K

Привет! Меня зовут Иван Пономарёв, я разработчик в Synthesized, преподаю в МФТИ и EEUAS. На этом митапе Росбанка и Jug.ru я расскажу о тестировании Kafka Streams и, в частности, об особенностях инструмента TopologyTestDriver. Этот доклад я подготовил совместно с Джоном Рослером (John Roesler), разработчиком из Confluent, коммитером и одним из продакт-менеджеров Apache Kafka.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Выходя за рамки JUnit. Создаем сложные расширения

Время на прочтение8 мин
Количество просмотров2.9K

Переход от JUnit4 к новой версии во многом изменил способ расширения функциональных возможностей тестов. Напомню, что в JUnit4 основным механизмом расширения были правила (Rule), которые могли обернуть выполнение теста в дополнительную логическую обработку (например, в реализации абстрактного класса ExternalResource встраивали два дополнительных вызова методов инициализации (который также мог возвращать объект для взаимодействия с создаваемым окружением, например обертку вокруг Android Activity) и финализации (вызывается после выполнения теста и используется для очистки ресурсов). Модель JUnit 5 существенно дополнена и в этой статье мы рассмотрим как можно создавать собственные расширения для JUnit Platform.

Читать далее
Всего голосов 9: ↑9 и ↓0+9
Комментарии1

Битва брокеров сообщений: RabbitMQ, Kafka, AWS SNS/SQS

Время на прочтение11 мин
Количество просмотров23K

Если вы работаете с вебом, вы обязательно столкнётесь с брокерами сообщений. Они бывают разные, но чаще остальных встречаются Kafka, RabbitMQ и AWS SNS/SQS. У каждого из них есть свои особенности, плюсы и минусы — выбирать брокер нужно под свою задачу. 

О том, как сделать правильный выбор, рассказали эксперты из команды курса «Go-разработчик» Яндекс Практикума: 

Читать далее
Всего голосов 18: ↑13 и ↓5+12
Комментарии9

Стратегии тестирования микросервисов

Время на прочтение11 мин
Количество просмотров36K

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

Читать далее
Всего голосов 13: ↑12 и ↓1+13
Комментарии4

Как развернуть свою блокчейн-платформу на базе технологий Web3 Tech

Время на прочтение10 мин
Количество просмотров3.5K

В апреле этого года, после нескольких лет успешного развития платформы Waves Enterprise и ее использования в различных проектах мы решили выпустить её open-source версию, чтобы расширить охват потенциальных пользователей платформы. Мы сохранили в ней почти всю функциональность и классные фичи: это контейнеризированные смарт-контракты на любом языке, поддержка трех разных консенсусов, возможность обмена конфиденциальными данными и не только. Убрали только поддержку ГОСТ-криптографии, TLS и PKI.

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

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

Информация

В рейтинге
Не участвует
Откуда
London, England - London, Великобритания
Дата рождения
Зарегистрирован
Активность