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

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
🤔 Что такое rest api?

Это архитектурный стиль для создания веб-сервисов, который использует стандартные HTTP методы и принципы для взаимодействия между клиентом и сервером. REST API предоставляет набор операций для создания, чтения, обновления и удаления ресурсов, представленных в виде URL.

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

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

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

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

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

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

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

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

🟠GET
Извлечение данных с сервера. Например, получение информации о пользователе.
🟠POST
Отправка данных на сервер для создания нового ресурса. Например, создание новой учетной записи пользователя.
🟠PUT
Обновление существующего ресурса на сервере. Например, обновление информации о пользователе.
🟠DELETE
Удаление ресурса с сервера. Например, удаление учетной записи пользователя.
🟠PATCH
Частичное обновление ресурса на сервере. Например, изменение только email пользователя.

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

Запрос на создание нового пользователя (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]"
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что означает принцип open closed?

Принцип "открытости/закрытости" (Open/Closed Principle, OCP) — это один из пяти принципов SOLID, разработанных для создания устойчивого и легко поддерживаемого кода в объектно-ориентированном программировании. Принцип был предложен Бертраном Мейером в 1988 году и заключается в следующем:

🚩Что это означает

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

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

Без соблюдения принципа OCP
public class Shape {
public void drawCircle() {
// рисуем круг
}

public void drawSquare() {
// рисуем квадрат
}
}

public class GraphicEditor {
private Shape shape;

public GraphicEditor(Shape shape) {
this.shape = shape;
}

public void draw(String shapeType) {
if (shapeType.equals("circle")) {
shape.drawCircle();
} else if (shapeType.equals("square")) {
shape.drawSquare();
}
}
}


С соблюдением принципа OCP
public interface Shape {
void draw();
}

public class Circle implements Shape {
@Override
public void draw() {
// рисуем круг
}
}

public class Square implements Shape {
@Override
public void draw() {
// рисуем квадрат
}
}

public class GraphicEditor {
private Shape shape;

public GraphicEditor(Shape shape) {
this.shape = shape;
}

public void draw() {
shape.draw();
}
}


🚩Плюсы

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое виртуальное окружение?

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

🚩Зачем нужно

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

🟠Упрощение управления зависимостями
Легко установить, обновить или удалить зависимости без риска повлиять на другие проекты. Это особенно полезно при работе над проектами с долгим жизненным циклом, где могут возникать проблемы совместимости.

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

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

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

🚩Как используется

🟠venv
Встроенный модуль в Python, позволяющий создавать легковесные виртуальные окружения.
🟠virtualenv
Более функциональный инструмент, особенно полезный для старых версий Python.
🟠conda
Инструмент, который управляет как пакетами, так и виртуальными окружениями, поддерживающий не только Python, но и другие языки программирования.

1⃣Создание окружения
Команда для создания нового окружения (например, python -m venv env для venv).

2⃣Активация окружения
Команда для активации окружения (например, source env/bin/activate на Unix-подобных системах или .\env\Scripts\activate на Windows).

3⃣Установка зависимостей
Использование менеджера пакетов (например, pip) для установки необходимых библиотек.

4⃣Деактивация окружения
Команда для выхода из окружения (например, deactivate).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Как обнаружить самые затратные запросы?

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

🚩Включение логирования медленных запросов (Slow Query Logging)

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

🟠MySQL
Используйте slow_query_log. Активировать лог:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- Время выполнения в секундах


🟠PostgreSQL
Включите log_min_duration_statement.
SET log_min_duration_statement = 1000; -- Логировать запросы, выполняющиеся более 1 секунды


🚩Использование EXPLAIN или ANALYZE

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

MySQL
EXPLAIN SELECT * FROM orders WHERE status = 'pending';


PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE status = 'pending';


🚩Использование системных представлений и мониторинга запросов

🟠MySQL
Используйте таблицу performance_schema для анализа запросов.
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;


🟠PostgreSQL
Используйте расширение pg_stat_statements.
CREATE EXTENSION pg_stat_statements;

Получите информацию
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;


🚩Мониторинг с использованием внешних инструментов

