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 для управления данными

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

1. Точное получение необходимых данных


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

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

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


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

2. Уменьшение количества запросов


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

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

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


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

3. Типизация и самодокументируемость


Проблема REST: Отсутствие строгой типизации и необходимость внешней документации.

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

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

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

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


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

4. Улучшенная производительность


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

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

Заключение


Переход на GraphQL может значительно улучшить взаимодействие клиент-сервер в ваших приложениях, сделав запросы данных более гибкими, эффективными и удобными для разработчиков. Уменьшение избыточности данных, снижение количества запросов, система типов и самодокументирование делают GraphQL мощным инструментом для современной разработки веб-приложений.
👍1
📌 Чем отличаются LEFT JOIN от INNER JOIN?

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

LEFT JOIN и INNER JOIN – это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.

🤔 INNER JOIN

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

Особенности:

Возвращает строки, где существует совпадение значений в обоих таблицах.

Если нет совпадающих значений, строка не будет включена в результирующий набор.

Пример:

Предположим, у нас есть две таблицы: Employees и Departments.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;


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

🤔 LEFT JOIN

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

Особенности:

Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы.

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

Пример:

Используем те же таблицы Employees и Departments.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;


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

🤔 Сравнение:

1️⃣ INNER JOIN:

Возвращает только совпадающие строки.

Если нет совпадений, строки не включаются в результат.

2️⃣ LEFT JOIN:

Возвращает все строки из левой таблицы.

Включает совпадающие строки из правой таблицы.

Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.

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

INNER JOIN возвращает только совпадающие строки из обеих таблиц.

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с протоколом HTTP в Go?
Anonymous Quiz
87%
net/http
7%
io
4%
bufio
1%
log
Современные угрозы безопасности для backend систем и методы их предотвращения

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

1. SQL-инъекции


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

Пример атаки:


SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'password';


Если запрос не защищен, злоумышленник может войти в систему без ввода пароля.

Методы предотвращения:

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

Пример на Python с использованием подготовленных выражений:

cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))


2. XSS (Межсайтовый скриптинг)


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

Пример атаки:

<script>alert('XSS');</script>


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

Методы предотвращения:

Всегда экранируйте входные данные, прежде чем отображать их на странице.
Используйте Content Security Policy (CSP) для ограничения выполнения скриптов.

Пример использования экранирования в Node.js:

const escapeHtml = require('escape-html');
app.get('/comment', (req, res) => {
const safeComment = escapeHtml(req.query.comment);
res.send(`<div>${safeComment}</div>`);
});


3. CSRF (Межсайтовая подделка запросов)


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

Пример атаки:

<img src="https://example.com/transfer?amount=1000&to=attacker_account" />


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

Методы предотвращения:

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

Пример защиты с использованием CSRF-токена в Django:

<form method="post" action="/transfer/">
{% csrf_token %}
<input type="text" name="amount">
<input type="submit" value="Transfer">
</form>


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

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

SQL (Structured Query Language) — это язык запросов, предназначенный для управления и манипулирования данными в реляционных базах данных. SQL используется для выполнения различных операций над данными, таких как создание, изменение, удаление и извлечение данных.

🤔 Основные возможности SQL

1️⃣ Создание и изменение структуры базы данных:

DDL (Data Definition Language): Команды, которые позволяют создавать и изменять структуру базы данных, включая таблицы, индексы, представления и другие объекты базы данных.

CREATE: Создание новых таблиц, баз данных, индексов.

ALTER: Изменение структуры существующих объектов базы данных.

DROP: Удаление объектов из базы данных.

2️⃣ Управление данными:

DML (Data Manipulation Language): Команды, которые используются для управления данными в базе данных.

SELECT: Извлечение данных из таблиц.

INSERT: Вставка новых данных в таблицы.

UPDATE: Обновление существующих данных в таблицах.

DELETE: Удаление данных из таблиц.

3️⃣ Управление доступом к данным:

DCL (Data Control Language): Команды, которые управляют доступом пользователей к данным в базе данных.

GRANT: Предоставление прав пользователям.

REVOKE: Отзыв ранее предоставленных прав.

4️⃣ Транзакции:

TCL (Transaction Control Language): Команды, которые управляют транзакциями в базе данных.

COMMIT: Сохранение всех изменений, сделанных в транзакции.

ROLLBACK: Отмена всех изменений, сделанных в транзакции.

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

Для иллюстрации возможностей SQL рассмотрим несколько простых примеров команд.

Создание таблицы:
CREATE TABLE Employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
salary DECIMAL(10, 2)
);


Вставка данных в таблицу:
INSERT INTO Employees (id, name, department_id, salary)
VALUES (1, 'John Doe', 10, 50000.00);


Извлечение данных из таблицы:
SELECT name, salary
FROM Employees
WHERE department_id = 10;


Обновление данных в таблице:
UPDATE Employees
SET salary = 55000.00
WHERE id = 1;


Удаление данных из таблицы:
DELETE FROM Employees
WHERE id = 1;


🤔 Зачем нужен SQL

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

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

3️⃣ Управление доступом: SQL позволяет контролировать доступ к данным, обеспечивая безопасность и конфиденциальность информации.

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

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

SQL (Structured Query Language) — это язык запросов, используемый для управления и манипулирования данными в реляционных базах данных. Он позволяет создавать, изменять, удалять и извлекать данные, а также управлять доступом и обеспечивать целостность данных.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой пакет используется для тестирования HTTP-клиентов в Java?
Anonymous Quiz
42%
HttpClient
16%
RestAssured
32%
JUnit
10%
Mockito
4. Угрозы безопасности через API


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

Пример атаки:

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

Методы предотвращения:

Всегда проверяйте и аутентифицируйте все запросы к API.
Используйте шифрование данных и проверяйте права доступа к ресурсам.
Ограничьте запросы к API по IP-адресам и используйте rate limiting.

Пример использования аутентификации JWT в Express:

const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';

app.post('/api/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) return res.status(401).send('Access Denied');

try {
const verified = jwt.verify(token, secret);
req.user = verified;
res.send('Protected data');
} catch (err) {
res.status(400).send('Invalid Token');
}
});


5. Уязвимости компонентов с известными уязвимостями


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

Методы предотвращения:

Регулярно обновляйте зависимости и используйте инструменты для автоматической проверки уязвимостей (например, Snyk, Dependabot).
Проверяйте библиотеки перед их использованием и следите за сообщениями об уязвимостях.

6. Неправильная конфигурация безопасности


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

Методы предотвращения:

Автоматизируйте проверки конфигурации безопасности с помощью инструментов, таких как Chef InSpec или OpenSCAP.
Убедитесь, что все компоненты системы (серверы, базы данных, сети) настроены с учетом лучших практик безопасности.

Заключение


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

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

REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль для создания веб-сервисов, который использует стандартные HTTP методы и принципы для взаимодействия между клиентом и сервером. REST API предоставляет набор операций для создания, чтения, обновления и удаления ресурсов, представленных в виде URL.

🤔 Основные принципы REST API

1️⃣ Клиент-серверная архитектура:

Клиент и сервер отделены друг от друга. Клиент запрашивает ресурсы, сервер обрабатывает запросы и возвращает ресурсы или статус операции.

2️⃣ Бесподсессионное взаимодействие (stateless):

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

3️⃣ Кеширование:

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

4️⃣ Единый интерфейс (Uniform Interface):

Универсальный интерфейс упрощает взаимодействие между клиентом и сервером. Основные методы HTTP (GET, POST, PUT, DELETE) используются для выполнения операций с ресурсами.

5️⃣ Многоуровневая система:

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

6️⃣ Представление ресурсов (Representations):

