Backend
3.95K subscribers
35 photos
708 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
Введение в концепцию API Gateway

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

Что такое API Gateway?


API Gateway — это сервер, который действует как посредник между клиентом и набором микросервисов. Он принимает все входящие запросы, маршрутизирует их к соответствующим сервисам, выполняет различные функции, такие как аутентификация, авторизация, агрегирование данных, и возвращает ответ клиенту.

Преимущества использования API Gateway


Упрощение клиентского кода:

Клиенты взаимодействуют только с одним входным API, а не с множеством микросервисов.

Централизованная аутентификация и авторизация:

Все запросы проходят через единую точку проверки безопасности.

Маршрутизация и балансировка нагрузки:

API Gateway может динамически маршрутизировать запросы к разным сервисам и балансировать нагрузку.

Агрегация данных:

Объединение ответов от нескольких микросервисов в один ответ для клиента.

Кэширование и снижение нагрузки:

Кэширование часто запрашиваемых данных для уменьшения нагрузки на микросервисы.

Примеры использования API Gateway


Рассмотрим, как API Gateway может быть использован в реальной системе.

Пример 1: NGINX API Gateway

NGINX может быть настроен в качестве API Gateway для маршрутизации и балансировки нагрузки.

Пример конфигурации NGINX:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}

server {
listen 80;

location /api/ {
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location /auth/ {
proxy_pass https://auth-service;
}
}
}


Пример 2: Использование Kong API Gateway


Kong — это популярный open-source API Gateway, который легко расширяется с помощью плагинов.

Шаги настройки Kong:

Установка Kong:

docker pull kong
docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.6

docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong


Создание сервиса и маршрута:

curl -i -X POST \
--url https://localhost:8001/services/ \
--data 'name=example-service' \
--data 'url=https://example.com'

curl -i -X POST \
--url https://localhost:8001/services/example-service/routes \
--data 'paths[]=/example'


Добавление плагина для аутентификации:

curl -i -X POST \
--url https://localhost:8001/services/example-service/plugins \
--data 'name=key-auth'


Дополнительные функции API Gateway


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

Заключение


API Gateway — это мощный инструмент для управления взаимодействиями между клиентами и микросервисами. Он упрощает клиентский код, обеспечивает безопасность, улучшает производительность и упрощает масштабирование системы. Выбор конкретного API Gateway, будь то NGINX, Kong или другое решение, зависит от конкретных требований и условий вашего проекта. Внедрение API Gateway позволяет создавать гибкие и надежные архитектуры микросервисов, обеспечивая высокий уровень обслуживания и удобство разработки.
📌 Какие знаешь принципы ООП?

💬 Спрашивают в 30 % собеседований

Объектно-ориентированное программирование (ООП) базируется на нескольких ключевых принципах, которые помогают создавать гибкие, понятные и легко поддерживаемые программы. Вот основные принципы ООП:

1️⃣ Абстракция (Abstraction)

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

Пример: В классе Автомобиль можно выделить такие характеристики, как марка, модель, и методы, такие как запустить двигатель, игнорируя менее важные детали.

2️⃣ Инкапсуляция (Encapsulation)

Инкапсуляция скрывает внутренние детали объекта и позволяет взаимодействовать с объектом только через определенные методы. Это защищает данные от некорректного использования и облегчает изменение и поддержку кода.

Пример: В классе Банк, детали о счете клиента (баланс, транзакции) скрыты и доступны только через методы положить деньги и снять деньги.

3️⃣ Наследование (Inheritance)

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

Пример: Класс Животное может быть родительским для класса Собака, который наследует характеристики и поведение Животного, но также может иметь дополнительные методы, такие как лай.

4️⃣ Полиморфизм (Polymorphism)

Полиморфизм позволяет объектам разных классов обрабатывать запросы одинаковым образом. Это достигается через переопределение методов в наследуемых классах и интерфейсы.

Пример: Метод звук() в классе Животное может быть реализован по-разному в классах Собака и Кошка, но вызывать этот метод можно одинаково для объектов обоих классов.