🟠New Relic
Проводит анализ SQL-запросов, показывая самые медленные.
🟠Datadog
Позволяет отслеживать производительность запросов в реальном времени.
🟠SolarWinds DPA (Database Performance Analyzer)
Специализированный инструмент для анализа производительности баз данных.

🚩Оптимизация индексов

🟠MySQL
SELECT * FROM sys.schema_unused_indexes;


🟠PostgreSQL
Проверьте в плане выполнения запросов (EXPLAIN), используются ли индексы.

🚩Нагрузочное тестирование (Load Testing)

Используйте нагрузочные тесты, чтобы выявить запросы, создающие "бутылочные горлышки":
🟠Apache JMeter
Симулирует многопоточную нагрузку на базу данных.
🟠Gatling
Анализирует производительность системы под высокой нагрузкой.

🚩Анализ трассировки запросов

Включите трассировку (например, в MySQL — SHOW PROFILE):
SET profiling = 1;
SELECT * FROM orders WHERE status = 'pending';
SHOW PROFILE FOR QUERY 1;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Принципы разделения ответственности (MVC, MVVM и другие)?

Принципы разделения ответственности (Separation of Concerns, SoC) предполагают разделение логики программы на отдельные части, каждая из которых выполняет строго определённую функцию. Это позволяет сделать код более структурированным, гибким и легче сопровождаемым. Популярные паттерны проектирования, основанные на разделении ответственности, включают MVC, MVP, MVVM и другие. Они применяются в разработке приложений для чёткого разграничения пользовательского интерфейса, бизнес-логики и работы с данными.

🚩MVC (Model-View-Controller)

🟠Model (Модель)
Хранит данные и логику их обработки. Отвечает за взаимодействие с базой данных или другими источниками данных. Уведомляет представление об изменениях данных.
🟠View (Представление)
Отображает данные пользователю. Реагирует на обновления данных от модели. Не содержит логики обработки данных.
🟠Controller (Контроллер)
Обрабатывает пользовательский ввод (например, нажатия кнопок, ввод текста). Вызывает соответствующие методы модели и обновляет представление.

🚩Плюсы и минусы
Хорошее разделение обязанностей.
Легче тестировать отдельные компоненты.
При большом приложении контроллер может стать перегруженным.

🚩MVP (Model-View-Presenter)

🟠Model (Модель)
Работает с данными и бизнес-логикой.
🟠View (Представление)
Интерфейс пользователя. Не содержит логики, только вызывает методы презентера.
🟠Presenter (Презентер)
Посредник между моделью и представлением. Получает данные из модели и передаёт их в представление. Не знает деталей реализации интерфейса (только абстракция).

Плюсы и минусы
Более чёткое разделение обязанностей по сравнению с MVC.
Упрощённое тестирование.
Возможен рост сложности презентера.

🚩MVVM (Model-View-ViewModel)

🟠Model (Модель)
Управляет данными и бизнес-логикой.

🟠View (Представление)
Отображает данные и предоставляет интерфейс для взаимодействия.

🟠ViewModel
Посредник между моделью и представлением. Содержит логику преобразования данных для представления. Часто использует привязку данных (data binding), что позволяет автоматически обновлять UI при изменении данных.

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

🚩Flux/Redux

🟠Store (Хранилище)
Централизованное состояние приложения.
🟠View (Представление)
Компоненты, которые отображают состояние.
🟠Actions (Действия)
Описывают, какие изменения должны произойти в состоянии.
🟠Reducers (Редьюсеры)
Функции, описывающие, как изменяется состояние на основе действий.

Плюсы и минусы
Прогнозируемость состояния.
Централизованное управление состоянием.
Дополнительная сложность при реализации.

🚩Чем полезны принципы разделения ответственности

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое нормализация баз данных?

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

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

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

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

🟠Первая нормальная форма (1NF)
Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными.

🟠Вторая нормальная форма (2NF)
Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа.

🟠Третья нормальная форма (3NF)
Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов.

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

🟠Четвертая нормальная форма (4NF)
Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута.

🟠Пятая нормальная форма (5NF)
Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чём смысл инкапсуляции?

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