Ресурсы представляются в виде различных форматов (обычно JSON или XML). Клиент и сервер могут договариваться о формате данных через заголовки HTTP (например, Content-Type и Accept).

🤔 Основные методы HTTP в REST API

GET: Извлечение данных с сервера. Например, получение информации о пользователе.

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

PUT: Обновление существующего ресурса на сервере. Например, обновление информации о пользователе.

DELETE: Удаление ресурса с сервера. Например, удаление учетной записи пользователя.

PATCH: Частичное обновление ресурса на сервере. Например, изменение только email пользователя.

🤔 Пример REST API

Рассмотрим пример REST API для управления ресурсами пользователей.

Примеры URL и HTTP методов

1️⃣ Получение списка пользователей:

URL: GET /users

Описание: Возвращает список всех пользователей.

2️⃣ Получение информации о конкретном пользователе:

URL: GET /users/{id}

Описание: Возвращает информацию о пользователе с заданным ID.

3️⃣ Создание нового пользователя:

URL: POST /users

Описание: Создает нового пользователя с данными, переданными в теле запроса.

4️⃣ Обновление информации о пользователе:

URL: PUT /users/{id}

Описание: Обновляет информацию о пользователе с заданным ID с данными, переданными в теле запроса.

5️⃣ Удаление пользователя:

URL: DELETE /users/{id}

Описание: Удаляет пользователя с заданным ID.

🤔 Примеры запроса и ответа

Запрос на создание нового пользователя (POST /users):
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}


Ответ на успешное создание пользователя:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}


🤔 Зачем нужен REST API

1️⃣ Универсальность: REST API может быть использован с любым языком программирования, поддерживающим HTTP.

2️⃣ Масштабируемость: Простота и гибкость архитектуры REST позволяет легко масштабировать системы.

3️⃣ Производительность: Возможность кеширования ответов позволяет уменьшить нагрузку на сервер и увеличить скорость отклика.

4️⃣ Легкость интеграции: REST API часто используется для интеграции различных систем и приложений, так как он предоставляет стандартизированные методы взаимодействия.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой фреймворк на PHP используется для создания полноценных веб-приложений?
Anonymous Quiz
60%
Laravel
3%
CodeIgniter
4%
Symfony
33%
все перечисленные
Как паттерн Circuit Breaker предотвращает сбои в микросервисных архитектурах

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

Что такое Circuit Breaker?


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

Closed (Замкнутый): Запросы проходят нормально. Если возникают ошибки, их количество отслеживается.

Open (Разомкнутый): Если ошибок слишком много, прерыватель размыкается, и все запросы к сервису завершаются с ошибкой, без попыток подключения.

Half-Open (Полуразомкнутый): Через некоторое время прерыватель позволяет нескольким запросам пройти к сервису. Если они успешны, прерыватель замыкается. В противном случае он снова размыкается.

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


Рассмотрим пример на Java с использованием библиотеки Resilience4j:

import io.github.resilience4j.circuitbreaker.*;

CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.permittedNumberOfCallsInHalfOpenState(3)
.build();

CircuitBreaker circuitBreaker = CircuitBreakerRegistry.of(config).circuitBreaker("myCircuitBreaker");

Supplier<String> supplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> callRemoteService());

try {
String result = supplier.get();
System.out.println("Service response: " + result);
} catch (Exception e) {
System.out.println("Service call failed: " + e.getMessage());
}


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


Предотвращение каскадных сбоев: Circuit Breaker блокирует запросы к неисправному сервису, предотвращая распространение проблем.

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

Снижение нагрузки: В разомкнутом состоянии прерыватель предотвращает лишние запросы к сервису, давая ему время восстановиться.

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

Заключение


Circuit Breaker — это эффективный способ повышения надежности микросервисных систем. Он предотвращает каскадные сбои, улучшает отзывчивость и снижает нагрузку на критически важные сервисы. Использование таких инструментов, как Resilience4j, упрощает внедрение этого паттерна и делает его доступным даже для небольших проектов.
📌 Что такое MVVM?

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

MVVM (Model-View-ViewModel) — это архитектурный шаблон, который разделяет приложение на три части: Model (данные и логика), View (интерфейс) и ViewModel (связь между Model и View).

🤔 Пример

Model
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}


ViewModel
public class UserViewModel : INotifyPropertyChanged
{
private ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get { return _users; }
set
{
_users = value;
OnPropertyChanged(nameof(Users));
}
}

public UserViewModel()
{
Users = new ObservableCollection<User>
{
new User { Name = "John Doe", Age = 30 },
new User { Name = "Jane Doe", Age = 25 }
};
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}


View (XAML)
<Window x:Class="MVVMExample.MainWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Users}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>


Код за View (Code-behind)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new UserViewModel();
}
}


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

MVVM разделяет приложение на Model (данные), View (интерфейс) и ViewModel (связь). Это улучшает тестируемость и поддержку кода.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой ORM используется для работы с базами данных в Elixir?
Anonymous Quiz
31%
Ecto
20%
ActiveRecord
36%
Hibernate
13%
Sequelize
Применение WebSocket для создания интерактивных приложений

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

Что такое WebSocket?


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

Почему WebSocket?


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

Чаты и мессенджеры: Мгновенная отправка и получение сообщений.
Онлайн игры: Синхронизация игровых данных между клиентами.
Торговые платформы: Обновление котировок и графиков в реальном времени.
Совместная работа: Синхронизация изменений в документах и проектах.

Как использовать WebSocket?


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

Соединение WebSocket начинается с HTTP-запроса, который затем "обновляется" до WebSocket протокола.

Пример на JavaScript:
const socket = new WebSocket('ws://example.com/socket');

socket.onopen = function(event) {
console.log('Connected to WebSocket server');
};

socket.onmessage = function(event) {
console.log('Message from server: ', event.data);
};

socket.onclose = function(event) {
console.log('Disconnected from WebSocket server');
};


Отправка и получение данных:

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

Пример отправки данных:
socket.send('Hello, Server!');


Пример получения данных:
socket.onmessage = function(event) {
console.log('Received: ' + event.data);
};


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

Соединение WebSocket может быть закрыто как клиентом, так и сервером.

Пример закрытия соединения:
socket.close();


В следующем посте разберем Пример создания реального приложения 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 В чем суть принципа REST?

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

Суть принципа REST (Representational State Transfer) заключается в том, чтобы предоставить простой, масштабируемый и гибкий способ взаимодействия между клиентом и сервером через веб. Основные принципы REST включают:

1️⃣ Клиент-серверная архитектура: Клиент и сервер разделены, что позволяет независимое развитие и масштабирование обеих сторон. Клиент делает запросы, а сервер обрабатывает их и возвращает ответы.

2️⃣ Бесподсессионное взаимодействие (stateless): Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки. Сервер не сохраняет состояние между запросами.

3️⃣ Кешируемость: Ответы на запросы могут быть помечены как кешируемые или не кешируемые. Это позволяет клиентам сохранять копии ответов и уменьшать количество запросов к серверу.

4️⃣ Единый интерфейс (Uniform Interface): Определяет единые методы взаимодействия с ресурсами:

GET: Получение ресурса.

POST: Создание нового ресурса.

PUT: Обновление ресурса.

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

5️⃣ Многоуровневая система: Архитектура может быть построена из нескольких слоев, что повышает гибкость и возможность кэширования.

6️⃣ Представление ресурсов (Representations): Ресурсы могут представляться в различных форматах (например, JSON, XML). Клиент и сервер договариваются о формате через заголовки HTTP.

🤔 Пример

GET /users: Получить список пользователей.

POST /users: Создать нового пользователя.

PUT /users/1: Обновить данные пользователя с ID 1.

DELETE /users/1: Удалить пользователя с ID 1.

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

Суть принципа REST — это создание масштабируемых и гибких веб-сервисов через HTTP, используя простые и стандартные методы взаимодействия (GET, POST, PUT, DELETE) и обеспечивая независимость клиента и сервера, кешируемость и унифицированный интерфейс.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔1
🤔 Какой пакет в Java используется для работы с протоколом HTTP?
Anonymous Quiz
58%
HttpClient
6%
OkHttp
5%
Retrofit
31%
все перечисленные
Пример создания реального приложения с WebSocket


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

Серверная часть на Node.js:

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

server.on('connection', socket => {
console.log('New client connected');

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

socket.on('close', () => {
console.log('Client disconnected');
});
});

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


Клиентская часть на HTML/JavaScript:

<input id="message" type="text" placeholder="Enter message">
<button onclick="sendMessage()">Send</button>
<div id="chat"></div>

<script>
const socket = new WebSocket('ws://localhost:8080');

socket.onmessage = function(event) {
const chat = document.getElementById('chat');
chat.innerHTML += `<p>${event.data}</p>`;
};

function sendMessage() {
const input = document.getElementById('message');
socket.send(input.value);
input.value = '';
}
</script>


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


Низкая задержка: Постоянное соединение позволяет передавать данные с минимальной задержкой.

Экономия ресурсов: Отсутствие необходимости повторного установления соединения снижает нагрузку на сервер и клиент.

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

Заключение


WebSocket — это мощный инструмент для создания интерактивных приложений с мгновенной обратной связью. Он позволяет улучшить пользовательский опыт, обеспечивая быстрый и эффективный обмен данными в режиме реального времени. Независимо от того, разрабатываете ли вы чат, торговую платформу или онлайн игру, WebSocket может стать ключевым элементом для достижения максимальной отзывчивости и интерактивности вашего приложения.
📌 Какие есть паттерны в объектном проектировании?

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

🤔 Основные паттерны в объектно-ориентированном проектировании:

1️⃣ Порождающие паттерны:

Singleton: Обеспечивает создание единственного экземпляра класса.

Factory Method: Создает объекты через вызов метод, без указания конкретного класса.

Abstract Factory: Создает семейства связанных объектов без указания их конкретных классов.

Builder: Шаг за шагом создает сложный объект.

Prototype: Создает объекты через клонирование существующих экземпляров.

2️⃣ Структурные паттерны:

Adapter: Преобразует интерфейс класса в другой интерфейс, ожидаемый клиентами.

Bridge: Разделяет абстракцию и реализацию, позволяя изменять их независимо.

Composite: Организует объекты в древовидные структуры для представления иерархий.

Decorator: Динамически добавляет новые обязанности объектам.

Facade: Предоставляет унифицированный интерфейс к набору интерфейсов подсистемы.

Flyweight: Поддерживает большое количество мелких объектов, разделяя их состояние.

Proxy: Представляет суррогатный объект, который контролирует доступ к другому объекту.

3️⃣ Поведенческие паттерны:

Chain of Responsibility: Передает запрос по цепочке обработчиков.

Command: Инкапсулирует запрос как объект.

Interpreter: Определяет грамматику для языка и интерпретатор для предложений этого языка.

Iterator: Предоставляет способ последовательного доступа ко всем элементам коллекции.

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

Memento: Сохраняет и восстанавливает внутреннее состояние объекта.

Observer: Оповещает зависимые объекты о изменениях состояния.

State: Позволяет объекту изменять свое поведение при изменении внутреннего состояния.

Strategy: Определяет семейство алгоритмов, инкапсулирует их и делает их взаимозаменяемыми.

Template Method: Определяет скелет алгоритма в методе, оставляя реализацию шагов подклассам.

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

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

Основные паттерны в объектно-ориентированном проектировании включают:

Порождающие: Singleton, Factory Method, Abstract Factory, Builder, Prototype.

Структурные: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.

Поведенческие: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor.

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какой пакет в Python используется для создания RESTful API?
Anonymous Quiz
0%
Flask-RESTful
21%
Django REST framework
14%
FastAPI
65%
все перечисленные
Создание и управление микросервисами с использованием Docker и Kubernetes: Практическое руководство

Микросервисная архитектура становится все более популярной благодаря своей гибкости и масштабируемости. Использование Docker для контейнеризации и Kubernetes для оркестрации — это два ключевых компонента, которые делают управление микросервисами эффективным и удобным. В этом посте мы рассмотрим, как создать микросервисы, контейнеризировать их с помощью Docker и управлять ими через Kubernetes.

Шаг 1: Разработка микросервиса


Предположим, мы разрабатываем простую систему интернет-магазина с двумя микросервисами: catalog-service для управления продуктами и order-service для обработки заказов.

Пример кода для catalog-service на Node.js:

// catalog-service/index.js
const express = require('express');
const app = express();
const products = [{ id: 1, name: 'Product 1' }, { id: 2, name: 'Product 2' }];

app.get('/products', (req, res) => {
res.json(products);
});

app.listen(3000, () => {
console.log('Catalog Service listening on port 3000');
});


Пример кода для order-service:


// order-service/index.js
const express = require('express');
const app = express();
app.use(express.json());

let orders = [];

app.post('/orders', (req, res) => {
const order = req.body;
orders.push(order);
res.status(201).send(order);
});

app.listen(3001, () => {
console.log('Order Service listening on port 3001');
});


Шаг 2: Контейнеризация с использованием Docker


Теперь мы контейнеризируем оба микросервиса с помощью Docker.

Dockerfile для catalog-service:

# catalog-service/Dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]


Dockerfile для order-service:

# order-service/Dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
CMD ["node", "index.js"]


Сборка Docker-образов:

# В каталоге catalog-service
docker build -t catalog-service .

# В каталоге order-service
docker build -t order-service .


В следующем посте разберем Оркестрация с использованием Kubernetes и Управление и масштабирование 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Какие существуют типы баз данных?

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

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

🤔 Реляционные базы данных (RDBMS)

Описание: Организуют данные в таблицы с заранее определенными схемами. Используют SQL для управления данными.

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

🤔 Документные базы данных (Document-Oriented)

Описание: Хранят данные в виде документов (обычно в формате JSON или BSON), что позволяет хранить сложные и гибкие структуры данных.

Примеры: MongoDB, CouchDB.

🤔 Колонковые базы данных (Columnar)

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

Примеры: Apache Cassandra, HBase.

🤔 Ключ-значение базы данных (Key-Value)

Описание: Хранят данные в виде пар "ключ-значение", что позволяет быстрое извлечение данных по ключу.

Примеры: Redis, Riak, Amazon DynamoDB.

🤔 Графовые базы данных (Graph)

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

Примеры: Neo4j, ArangoDB, Amazon Neptune.

🤔 Базы данных временных рядов (Time Series)

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

Примеры: InfluxDB, TimescaleDB.

🤔 Базы данных на основе объектов (Object-Oriented)

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

Примеры: db4o, ObjectDB.

🤔 Многомодельные базы данных (Multi-Model)

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

Примеры: ArangoDB, OrientDB.

🤔 Базы данных, ориентированные на массивы (Array)

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

Примеры: SciDB, Rasdaman.

🤔 Распределенные базы данных (Distributed)

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

Примеры: Google Spanner, CockroachDB.

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

Основные типы баз данных включают:

Реляционные (RDBMS): MySQL, PostgreSQL

Документные: MongoDB, CouchDB

Колонковые: Apache Cassandra, HBase

Ключ-значение: Redis, Riak

Графовые: Neo4j, ArangoDB

Временные ряды: InfluxDB, TimescaleDB

Объектные: db4o, ObjectDB

Многомодельные: ArangoDB, OrientDB

Ориентированные на массивы: SciDB, Rasdaman

Распределенные: Google Spanner, CockroachDB

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

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