5️⃣ Композиция (Composition)

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

Пример: Класс Автомобиль может включать объект класса Двигатель, что позволяет использовать функциональность двигателя без необходимости наследования.

6️⃣ Агрегация (Aggregation)

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

Пример: Класс Школа может включать объекты класса Учитель, которые могут существовать независимо от конкретной школы.

🤔 Важность принципов ООП

Упрощение разработки: Принципы ООП позволяют создавать более понятный и структурированный код.

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

Поддерживаемость кода: Инкапсуляция и абстракция делают код легче в сопровождении и модификации.

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Какие есть виды join?

💬 Спрашивают в 19 % собеседований

🤔 Виды JOIN в SQL

1️⃣ INNER JOIN:

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

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

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

2️⃣ LEFT (OUTER) JOIN:

Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если нет совпадения, то результат будет содержать NULL для правой таблицы.

Для чего используется: Чтобы получить все данные из одной таблицы и соответствующие данные из другой, если они существуют.

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

3️⃣ RIGHT (OUTER) JOIN:

Возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если нет совпадения, то результат будет содержать NULL для левой таблицы.

Для чего используется: Аналогично LEFT JOIN, но для получения всех данных из правой таблицы.

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

4️⃣ FULL (OUTER) JOIN:

Возвращает строки, когда есть совпадения в одной из таблиц. Объединяет результаты LEFT JOIN и RIGHT JOIN.

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

Как используется: Когда нужно объединить все данные, включая строки без соответствий.

5️⃣ CROSS JOIN:

Возвращает декартово произведение двух таблиц. Каждая строка первой таблицы соединяется с каждой строкой второй таблицы.

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

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

6️⃣ SELF JOIN:

Это соединение таблицы самой с собой.

Для чего используется: Для сравнения строк таблицы с другими строками той же таблицы.

Как используется: Часто используется для работы с иерархическими данными или для сравнения записей внутри одной таблицы.

🤔 Краткий ответ:

Виды JOIN в SQL: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN, SELF JOIN.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Что из нижеперечисленного не подходит для создания RESTful API на языке Go?
Anonymous Quiz
16%
net/http
20%
Echo
20%
Gin
44%
os/exec
Преимущества и недостатки использования API Gateway

Преимущества


Централизованная аутентификация и авторизация:

API Gateway позволяет централизованно управлять аутентификацией и авторизацией всех запросов. Например, используя OAuth2 или JWT токены, можно обеспечить безопасный доступ ко всем микросервисам.

Пример: В проекте с множеством микросервисов, таких как пользователи, заказы и платежи, можно использовать Kong API Gateway для настройки единого механизма аутентификации и авторизации, применимого ко всем сервисам.

Маршрутизация и балансировка нагрузки:

API Gateway может маршрутизировать запросы к нужным микросервисам и балансировать нагрузку между ними, обеспечивая равномерное распределение трафика.

Пример: NGINX в роли API Gateway может распределять запросы к нескольким экземплярам микросервиса «каталог продуктов» для повышения доступности и отказоустойчивости системы.

Агрегация данных:

API Gateway позволяет объединять ответы от нескольких микросервисов в один ответ для клиента, что упрощает взаимодействие и уменьшает количество запросов от клиента.

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

Кэширование:

API Gateway может кэшировать часто запрашиваемые данные, снижая нагрузку на микросервисы и улучшая производительность системы.

Пример: Часто запрашиваемые данные, такие как список популярных продуктов, можно кэшировать в API Gateway, используя Varnish Cache.

Мониторинг и логирование:

API Gateway может собирать и анализировать логи запросов и ответов, что помогает в мониторинге и отладке системы.

Пример: Использование AWS API Gateway с интеграцией CloudWatch для мониторинга производительности и анализа логов запросов в реальном времени.

Недостатки


Единая точка отказа:

Если API Gateway выйдет из строя, это может привести к недоступности всех микросервисов, что делает его единой точкой отказа.
Пример: При отказе API Gateway на базе Kong, все запросы клиентов будут заблокированы, несмотря на работоспособность микросервисов.

Дополнительная задержка

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

Сложность настройки и управления

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

Пример: Конфигурация и управление большим количеством маршрутов и плагинов в API Gateway, таком как Kong, могут стать сложными и требовать значительных ресурсов.

Ограничение пропускной способности

Пропускная способность API Gateway может стать узким местом, особенно при высокой нагрузке, что может ограничить производительность всей системы.

Пример: При высокой нагрузке на AWS API Gateway может потребоваться масштабирование, что может быть дорогостоящим и трудоемким процессом.

Заключение


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

При внедрении API Gateway важно взвесить все плюсы и минусы и выбрать наиболее подходящее решение для вашей архитектуры микросервисов. Правильное использование API Gateway может значительно улучшить управляемость, безопасность и производительность вашей системы, в то время как неправильное — создать дополнительные сложности и узкие места.
📌 В чём разница между SQL и NoSQL?

💬 Спрашивают в 31 % собеседований

Разница между SQL и NoSQL базами данных заключается в их архитектуре, структуре, методах хранения данных и использовании. Рассмотрим эти различия подробнее.

1️⃣ Архитектура и структура данных

SQL (Structured Query Language) базы данных:

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

Схемы данных: SQL базы данных требуют четко определенных схем (schemas), которые строго контролируют структуру данных. Все записи в таблице должны следовать заранее определенной структуре.

Язык запросов: SQL использует структурированный язык запросов для манипуляции данными. Язык SQL стандартизирован и включает команды для создания, чтения, обновления и удаления данных (CRUD).

NoSQL (Not Only SQL) базы данных:

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

Гибкость схем: NoSQL базы данных часто не требуют фиксированных схем. Это позволяет хранить данные разной структуры в одной и той же коллекции или таблице.

Разнообразие языков запросов: В NoSQL базах данных отсутствует единый стандарт языка запросов. Они могут использовать различные методы доступа к данным, включая REST API и собственные языки запросов.

2️⃣ Масштабируемость и производительность

SQL базы данных:

Вертикальная масштабируемость: SQL базы данных обычно масштабируются вертикально, то есть увеличивая мощность сервера (CPU, RAM, дисковое пространство).

Транзакции и консистентность: SQL базы данных поддерживают ACID транзакции (Atomicity, Consistency, Isolation, Durability), что обеспечивает высокую надежность и консистентность данных.

NoSQL базы данных:

Горизонтальная масштабируемость: NoSQL базы данных предназначены для горизонтального масштабирования, что позволяет распределять данные по множеству серверов.

Гибкость и скорость: NoSQL базы данных обычно более гибки и могут обеспечивать высокую производительность при работе с большими объемами данных и высокими нагрузками на запись и чтение.

3️⃣Использование и примеры

SQL базы данных:

Примеры: MySQL, PostgreSQL, Oracle, Microsoft SQL Server.

Использование: Финансовые системы, системы управления запасами, системы управления клиентами (CRM), где требуется сложные запросы и транзакции.

NoSQL базы данных:

Примеры: MongoDB, Cassandra, Redis, Couchbase.

Использование: Системы больших данных, реального времени аналитика, социальные сети, приложения для интернета вещей (IoT), где требуется высокая производительность и гибкость.

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какой пакет позволяет использовать GraphQL в Go?
Anonymous Quiz
70%
gqlgen
13%
reflect
8%
net/rpc
9%
crypto/rand
Разбор возможностей GraphQL, сравнение производительности и легкости использования по сравнению с REST

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

🔽Введение в GraphQL


GraphQL — это язык запросов для API, разработанный Facebook. Он позволяет клиентам запрашивать только те данные, которые им нужны, и получать их в предсказуемой структуре. GraphQL предоставляет мощные инструменты для работы с данными, включая возможность комбинировать запросы, фильтровать результаты и обрабатывать связи между сущностями.