🚩Основные аспекты инкапсуляции

🟠Сокрытие данных
В инкапсуляции данные (свойства) объекта скрываются от внешнего доступа и защищаются от некорректных изменений. Это достигается путем использования модификаторов доступа (например, private, protected, public).

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

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

🚩Примеры инкапсуляции

На Java
public class Person {
private String name;
private int age;

// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}

// Геттер для имени
public String getName() {
return name;
}

// Сеттер для имени
public void setName(String name) {
this.name = name;
}

// Геттер для возраста
public int getAge() {
return age;
}

// Сеттер для возраста
public void setAge(int age) {
if (age > 0) {
this.age = age;
} else {
System.out.println("Возраст должен быть положительным числом.");
}
}
}


На Python
class Person:
def __init__(self, name, age):
self._name = name
self._age = age

# Геттер для имени
@property
def name(self):
return self._name

# Сеттер для имени
@name.setter
def name(self, name):
self._name = name

# Геттер для возраста
@property
def age(self):
return self._age

# Сеттер для возраста
@age.setter
def age(self, age):
if age > 0:
self._age = age
else:
print("Возраст должен быть положительным числом.")

# Пример использования
person = Person("John", 30)
print(person.name) # John
person.age = -5 # Возраст должен быть положительным числом.
print(person.age) # 30


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем разница между Scrum и Kanban ?

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

🚩Scrum

🟠Структура
Фиксированные спринты: Работа делится на временные интервалы, называемые спринтами, обычно длительностью 2-4 недели.
Роли: В Scrum определены конкретные роли, такие как Scrum-мастер, Product Owner и команда разработки.

🟠Процессы и церемонии
Планирование спринта: Каждому спринту предшествует планирование, где команда определяет, какие задачи будут выполнены.
Ежедневные Scrum-встречи: Короткие ежедневные встречи (Stand-ups) для обсуждения прогресса, препятствий и планов на день.
Ретроспектива спринта: В конце каждого спринта команда анализирует, что прошло хорошо, что можно улучшить, и как это сделать.

🟠Артефакты
Product Backlog: Список всех задач и требований для продукта.
Sprint Backlog: Список задач, выбранных для выполнения в текущем спринте.
Burn-down Chart: График, показывающий оставшееся количество работы в спринте.

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

🚩Kanban

🟠Структура
Непрерывный поток работы: Kanban не имеет фиксированных временных интервалов или спринтов. Работа выполняется непрерывно.
Роли: В Kanban нет строгих определений ролей. Команда может включать любые роли по мере необходимости.

🟠Процессы и церемонии
Визуализация работы: Kanban использует доску с колонками для визуализации рабочего процесса (например, "To Do", "In Progress", "Done").
Лимиты на количество задач в работе (WIP): Ограничивает количество задач, которые могут находиться в определенных колонках одновременно, чтобы предотвратить перегрузку и улучшить поток работы.

🟠Артефакты
Kanban-доска: Основной инструмент для визуализации работы и контроля за её состоянием.
Карточки задач: Представляют отдельные задачи на Kanban-доске.

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какие знаешь принципы ООП?

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

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

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Примеры систем CP, AP и CA?

В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability).

🚩CP-системы (Consistency + Partition Tolerance)

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

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

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

🚩AP-системы (Availability + Partition Tolerance)

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

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

🟠DynamoDB (режим AP)
Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети.

🟠Riak
Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже.

🚩CA-системы (Consistency + Availability)

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

🟠Реляционные базы данных на одном сервере
Например, PostgreSQL или MySQL в традиционной конфигурации, работающей на одном сервере без распределения данных. Они поддерживают согласованность и доступность, так как нет сетевого разделения.
🟠Системы кэширования в локальной сети
Такие системы, как Redis, при отсутствии распределённой конфигурации и работе в пределах одного узла, могут обеспечить согласованность и доступность.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как можно заблокировать конкретные поля в Postgres?

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

