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
Введение в концепцию CI/CD

В современном мире разработки программного обеспечения концепция CI/CD (Continuous Integration / Continuous Delivery) становится неотъемлемой частью успешного проекта. CI/CD позволяет автоматизировать сборку, тестирование и развертывание приложений, что значительно ускоряет и упрощает процесс разработки. В этом посте мы рассмотрим основные принципы CI/CD, их преимущества и примеры использования.

Что такое CI/CD?


Continuous Integration (CI) — это практика частой интеграции изменений кода в основную ветку репозитория. Цель CI — обнаружение и устранение проблем на ранних стадиях путем автоматического запуска сборки и тестов при каждом коммите.

Continuous Delivery (CD) — это практика автоматического развертывания каждой успешной сборки на тестовые или производственные среды. CD позволяет быстро и безопасно выпускать новые версии программного обеспечения.

Преимущества CI/CD


Быстрая доставка изменений:

Автоматизация процессов интеграции и развертывания сокращает время от написания кода до его попадания в продакшн.

Раннее обнаружение ошибок:

Автоматические тесты и проверки позволяют выявлять ошибки на ранних этапах, что упрощает их устранение.

Повышение качества кода:

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

Улучшение сотрудничества:

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

Основные компоненты CI/CD


Репозиторий кода (например, Git):

Основное хранилище кода, в котором разработчики хранят и обновляют свои изменения.

Система сборки (например, Jenkins, Travis CI):

Инструмент для автоматизации процессов сборки и тестирования.

Средства тестирования (например, JUnit, Selenium):

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

Средства развертывания (например, Kubernetes, Docker):

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

Пример CI/CD процесса


Рассмотрим простой пример использования CI/CD с помощью Jenkins и Docker.

Шаг 1: Настройка репозитория


Создайте репозиторий на GitHub или GitLab и добавьте туда ваш проект.

Шаг 2: Настройка Jenkins


Установите Jenkins на сервере или используйте облачное решение.
Создайте новый проект (Pipeline) в Jenkins и настройте его для вашего репозитория.

Пример Jenkinsfile:
pipeline {
agent any

stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/project.git'
}
}
stage('Build') {
steps {
sh 'docker build -t project:latest .'
}
}
stage('Test') {
steps {
sh 'docker run project:latest ./run-tests.sh'
}
}
stage('Deploy') {
steps {
sh 'docker run -d -p 80:80 project:latest'
}
}
}
}


Шаг 3: Настройка автоматического развертывания


Используйте Docker для контейнеризации вашего приложения и Kubernetes для его развертывания.

Пример Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]


Пример развертывания в Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: project-deployment
spec:
replicas: 3
selector:
matchLabels:
app: project
template:
metadata:
labels:
app: project
spec:
containers:
- name: project
image: project:latest
ports:
- containerPort: 3000


Заключение

CI/CD — это мощная концепция, которая позволяет автоматизировать процессы интеграции, тестирования и развертывания приложений. Она способствует быстрому и безопасному выпуску новых версий, улучшению качества кода и повышению эффективности разработки. Использование инструментов, таких как Jenkins, Docker и Kubernetes, позволяет легко внедрить CI/CD в ваш проект, обеспечивая стабильность и масштабируемость вашего приложения.
👍1
📌 Как работают индексы?

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

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

🤔 Основные принципы работы индексов

1️⃣ Структура данных: Индексы организованы в специализированные структуры данных, такие как B-деревья, B+-деревья или хеш-таблицы. Эти структуры оптимизированы для быстрого поиска, вставки и удаления данных.

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

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

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

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

🤔 Виды индексов

1️⃣ Первичный ключ (Primary Key): Это уникальный индекс, который не допускает дубликатов и обычно используется для идентификации строк в таблице.

2️⃣ Уникальный индекс (Unique Index): Обеспечивает уникальность значений в индексируемом столбце, но допускает одно или несколько NULL значений.

3️⃣ Обычный индекс (Non-Unique Index): Используется для ускорения поиска и может содержать дублирующиеся значения.

4️⃣ Составной индекс (Composite Index): Индекс, созданный на нескольких столбцах. Полезен, когда запросы часто включают условия на несколько столбцов одновременно.

5️⃣ Кластерный индекс (Clustered Index): Определяет физический порядок хранения строк в таблице. У таблицы может быть только один кластерный индекс, так как строки могут быть отсортированы только одним способом.

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

Поиск и выборка данных: Запросы типа SELECT * FROM users WHERE age > 30 значительно ускоряются, если столбец age индексирован.

Сортировка данных: Запросы типа SELECT * FROM users ORDER BY name будут быстрее, если столбец name индексирован.

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

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

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
⚙️ Инструменты для CI/CD: Jenkins, GitLab CI, CircleCI, и др.

Jenkins


Jenkins — один из самых популярных и универсальных инструментов для автоматизации CI/CD. Он является open-source проектом и поддерживает большое количество плагинов для интеграции с различными инструментами и сервисами.

✔️ Преимущества:

Гибкость и расширяемость: Большое количество плагинов позволяет настроить Jenkins под любые нужды.
Поддержка различных языков и платформ: Можно использовать для проектов на любом языке программирования и для любой платформы.
Активное сообщество: Большое сообщество пользователей и разработчиков постоянно обновляет и улучшает Jenkins.

Пример использования Jenkinsfile:
pipeline {
agent any

stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/project.git'
}
}
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
}
}
stage('Deploy') {
steps {
sh 'make deploy'
}
}
}
}


GitLab CI


GitLab CI — встроенная система CI/CD в GitLab, которая предоставляет мощные инструменты для автоматизации процессов сборки, тестирования и развертывания. GitLab CI интегрируется непосредственно с репозиториями GitLab и позволяет использовать YAML файлы для описания пайплайнов.

✔️ Преимущества:

Интеграция с GitLab: Прямая интеграция с репозиториями GitLab упрощает настройку и управление пайплайнами.
Масштабируемость: Легко масштабировать за счет использования Runner'ов.
Полный DevOps цикл: GitLab CI покрывает весь процесс от разработки до развертывания и мониторинга.

Пример .gitlab-ci.yml:
stages:
- build
- test
- deploy

build:
stage: build
script:
- make build

test:
stage: test
script:
- make test

deploy:
stage: deploy
script:
- make deploy


CircleCI


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

✔️ Преимущества:

Облачное решение: Не требуется настройка и поддержка собственной инфраструктуры.
Гибкость конфигурации: Поддержка различных языков и платформ.
Интеграция с GitHub и Bitbucket: Легко интегрируется с популярными системами контроля версий.

Пример .circleci/config.yml:
version: 2.1

jobs:
build:
docker:
- image: circleci/node:14
steps:
- checkout
- run: npm install
- run: npm test

workflows:
version: 2
build_and_test:
jobs:
- build


Другие инструменты


Travis CI:
Облачный сервис CI/CD, который легко интегрируется с GitHub.
Простой YAML синтаксис для конфигурации пайплайнов.

Bamboo:
Решение от Atlassian для CI/CD.
Глубокая интеграция с другими продуктами Atlassian, такими как Jira и Bitbucket.

Azure DevOps:
Набор инструментов от Microsoft для разработки, тестирования и развертывания.
Поддержка множества языков и платформ, интеграция с облачными сервисами Azure.

Заключение


Выбор инструмента для CI/CD зависит от множества факторов, включая потребности проекта, используемые технологии и предпочитаемую экосистему. Jenkins предлагает большую гибкость и расширяемость, GitLab CI удобен для интеграции с репозиториями GitLab, а CircleCI и Travis CI обеспечивают удобство облачных решений. Независимо от выбранного инструмента, внедрение CI/CD в процесс разработки способствует ускорению доставки кода, повышению качества и стабильности приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с базами данных Oracle в Python?
Anonymous Quiz
8%
cx_Oracle
35%
oracledb
38%
pyoracle
19%
python-oracle
📌 Что такое индексы?

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

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

🤔 Зачем нужны индексы:

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

2️⃣ Улучшение производительности запросов: Индексы могут значительно повысить производительность запросов SELECT, особенно тех, которые часто выполняются.

3️⃣ Сортировка данных: Индексы могут использоваться для ускорения операций сортировки, так как данные в индексе могут быть отсортированы.

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

🤔 Как используются индексы:

Создание индексов: Индексы создаются с помощью SQL-запросов, таких как CREATE INDEX. Можно создавать индексы на один столбец или на несколько столбцов (составные индексы).

Типы индексов: Существует несколько типов индексов, включая B-дерево, хеш-индексы, битмап-индексы и другие. Каждый тип имеет свои особенности и применяется в зависимости от конкретных задач.

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

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

🤔 Примеры применения индексов:

1️⃣ Индекс на первичном ключе: Обычно создается автоматически при создании таблицы. Он обеспечивает уникальность и быстрый доступ к записям.

2️⃣ Индексы на внешних ключах: Помогают ускорить операции соединения (JOIN) между таблицами.

3️⃣ Индексы на столбцах с частыми запросами: Например, если часто выполняются запросы поиска по столбцу "email", имеет смысл создать индекс на этом столбце.

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

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
➡️ Примеры автоматизации развертывания и тестирования

Пример 1: Использование Docker и Docker Compose


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

Dockerfile:
# Используем базовый образ Node.js
FROM node:14

# Создаем рабочую директорию
WORKDIR /app

# Копируем package.json и устанавливаем зависимости
COPY package*.json ./
RUN npm install

# Копируем остальные файлы
COPY . .

# Открываем порт приложения
EXPOSE 3000

# Команда для запуска приложения
CMD ["node", "server.js"]


docker-compose.yml:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
environment:
- NODE_ENV=development
db:
image: mongo
ports:
- "27017:27017"


Для развертывания используйте команду:
docker-compose up -d


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


Kubernetes — это оркестратор контейнеров, который позволяет управлять развертыванием, масштабированием и операциями контейнеризированных приложений.

Deployment файл:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:latest
ports:
- containerPort: 3000


Service файл:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer


Применение конфигураций:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml


➡️ Автоматизация тестирования

Пример 1: Unit-тесты с использованием Jest


Jest — это фреймворк для тестирования JavaScript.

Пример теста:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;

// sum.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});


Добавьте скрипт для запуска тестов в package.json:
"scripts": {
"test": "jest"
}


Запустите тесты командой:
npm test


Пример 2: Интеграционные тесты с использованием Selenium


Selenium — это инструмент для автоматизированного тестирования веб-приложений.

Пример теста на Python:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# Указываем путь к веб-драйверу
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# Открываем страницу
driver.get("https://www.example.com")

# Находим элемент и выполняем действие
elem = driver.find_element_by_name("q")
elem.send_keys("Selenium")
elem.send_keys(Keys.RETURN)

# Проверяем результат
assert "No results found." not in driver.page_source

# Закрываем браузер
driver.quit()


➡️ Интеграция с CI/CD

Автоматизацию развертывания и тестирования можно легко интегрировать в CI/CD пайплайн с использованием инструментов, таких как Jenkins, GitLab CI или CircleCI.

Пример пайплайна Jenkins:
pipeline {
agent any

stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/project.git'
}
}
stage('Build') {
steps {
sh 'docker build -t myapp:latest .'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Deploy to Dev') {
steps {
sh 'kubectl apply -f deployment.yaml'
}
}
stage('Deploy to Prod') {
steps {
input message: 'Deploy to production?', ok: 'Deploy'
sh 'kubectl apply -f deployment.yaml --namespace=prod'
}
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет в PHP используется для работы с базами данных PostgreSQL?
Anonymous Quiz
35%
pgsql
30%
pdo_pgsql
17%
postgresql
17%
All of the above
📌 Что такое нормализация баз данных?

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

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

🤔 Зачем нужна нормализация:

1️⃣ Устранение избыточности данных: Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных.

2️⃣ Обеспечение целостности данных: Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных.

3️⃣ Упрощение структуры базы данных: Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования.

4️⃣ Избежание аномалий данных: Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных.

🤔 Основные формы нормализации:

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

Удаление повторяющихся групп в таблице.

Каждый столбец должен содержать только атомарные (неделимые) значения.

Все записи в таблице должны быть уникальными.

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

Таблица должна быть в 1NF.

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

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

Таблица должна быть в 2NF.

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

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

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

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

Таблица должна быть в BCNF.

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

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

Таблица должна быть в 4NF.

Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.

🤔 Примеры применения нормализации:

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

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

Третья нормальная форма: Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника.

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

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с NoSQL базами данных в Java?
Anonymous Quiz
24%
MongoDB Java Driver
6%
Cassandra Java Driver
4%
Couchbase Java SDK
66%
All of the above
Введение в концепцию 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