🔽Возможности GraphQL


Гибкость запросов

Клиенты могут запрашивать только те поля, которые им необходимы, избегая избыточных данных.

{
user(id: "1") {
id
name
email
}
}


Запрос выше возвращает только id, name и email пользователя с ID 1.

Единая точка входа

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

query {
user(id: "1") {
name
posts {
title
comments {
text
}
}
}
}


Здесь мы запрашиваем данные о пользователе, его постах и комментариях к этим постам в одном запросе.

Схема и типизация

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

type User {
id: ID!
name: String!
email: String!
posts: [Post]
}


🔽Сравнение производительности: GraphQL vs REST


Избыточность данных

В REST клиент часто получает больше данных, чем нужно, из-за фиксированных структур ответов.

GET /users/1
{
"id": "1",
"name": "John Doe",
"email": "[email protected]",
"address": "123 Main St",
"phone": "555-5555"
}


Клиенту может быть нужна только часть данных, но он получает весь объект.

Количество запросов

В REST для получения связанных данных часто требуется несколько запросов.

GET /users/1
GET /users/1/posts
GET /posts/1/comments


В GraphQL можно выполнить один запрос для получения всех необходимых данных.

Производительность сервера

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

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

В следующем посте разберем Легкость использования: GraphQL vs REST и подведем итог их сравнения 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Какие есть виды join?

💬 Спрашивают в 19 % собеседований

В реляционных базах данных SQL используется несколько видов операций JOIN для объединения строк из двух или более таблиц на основе связанных столбцов. Каждая из этих операций предназначена для определенных сценариев. Основные виды JOIN включают:

1️⃣ INNER JOIN

INNER JOIN возвращает строки, которые имеют совпадающие значения в обеих таблицах. Это наиболее часто используемый тип JOIN.

Использование: Для извлечения данных, которые имеют соответствующие записи в обеих таблицах.

2️⃣ LEFT (OUTER) JOIN

LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если нет совпадения, то результаты из правой таблицы будут NULL.

Использование: Когда необходимо получить все данные из одной таблицы и только соответствующие данные из другой.

3️⃣ RIGHT (OUTER) JOIN

RIGHT JOIN (или RIGHT OUTER JOIN) возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если нет совпадения, то результаты из левой таблицы будут NULL.

Использование: Когда необходимо получить все данные из правой таблицы и только соответствующие данные из левой.

4️⃣ FULL (OUTER) JOIN

FULL JOIN (или FULL OUTER JOIN) возвращает все строки, когда есть совпадение в одной из таблиц. Если совпадения нет, то возвращаются NULL для соответствующей таблицы.

Использование: Для получения всех данных из обеих таблиц, независимо от совпадений.

5️⃣ CROSS JOIN

CROSS JOIN возвращает декартово произведение двух таблиц, то есть каждая строка из первой таблицы соединяется с каждой строкой из второй таблицы.

Использование: Когда требуется комбинировать все строки из двух таблиц без учета связи.

6️⃣ SELF JOIN

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

Использование: Для сравнения строк внутри одной таблицы.

🤔 Примеры использования

INNER JOIN: Для получения списка студентов и их курсов.

LEFT JOIN: Для получения всех сотрудников и их проектов, даже если у сотрудника нет проекта.

RIGHT JOIN: Для получения всех проектов и сотрудников, даже если у проекта нет назначенного сотрудника.

FULL JOIN: Для получения полной информации о студентах и курсах, включая тех, кто еще не записан на курс или курсы, на которые еще никто не записан.

CROSS JOIN: Для создания всех возможных комбинаций продуктов и категорий.

SELF JOIN: Для нахождения пар сотрудников из одной таблицы с одинаковыми менеджерами.

🤔 Краткий ответ