🟠Использование блокировок уровня строки (Row-Level Locks)
PostgreSQL поддерживает блокировки уровня строки с помощью команд SELECT FOR UPDATE и SELECT FOR SHARE. Эти команды позволяют заблокировать конкретные строки для изменения другими транзакциями, пока текущая транзакция не завершится.SELECT FOR UPDATE:
BEGIN;  -- Начало транзакции

-- Выбираем и блокируем строки для обновления
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;

-- Выполняем необходимые операции
UPDATE my_table SET field = 'new_value' WHERE id = 1;

COMMIT; -- Завершение транзакции


SELECT FOR SHARE:
BEGIN;  -- Начало транзакции

-- Выбираем и блокируем строки для чтения
SELECT * FROM my_table WHERE id = 1 FOR SHARE;

-- Выполняем необходимые операции
-- Изменение данных будет заблокировано для других транзакций
-- Однако, можно выполнять SELECT
COMMIT; -- Завершение транзакции


🟠Использование политик доступа (Row-Level Security Policies)
Политики безопасности на уровне строк позволяют определить, кто и при каких условиях может видеть или изменять данные в таблице. Это обеспечивается с помощью функций и политик безопасности.
-- Включаем безопасность на уровне строк для таблицы
ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;

-- Создаем роль, которая будет иметь доступ
CREATE ROLE limited_role;

-- Создаем политику, которая позволяет только чтение данных
CREATE POLICY read_only_policy ON my_table
FOR SELECT
USING (true); -- Условие для выполнения SELECT

-- Применяем политику для роли limited_role
GRANT SELECT ON my_table TO limited_role;


🟠Использование триггеров (Triggers)
Триггеры позволяют автоматически выполнять определенные действия перед или после операции INSERT, UPDATE, DELETE. Можно создать триггер, который будет блокировать изменение конкретных полей.
CREATE OR REPLACE FUNCTION prevent_update()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.field IS DISTINCT FROM OLD.field THEN
RAISE EXCEPTION 'Field "field" cannot be updated';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Применяем триггер к таблице
CREATE TRIGGER prevent_update_trigger
BEFORE UPDATE ON my_table
FOR EACH ROW
EXECUTE FUNCTION prevent_update();


🟠Ограничения на уровне столбца (Column-Level Constraints)
Ограничения на уровне столбца могут использоваться для ограничения возможных значений или для создания выражений, которые должны быть выполнены для выполнения изменения.
ALTER TABLE my_table
ADD CONSTRAINT field_check CHECK (field IS NOT NULL);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Для чего можно использовать celery?

Celery поддерживает различные брокеры сообщений, включая RabbitMQ и Redis, для управления очередями задач.

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

🟠Асинхронное выполнение задач
Позволяет запускать длительные операции в фоновом режиме, освобождая основной поток выполнения приложения для других задач.
🟠Планирование задач
Поддержка периодических и плановых заданий, что позволяет автоматизировать повторяющиеся процессы.
🟠Управление распределёнными системами
Способен управлять задачами в распределенной системе, используя несколько рабочих узлов (workers) для параллельного выполнения задач.
🟠Масштабируемость
Легко масштабируется, добавляя больше рабочих узлов для увеличения производительности.

🚩Основные задачи

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

🟠Периодические задачи
Обновление данных: Регулярное обновление кэшей, индексов поиска или других данных в базе данных.
Мониторинг и сбор метрик: Периодический сбор и обработка метрик для мониторинга состояния системы.
Очистка данных: Периодическая очистка устаревших или временных данных из базы данных.

🟠Уведомления и оповещения
Уведомления в реальном времени: Отправка уведомлений пользователям через различные каналы (email, SMS, push-уведомления).
Событийное оповещение: Реагирование на события и триггеры, такие как изменения в базе данных или действия пользователя.

🟠Работа с большими данными и машинным обучением
Параллельная обработка данных: Выполнение параллельных вычислений для обработки больших объемов данных.
Машинное обучение: Асинхронное обучение моделей и выполнение предсказаний на больших наборах данных.

🟠Веб-скрейпинг и интеграция данных
Веб-скрейпинг: Асинхронный сбор данных с веб-сайтов для агрегации или анализа.
Интеграция данных: Асинхронная интеграция данных из различных источников и API.

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM