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
🔽Легкость использования: 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
🤔 Какой middleware обычно используется для кэширования в Go?
Anonymous Quiz
18%
gorilla/mux
74%
go-cache
5%
fasthttp
4%
chi
Как Serverless платформы, такие как AWS Lambda, Azure Functions и Google Cloud Functions, изменяют подходы к разработке и эксплуатации бэкенд-систем

Serverless архитектура революционизирует подходы к разработке и эксплуатации бэкенд-систем. Платформы как AWS Lambda, Azure Functions и Google Cloud Functions позволяют разработчикам сосредоточиться на написании кода, автоматически управляя инфраструктурой. Давайте рассмотрим, как эти платформы изменяют процесс разработки и эксплуатации.

Принципы Serverless


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

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


Масштабируемость

Платформы автоматически масштабируются для обработки запросов. Это особенно ценно при неожиданных пиках трафика.

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

Управление инфраструктурой

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

Пример: Google Cloud Functions автоматически обрабатывает задачи, такие как мониторинг, логирование и безопасность, без вмешательства пользователя.

Снижение затрат

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

Пример: Azure Functions предлагает детализированный платежный план, который взимает плату на основе количества выполнений функций и затраченного времени вычислений.

Влияние на разработку и эксплуатацию


Разработка

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

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

Эксплуатация

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

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

Недостатки Serverless


Зависимость от провайдера

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

Холодный старт

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

Заключение


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

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

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

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

1️⃣ Полиморфизм подтипов (ад-хок полиморфизм):

Это форма полиморфизма, при которой функция или метод могут быть применены к аргументам разных типов. В ООП это достигается через наследование и интерфейсы. Классический пример – это использование базового класса или интерфейса, когда конкретная реализация определяется в дочерних классах. Пример: метод draw() может быть определен в интерфейсе Shape, а конкретная реализация этого метода – в классах Circle, Square, Triangle.

2️⃣ Параметрический полиморфизм (универсальный полиморфизм):

Это форма полиморфизма, при которой функции или методы могут работать с любыми типами данных. Обычно это реализуется через использование обобщенных типов (generics). Например, в языке Java или C# можно создать класс или метод, который работает с любым типом данных, используя синтаксис шаблонов (generics).

3️⃣ Полиморфизм времени выполнения (динамический полиморфизм):

Это форма полиморфизма, при которой метод конкретного объекта выбирается во время выполнения программы. Обычно это достигается с помощью виртуальных функций и механизма позднего связывания (late binding). Пример: вызов метода move() у объекта, который может быть как автомобилем, так и самолетом. Виртуальная функция обеспечивает вызов правильной реализации метода в зависимости от реального типа объекта.

🤔 Зачем нужен полиморфизм:

1️⃣ Упрощение кода и повышение его гибкости:

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

2️⃣ Повышение уровня абстракции:

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

3️⃣ Поддержка принципа "открытости/закрытости" (Open/Closed Principle):

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

4️⃣ Снижение дублирования кода:

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

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

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой фреймворк Python используется для разработки веб-приложений и API?
Anonymous Quiz
97%
Django
1%
NumPy
2%
Pandas
0%
SciPy
Как событийно-ориентированные архитектуры повышают масштабируемость и отзывчивость приложений

Событийно-ориентированные архитектуры (Event-Driven Architectures, EDA) используют события для коммуникации между различными компонентами системы, что позволяет строить масштабируемые и отзывчивые приложения. В этом посте мы рассмотрим, как такие архитектуры, с примерами использования Kafka и RabbitMQ, могут повысить эффективность приложений.

Преимущества событийно-ориентированных архитектур


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

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


Kafka

Apache Kafka — это распределённая платформа для обработки потоков данных, которая широко используется для построения надёжных, масштабируемых и высокопроизводительных систем. Kafka хорошо подходит для:

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

Пример: Банковская система, использующая Kafka для обработки транзакций и аудита в реальном времени, может обнаруживать мошеннические действия практически мгновенно.

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("bank-transactions", "transactionId", "transactionDetails"));
producer.close();


RabbitMQ

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

Децентрализованных систем: RabbitMQ позволяет отделить производителя данных от потребителя, что упрощает масштабирование и обеспечивает надёжность.

Пример: Онлайн-ретейлер использует RabbitMQ для обработки заказов, где один сервис принимает заказы, а другой обрабатывает платежи и обновляет складские запасы.

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='orders')

channel.basic_publish(exchange='', routing_key='orders', body='Order details')
print(" [x] Sent 'Order details'")

connection.close()


Как EDA улучшает масштабируемость и отзывчивость


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

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

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

Заключение


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

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

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

1️⃣ Стартовая линия (Request Line):

Метод: Определяет тип запроса и действия, которые должен выполнить сервер. Основные методы включают:

GET: Запрос на получение данных с сервера.

POST: Отправка данных на сервер для обработки (например, форма).

PUT: Замена существующего ресурса на сервере.

DELETE: Удаление ресурса с сервера.

PATCH: Частичное обновление ресурса.

URI (Uniform Resource Identifier): Указывает путь к ресурсу на сервере.

Версия протокола HTTP: Определяет используемую версию HTTP, например, HTTP/1.1.

2️⃣ Заголовки (Headers):

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

Host: Указывает имя хоста и, возможно, номер порта сервера (например, www.example.com).

User-Agent: Информация о клиентском приложении, совершающем запрос (например, браузер).

Accept: Типы данных, которые клиент готов принять (например, text/html, application/json).

Content-Type: Тип данных, передаваемых в теле запроса (например, application/json для JSON данных).

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

3️⃣ Тело запроса (Body):

Содержит данные, отправляемые на сервер. Тело запроса используется в методах POST, PUT, PATCH для передачи данных, таких как формы, файлы или JSON-объекты. Для методов GET и DELETE тело запроса обычно не используется.

🤔 Зачем нужны эти компоненты:

1️⃣ Метод и URI:

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

2️⃣ Заголовки:

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

3️⃣ Тело запроса:

Тело запроса содержит основное содержание, которое клиент хочет передать на сервер. Например, данные формы, JSON-объекты или файлы. Без тела запроса невозможно передать на сервер данные, которые необходимо обработать.

🤔 Пример HTTP-запроса:
POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

name=John+Doe&age=30


В этом примере:

Стартовая линия указывает метод POST, ресурс /submit-form и версию протокола HTTP/1.1.

Заголовки включают Host, User-Agent, Content-Type и Content-Length.

Тело запроса содержит закодированные данные формы.

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

Запрос на сервере состоит из стартовой линии (метод, URI, версия HTTP), заголовков (метаданные) и тела запроса (данные). Эти компоненты работают вместе, чтобы передать инструкции и данные от клиента к серверу.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой фреймворк используется для разработки веб-приложений на языке Ruby?
Anonymous Quiz
79%
Ruby on Rails
1%
Sinatra
4%
Hanami
17%
Все вышеперечисленные
Обзор принципов работы WebSockets, сценарии использования и как это может улучшить пользовательский опыт в реальном времени

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

Принципы работы WebSockets


Установление соединения

Взаимодействие начинается с обычного HTTP-запроса от клиента, который включает заголовок Upgrade. Если сервер поддерживает WebSockets, он отвечает подтверждением и соединение обновляется до WebSocket протокола.

Пример запроса:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13


Пример ответа:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=


Двусторонний обмен данными

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

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

Поддержка низкой задержки

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

Закрытие соединения

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

Сценарии использования WebSockets


Чат-приложения

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

Пример: Реализация простой системы чата на Node.js с использованием библиотеки ws.

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

server.on('connection', socket => {
socket.on('message', message => {
console.log(`Received: ${message}`);
// Рассылаем сообщение всем подключенным клиентам
server.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
});

console.log('WebSocket server is running on ws://localhost:8080');


Реалтайм обновления данных

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

Пример: Обновление котировок акций в режиме реального времени на биржевом терминале.

Коллаборативные инструменты

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

Пример: Совместное редактирование текста в Google Docs, где все изменения моментально отображаются у всех участников.

Как WebSockets улучшают пользовательский опыт


Мгновенная обратная связь

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

Снижение нагрузки на сервер

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

Экономия трафика

За счет постоянного соединения WebSockets уменьшают количество передаваемых данных, так как нет необходимости в заголовках HTTP для каждого сообщения.

Поддержка сложных взаимодействий

WebSockets позволяют реализовать сложные взаимодействия в реальном времени, такие как совместная работа, игры и торговые платформы, обеспечивая плавный и интерактивный пользовательский опыт.
1
📌 Какие есть статус коды?

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

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

1️⃣ Информационные (100-199)

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

100 Continue: Сервер получил начальную часть запроса клиента и ожидает продолжения.

101 Switching Protocols: Клиент запросил изменение протокола, и сервер согласен выполнить это.

2️⃣ Успешные (200-299)

Эти коды сообщают, что запрос успешно принят, понят и обработан.

200 OK: Запрос успешно обработан, и сервер отправляет запрашиваемые данные.

201 Created: Запрос успешно выполнен, и в результате был создан новый ресурс.

202 Accepted: Запрос принят для обработки, но обработка еще не завершена.

204 No Content: Запрос успешно выполнен, но сервер не возвращает никаких данных.

3️⃣ Перенаправления (300-399)

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

301 Moved Permanently: Запрашиваемый ресурс был окончательно перемещен на новый URI.

302 Found: Запрашиваемый ресурс временно доступен по другому URI.

304 Not Modified: Данные не изменились, клиент может использовать кэшированную версию.

4️⃣ Клиентские ошибки (400-499)

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

400 Bad Request: Сервер не может обработать запрос из-за ошибки клиента (например, неверный синтаксис).

401 Unauthorized: Для доступа к запрашиваемому ресурсу требуется аутентификация.

403 Forbidden: У клиента нет прав на доступ к запрашиваемому ресурсу.

404 Not Found: Запрашиваемый ресурс не найден на сервере.

405 Method Not Allowed: Метод, указанный в запросе, не поддерживается данным ресурсом.

5️⃣ Ошибки сервера (500-599)

Эти коды указывают на ошибки на стороне сервера при обработке запроса.

500 Internal Server Error: Общая ошибка сервера, когда обработка запроса не может быть завершена.

501 Not Implemented: Сервер не поддерживает функциональность, необходимую для обработки запроса.

502 Bad Gateway: Сервер, выполняющий роль шлюза или прокси, получил недействительный ответ от вышестоящего сервера.

503 Service Unavailable: Сервер временно не доступен (например, из-за перегрузки или технического обслуживания).

504 Gateway Timeout: Сервер, выполняющий роль шлюза или прокси, не дождался ответа от вышестоящего сервера вовремя.

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

Статус коды HTTP делятся на пять категорий:

1️⃣ Информационные (100-199)

2️⃣ Успешные (200-299)

3️⃣ Перенаправления (300-399)

4️⃣ Клиентские ошибки (400-499)

5️⃣ Ошибки сервера (500-599)

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой из следующих пакетов используется для сериализации данных в формат JSON в Python?
Anonymous Quiz
2%
sys
92%
json
3%
requests
2%
os