Основные виды JOIN в SQL включают INNER JOIN (возвращает совпадающие строки), LEFT JOIN (все строки из левой таблицы и совпадающие строки из правой), RIGHT JOIN (все строки из правой таблицы и совпадающие строки из левой), FULL JOIN (все строки при наличии совпадений в одной из таблиц), CROSS JOIN (декартово произведение двух таблиц) и SELF JOIN (соединение таблицы с самой собой).

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Какой пакет используется для работы с кэшем в Python?
Anonymous Quiz
50%
cachetools
4%
pylibmc
29%
redis-py
17%
django-cache
🔽Легкость использования: GraphQL vs REST


Документация и типизация

В GraphQL схема служит живой документацией, которая всегда актуальна.
Инструменты, такие как GraphiQL или Apollo Studio, позволяют интерактивно исследовать и тестировать API.

Разработка и поддержка

GraphQL упрощает работу с фронтендом, так как разработчики могут запрашивать именно те данные, которые им нужны, без ожидания изменений на сервере.
В REST изменения в структуре ответа могут потребовать изменения клиентского кода.

Клиентские библиотеки

Существуют мощные клиентские библиотеки для GraphQL, такие как Apollo Client и Relay, которые упрощают интеграцию и управление состоянием данных.

🔽Примеры


Пример реализации на сервере с использованием Node.js и Apollo Server:

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
type Query {
user(id: ID!): User
}

type User {
id: ID!
name: String!
email: String!
posts: [Post]
}

type Post {
id: ID!
title: String!
comments: [Comment]
}

type Comment {
id: ID!
text: String!
}
`;

const resolvers = {
Query: {
user: (parent, args, context, info) => {
// Логика получения пользователя
}
},
User: {
posts: (parent, args, context, info) => {
// Логика получения постов пользователя
}
},
Post: {
comments: (parent, args, context, info) => {
// Логика получения комментариев поста
}
}
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});


🔽Заключение


GraphQL предоставляет мощные возможности для гибкого и эффективного взаимодействия клиентских приложений с сервером. Хотя он может быть более ресурсоемким для сервера и требует тщательной настройки схемы, его преимущества в гибкости запросов, уменьшении избыточности данных и улучшении клиентской разработки делают его отличным выбором для современных приложений. В сравнении с REST, GraphQL предлагает более современные подходы к работе с данными, что делает его все более популярным среди разработчиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Почему синглтон называют антипаттерном?

💬 Спрашивают в 19 % собеседований

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

1️⃣ Глобальное состояние

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

2️⃣ Нарушение принципов ООП

Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса.

3️⃣ Тестируемость

Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами.

4️⃣ Жесткие зависимости

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

5️⃣ Масштабируемость и многопоточность

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

6️⃣ Легаси код и сложность

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

🤔 Примеры и контексты

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

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

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой пакет используется для работы с очередями сообщений в Java?
Anonymous Quiz
22%
Apache Kafka
16%
RabbitMQ Java Client
10%
ActiveMQ
51%
All of the above
Обзор лучших практик логирования и инструментов, которые помогут в отладке и мониторинге сложных систем

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

Лучшие практики логирования


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

Структурированные логи, такие как JSON, облегчают парсинг и анализ логов.

{
"timestamp": "2023-05-01T12:00:00Z",
"level": "INFO",
"message": "User login successful",
"userId": 123,
"ip": "192.168.1.1"
}


Логируйте на разных уровнях

Используйте уровни логирования (DEBUG, INFO, WARN, ERROR) для фильтрации и управления логами.

const logger = require('winston');
logger.debug('Debugging information');
logger.info('Informational message');
logger.warn('Warning message');
logger.error('Error message');


Соблюдайте контекстность логов

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

import logging
logger = logging.getLogger(__name__)
logger.info('Processing request', extra={'requestId': 'abc123', 'userId': 123})


Не логируйте чувствительные данные

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

logger.info("User login", new LogData(userId, maskSensitiveData(password)));


Используйте корреляционные идентификаторы

Генерируйте и включайте корреляционные идентификаторы (trace IDs) для отслеживания запросов через несколько сервисов.

log.WithFields(log.Fields{
"trace_id": traceID,
"span_id": spanID,
}).Info("Handling request")


В сдедующем посте разберем Инструменты для логирования и мониторинга и Примеры внедрения логирования 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Какие существуют нормальные формы в SQL?

💬 Спрашивают в 19 % собеседований

В реляционных базах данных нормализация — это процесс организации данных для минимизации избыточности и избегания аномалий при внесении данных. Нормальные формы (NF) — это набор правил, которые помогают в нормализации баз данных. Основные нормальные формы включают:

1️⃣ Первая нормальная форма (1NF)

Таблица находится в 1NF, если:

Все столбцы содержат атомарные значения, то есть каждое значение в столбце неделимо.

Все строки уникальны, нет повторяющихся строк.

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

2️⃣ Вторая нормальная форма (2NF)

Таблица находится во 2NF, если:

Она находится в 1NF.

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

Пример:
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.

3️⃣ Третья нормальная форма (3NF)

Таблица находится в 3NF, если:

Она находится во 2NF.

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

Пример:
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.

4️⃣ Бойс-Кодд нормальная форма (BCNF)

Таблица находится в BCNF, если:

Она находится в 3NF.

Для каждой функциональной зависимости X -> Y, X является суперключом.

Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.

5️⃣ Четвертая нормальная форма (4NF)

Таблица находится в 4NF, если:

Она находится в BCNF.

В ней нет многозначных зависимостей (Multivalued Dependencies).

Пример:
Если студент может записаться на несколько курсов и участвовать в нескольких клубах, то эти зависимости должны быть вынесены в отдельные таблицы.

6️⃣ Пятая нормальная форма (5NF)

Таблица находится в 5NF, если:

Она находится в 4NF.

В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.

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

7️⃣ Доменино-ключевая нормальная форма (DKNF)

Таблица находится в DKNF, если:

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

🤔 Заключение

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

🤔 Краткий ответ

Существуют следующие нормальные формы в SQL:

Первая нормальная форма (1NF): атомарность данных.

Вторая нормальная форма (2NF): полная функциональная зависимость от первичного ключа.

Третья нормальная форма (3NF): отсутствие транзитивных зависимостей.

Бойс-Кодд нормальная форма (BCNF): все детерминанты — суперключи.

Четвертая нормальная форма (4NF): отсутствие многозначных зависимостей.

Пятая нормальная форма (5NF): отсутствие соединительных зависимостей.

Доменино-ключевая нормальная форма (DKNF): все ограничения выражаются через домены и ключи.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с графовыми базами данных в Python?
Anonymous Quiz
19%
py2neo
10%
networkx
26%
igraph
46%
graphtools
📌 Что такое Scrum?

💬 Спрашивают в 28 % собеседований

Scrum - это методология управления проектами и одна из наиболее популярных реализаций Agile, предназначенная для гибкой разработки программного обеспечения. Scrum помогает командам работать более эффективно и адаптироваться к изменениям в требованиях и приоритетах. Основные концепции и элементы Scrum включают следующие компоненты:

🤔 Основные концепции Scrum

1️⃣ Инкрементная и итеративная разработка: Scrum разбивает работу над проектом на небольшие итерации, называемые спринтами. Каждый спринт обычно длится от одной до четырех недель и заканчивается созданием работающего инкремента продукта.

2️⃣ Самоорганизующиеся команды: Команды в Scrum сами управляют своей работой и распределяют задачи между участниками без вмешательства извне.

3️⃣ Роли в Scrum: В Scrum выделяются три основных роли:

Product Owner (Владелец продукта): отвечает за создание и управление бэклогом продукта, определение приоритетов и взаимодействие с заинтересованными сторонами.

Scrum Master: помогает команде следовать принципам Scrum, устраняет препятствия и обеспечивает эффективность работы команды.

Development Team (Команда разработки): непосредственно занимается созданием продукта, включает специалистов различных профилей, необходимых для выполнения задач.

🤔 Основные элементы Scrum

1️⃣ Product Backlog (Бэклог продукта): список всех требований и функций, которые должны быть реализованы в продукте. Элементы бэклога приоритизируются владельцем продукта.

2️⃣ Sprint Backlog (Бэклог спринта): список задач, которые команда обязуется выполнить в текущем спринте. Эти задачи выбираются из бэклога продукта на основе приоритетов и возможностей команды.

3️⃣ Sprint (Спринт): фиксированный период времени, в течение которого команда работает над выполнением задач из бэклога спринта. В конце спринта команда демонстрирует результат своей работы.

4️⃣ Daily Scrum (Ежедневный скрам): ежедневные короткие встречи (обычно 15 минут), на которых команда обсуждает прогресс, планирует работу на день и выявляет препятствия.

5️⃣ Sprint Review (Обзор спринта): встреча в конце каждого спринта, на которой команда демонстрирует результаты своей работы заинтересованным сторонам и получает обратную связь.

6️⃣ Sprint Retrospective (Ретроспектива спринта): встреча после завершения спринта, на которой команда анализирует свою работу, обсуждает, что было хорошо, что можно улучшить, и разрабатывает план улучшений на следующий спринт.

🤔 Преимущества Scrum

Гибкость: Scrum позволяет быстро адаптироваться к изменяющимся требованиям и приоритетам.

Прозрачность: Частые демонстрации результата и обратная связь обеспечивают высокую степень прозрачности процесса разработки.

Повышение качества: Регулярные проверки и ретроспективы помогают команде постоянно улучшать качество продукта и процесса.

Улучшение взаимодействия: Scrum способствует более тесному взаимодействию между членами команды и заинтересованными сторонами.

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯1
🤔 Что из нижеперечисленного наименее подходит для создания RESTful API на языке Go?
Anonymous Quiz
34%
net/http
24%
Echo
14%
Gin
28%
os/exec
Советы по интеграции с внешними API, обработке ошибок и оптимизации производительности

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

Советы по интеграции


Тщательное планирование

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

Разработка адаптера для API

Создайте адаптер или сервисный слой в вашем приложении, который будет взаимодействовать с API. Это изолирует ваш код от возможных изменений API и упрощает тестирование.
Пример: Реализация класса в Java для инкапсуляции всех HTTP запросов к внешнему API.

public class PaymentGateway {
private HttpClient client;
private String apiKey;

public PaymentGateway(String apiKey) {
this.client = HttpClient.newHttpClient();
this.apiKey = apiKey;
}

public PaymentResponse makePayment(PaymentRequest request) throws IOException, InterruptedException {
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create("https://api.paymentgateway.com/payments"))
.header("Authorization", "Bearer " + apiKey)
.POST(HttpRequest.BodyPublishers.ofString(request.toJson()))
.build();

HttpResponse<String> response = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
return PaymentResponse.fromJson(response.body());
}
}


Обработка ошибок


Управление исключениями и ошибками API

Обрабатывайте исключения, которые могут возникнуть во время запросов (например, тайм-ауты, ошибки сети).
Регистрируйте ошибки API и предоставляйте информативные сообщения пользователю.
Пример: Обработка ошибок HTTP в запросах.

import requests
from requests.exceptions import HTTPError

try:
response = requests.get('https://api.example.com/data')
response.raise_for_status()
except HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except Exception as err:
print(f'Other error occurred: {err}')
else:
print('Success!')


Идемпотентность запросов

Гарантируйте, что повторные запросы с теми же параметрами не изменят состояние системы.
Пример: Использование идемпотентных ключей в API для платежных систем.

Оптимизация производительности


Кэширование ответов

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

from cachetools import TTLCache, cached
import requests

cache = TTLCache(maxsize=100, ttl=600)

@cached(cache)
def get_weather(city):
return requests.get(f'https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q={city}&aqi=no').json()

weather = get_weather('London')
print(weather)


Асинхронные запросы

Используйте асинхронные запросы для улучшения производительности, особенно при обработке API, которые медленно отвечают.
Пример: Асинхронные запросы в Node.js с использованием axios.

const axios = require('axios');
async function getUserData(userId) {
try {
const response = await axios.get(`https://api.example.com/users/${userId}`);
return response.data;
} catch (error) {
console.error('Error fetching user data:', error);
}
}


Заключение


Интеграция с внешними API требует тщательного планирования, строгой обработки ошибок и оптимизации производительности. Использование адаптеров для API, кэширование ответов, асинхронные запросы и идемпотентность помогут создать надежные и эффективные системы. Следуя этим рекомендациям, вы сможете улучшить взаимодействие вашего приложения с внешними сервисами, обеспечивать стабильность работы и отличное пользовательское опыт.
1
📌 В чем разница между MVC и MVVM?

💬 Спрашивают в 27 % собеседований

MVC (Model-View-Controller) и MVVM (Model-View-ViewModel) - это две архитектурные паттерны, которые используются для разделения ответственности и улучшения структуры кода в приложениях. Несмотря на схожие цели, они имеют разные подходы к организации кода и взаимодействию компонентов.

🤔 MVC (Model-View-Controller)

MVC разделяет приложение на три основных компонента:

1️⃣ Model (Модель): Представляет данные и бизнес-логику. Модель отвечает за получение данных из базы данных, выполнение операций над ними и отправку обновлений обратно в представление через контроллер.

2️⃣ View (Представление): Отображает данные пользователю. Представление отвечает за визуальное представление данных, полученных от модели, и обновление интерфейса в ответ на изменения данных.

3️⃣ Controller (Контроллер): Обрабатывает пользовательские вводы и взаимодействует с моделью и представлением. Контроллер получает ввод от пользователя, обрабатывает его (например, валидирует данные), обновляет модель и выбирает соответствующее представление для отображения.

Пример работы MVC:

Пользователь взаимодействует с представлением (например, нажимает кнопку).

Контроллер обрабатывает это событие, изменяет данные в модели.

Модель уведомляет представление об изменениях.

Представление обновляет отображение данных для пользователя.

🤔 MVVM (Model-View-ViewModel)

MVVM разделяет приложение на три компонента, но с другой структурой и взаимодействием:

1️⃣ Model (Модель): Так же, как и в MVC, модель представляет данные и бизнес-логику. Модель не изменяется.

2️⃣ View (Представление): Отвечает за визуальное представление данных. В отличие от MVC, представление связывается с ViewModel, а не с контроллером.

3️⃣ ViewModel (Модель представления): Посредник между моделью и представлением. ViewModel содержит логику отображения и команду для представления. Он отвечает за преобразование данных из модели в форму, удобную для представления, и наоборот. ViewModel часто использует механизмы связывания данных (data binding) для автоматического обновления представления при изменении данных.

Пример работы MVVM:

Представление связывается с ViewModel через механизмы привязки данных.

Пользователь взаимодействует с представлением (например, вводит текст).

ViewModel обновляет данные в модели.

Модель уведомляет ViewModel об изменениях.

ViewModel автоматически обновляет представление через привязку данных.

🤔 Основные различия между MVC и MVVM

1️⃣ Связывание данных: В MVVM используется двустороннее связывание данных между представлением и ViewModel, что упрощает автоматическое обновление UI. В MVC такого механизма нет, и обновление представления осуществляется через контроллер.

2️⃣ Посредник: В MVC контроллер действует как посредник между моделью и представлением. В MVVM эту роль выполняет ViewModel, который теснее интегрирован с представлением через привязку данных.

3️⃣ Упрощение UI-логики: MVVM лучше подходит для сложных UI, так как позволяет выносить логику отображения в ViewModel, что делает код представления (UI) более чистым и простым. В MVC логика может оставаться в представлении или контроллере, что иногда усложняет структуру.

4️⃣ Технологическая направленность: MVVM часто используется в приложениях, где активно применяется привязка данных, например, в WPF, Xamarin, Angular. MVC более универсален и часто используется в веб-приложениях (например, ASP.NET MVC).

🤔 Краткий ответ

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2