TGViewer
Channel Public Channel
Backend

Backend

@easy_backend

Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @sendme_ads
Subscribers
3.74K
Photos
38
Videos
0
Links
995

Showing posts older than #1605 · Back to latest

Older Posts 20 shown
Post #1604 300
🤔 Взаимодействие с асинхронной коммуникацией в распределённых системах

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

🚩Принципы и подходы

🟠Использование очередей сообщений и брокеров
Очереди сообщений (например, RabbitMQ, Apache Kafka, Amazon SQS) помогают отправлять и получать сообщения асинхронно, обеспечивая буфер между отправителем и получателем. Брокеры сообщений сохраняют сообщения до тех пор, пока получатель не будет готов их обработать, что помогает управлять потоками данных и уравновешивать нагрузку. Такой подход позволяет отправителю отправить сообщение и сразу продолжить свою работу, не дожидаясь ответа, что повышает производительность системы.

🟠Паттерн «Издатель-подписчик» (Publish-Subscribe)
В модели «издатель-подписчик» компоненты могут публиковать события, на которые подписаны другие компоненты, а брокер сообщений доставляет события всем подписчикам. Этот паттерн позволяет системе оставаться слабосвязанной, так как издатель не знает, сколько и какие конкретно сервисы получат событие. Такие системы часто применяются для уведомлений, регистрации событий, обработки данных и отправки уведомлений нескольким сервисам одновременно.

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

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

🚩Минусы

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

Ставь 👍 и забирай 📚 Базу знаний
Post #1603 329
🤔 Какая разница между базами данных MySQL и NoSQL?

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

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

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

🟠Модель управления данными
MySQL использует SQL для определения, манипуляции и управления данными. Поддерживает ACID (Atomicity, Consistency, Isolation, Durability) свойства, что обеспечивает надежные и согласованные транзакции.

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

🟠Случаи использования
Хорошо подходит для приложений с четко определенными структурами данных, такими как CRM, ERP системы, финансовые приложения и системы управления содержимым (CMS).

🚩NoSQL (Нереляционные базы данных)

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

🟠Модель управления данными
Используют разные способы доступа и управления данными, которые не требуют использования SQL. NoSQL базы данных часто следуют принципу CAP-теоремы (Consistency, Availability, Partition tolerance), делая акцент на доступности и устойчивости к разделению, иногда жертвуя строгой консистентностью.

🟠Масштабируемость
Легко масштабируются горизонтально, распределяя данные и нагрузку на несколько серверов, что позволяет эффективно работать с большими объемами данных и высокой нагрузкой.

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

🚩Основные различия

🟠Схема данных
MySQL: Фиксированная схема, данные хранятся в таблицах.
NoSQL: Гибкая схема, данные могут храниться в документах, ключ-значение, графах или столбцах.

🟠Запросы и управление данными
MySQL: SQL для запросов и управления данными.
NoSQL: Различные модели данных и запросов, не обязательно SQL.

🟠Консистентность и транзакции
MySQL: Поддерживает ACID транзакции.
NoSQL: Поддержка транзакций варьируется, часто следуют CAP-теореме, обеспечивая доступность и устойчивость к разделению.

🟠Масштабируемость:
MySQL: Для вертикальной масштабируемости.
NoSQL: Для горизонтальной масштабируемости.

Ставь 👍 и забирай 📚 Базу знаний
Post #1602 339
🤔 В чём различие между LeftJoin , RightJoin и InnerJoin ?

В SQL, JOIN операторы используются для объединения строк из двух или более таблиц на основе логического отношения между ними. Вот различия между LEFT JOIN, RIGHT JOIN и INNER JOIN:

🟠`INNER JOIN`
INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах, участвующих в соединении.
SELECT A.*, B.*
FROM TableA A
INNER JOIN TableB B ON A.id = B.id;


🟠`LEFT JOIN` (или `LEFT OUTER JOIN`)
LEFT JOIN возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, результат всё равно будет включать строки из левой таблицы с NULL значениями для столбцов из правой таблицы.
SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B ON A.id = B.id;


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
RIGHT JOIN возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, результат всё равно будет включать строки из правой таблицы с NULL значениями для столбцов из левой таблицы.
SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.id = B.id;


INNER JOIN
SELECT Employees.name, Departments.dept_name
FROM Employees
INNER JOIN Departments ON Employees.dept_id = Departments.dept_id;


LEFT JOIN
SELECT Employees.name, Departments.dept_name
FROM Employees
LEFT JOIN Departments ON Employees.dept_id = Departments.dept_id;


RIGHT JOIN
SELECT Employees.name, Departments.dept_name
FROM Employees
RIGHT JOIN Departments ON Employees.dept_id = Departments.dept_id;


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Post #1600 332
🤔 Что такое XML?

XML (Extensible Markup Language) — это расширяемый язык разметки, используемый для представления структурированных данных в формате, который легко читается как человеком, так и машиной. XML разработан для хранения и обмена данными между различными системами и платформами.

🚩Основные характеристики

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

🚩Структура XML-документа

🟠Пролог
Опциональная часть, которая может содержать информацию о версии XML и кодировке документа.
<?xml version="1.0" encoding="UTF-8"?>


🟠Корневой элемент
Каждый XML-документ должен иметь один корневой элемент, который содержит все остальные элементы.
   <root>
<!-- Другие элементы -->
</root>


🟠Элементы (теги)
Основные строительные блоки XML-документа. Элементы могут содержать текст, другие элементы и атрибуты.
   <book>
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>


🟠Атрибуты
Дополнительные данные, связанные с элементами. Атрибуты задаются внутри открывающего тега.
   <book genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>


Пример XML-документа
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1" genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
<book id="2" genre="non-fiction">
<title>Learning XML</title>
<author>Jane Smith</author>
<year>2022</year>
</book>
</library>


🚩Плюсы и минусы

➕Интероперабельность
XML используется для обмена данными между различными системами и приложениями, обеспечивая совместимость.

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

➕Стандартизация
XML является стандартом, поддерживаемым многими технологиями и инструментами.

➕Валидация
XML-документы могут быть проверены на соответствие определенной структуре с помощью схем XML Schema (XSD) или DTD (Document Type Definition).

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

➖Сложность парсинга
Обработка и парсинг XML-документов может быть сложным и требовать значительных вычислительных ресурсов по сравнению с другими форматами, такими как JSON.

Ставь 👍 и забирай 📚 Базу знаний
Post #1599 316
Завтра последний день!

Успей купить пожизненный easyoffer PRO - по цене 1 года

Покупаешь один раз — пользуешься всю жизнь.

👉 Акция до 31 марта: https://easyoffer.ru/pro
Post #1598 357
🤔 Как выбрать данные из двух таблиц без метода join()?

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

🟠Использование подзапросов в `SELECT`
Вы можете использовать подзапрос в операторе SELECT, чтобы извлечь данные из одной таблицы, используя значения из другой таблицы.
SELECT 
o.order_id,
o.order_date,
(SELECT c.customer_name FROM customers c WHERE c.customer_id = o.customer_id) AS customer_name
FROM
orders o;


🟠Использование подзапросов в `WHERE`
Вы можете использовать подзапрос в операторе WHERE, чтобы фильтровать данные на основе условий из другой таблицы.
SELECT 
o.order_id,
o.order_date
FROM
orders o
WHERE
o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.city = 'New York');


🟠Использование подзапросов в `FROM`
Вы можете использовать подзапрос в операторе FROM, чтобы создать временную таблицу и затем выбрать данные из нее.
SELECT 
c.customer_name,
latest_orders.order_id,
latest_orders.order_date
FROM
customers c,
(SELECT
o.customer_id,
o.order_id,
o.order_date
FROM
orders o
WHERE
o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id)
) AS latest_orders
WHERE
c.customer_id = latest_orders.customer_id;


🟠Использование подзапросов с агрегатными функциями
Подзапросы могут быть полезны при использовании агрегатных функций для получения обобщенной информации из одной таблицы, связанной с другой таблицей.
SELECT 
c.customer_name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.customer_id) AS total_orders
FROM
customers c;


🟠Использование подзапросов с операторами EXISTS
Оператор EXISTS проверяет наличие строк в подзапросе и возвращает TRUE, если подзапрос возвращает хотя бы одну строку.
SELECT 
c.customer_name
FROM
customers c
WHERE
EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);


Ставь 👍 и забирай 📚 Базу знаний
Post #1597 332
🤔 Обеспечение отказоустойчивости веб-приложения

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

🚩Методы

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

🟠Горизонтальное масштабирование и кластеризация
Развертывание приложения на нескольких серверах (в кластере) позволяет избежать единой точки отказа (SPOF — Single Point of Failure). Горизонтальное масштабирование даёт возможность добавлять дополнительные серверы при увеличении нагрузки, что повышает отказоустойчивость и общую производительность системы. Сервисы, такие как Kubernetes и Docker Swarm, упрощают управление и оркестрацию контейнеров в кластере, автоматизируя процесс развертывания, обновлений и балансировки нагрузки.

🟠Механизмы резервного копирования и репликации данных
Важные данные должны регулярно сохраняться в резервных копиях и реплицироваться на несколько узлов или в несколько дата-центров. Репликация базы данных (например, master-slave или master-master репликация) обеспечивает доступность данных, даже если один из узлов выходит из строя. Для обеспечения целостности данных реплики могут быть синхронными (обеспечивают актуальность данных на всех узлах, но добавляют задержку) или асинхронными (с меньшей задержкой, но возможностью устаревания данных).

🟠Кеширование и использование CDN
Использование кешей (Redis, Memcached) снижает нагрузку на базу данных и позволяет быстрее обрабатывать запросы, снижая риски сбоев из-за высокой нагрузки. Content Delivery Network (CDN) распределяет контент по серверам, находящимся близко к пользователю. Это снижает нагрузку на основной сервер и обеспечивает доступность контента в случае перегрузки или отказа в одном из центров обработки данных.

🟠Автоматическое восстановление и мониторинг системы
Настройка систем мониторинга (например, Prometheus, Grafana, New Relic) позволяет оперативно выявлять сбои и реагировать на проблемы. Системы автоматического восстановления могут перезапускать упавшие серверы или контейнеры. Например, инструменты оркестрации, такие как Kubernetes, могут автоматически восстанавливать неработающие контейнеры. Настройка системы оповещений для обнаружения потенциальных проблем (например, медленного ответа сервера) позволяет вовремя реагировать на них и предотвращать крупные сбои.

🟠Использование очередей сообщений
Для работы с критически важными задачами, которые могут быть временно отложены, целесообразно использовать системы очередей сообщений (например, RabbitMQ, Kafka). Очереди позволяют обрабатывать запросы асинхронно, обеспечивая бесперебойную работу системы при перегрузках. Если один компонент выходит из строя, другой может продолжить обработку сообщений из очереди после восстановления.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1595 367
🤔 Какие существуют нормальные формы в SQL?

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

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

🟠Вторая нормальная форма (2NF)
Таблица находится во 2NF, если: Она находится в 1NF. Все неключевые столбцы полностью зависят от всего первичного ключа, а не от его части.
Пример
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.

🟠Третья нормальная форма (3NF)
Таблица находится в 3NF, если: Она находится во 2NF. Все неключевые столбцы зависят только от первичного ключа, а не от других неключевых столбцов.
Пример
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.

🟠Бойс-Кодд нормальная форма (BCNF)
Таблица находится в BCNF, если: Она находится в 3NF. Для каждой функциональной зависимости X -> Y, X является суперключом.
Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.

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

🟠Пятая нормальная форма (5NF)
Таблица находится в 5NF, если: Она находится в 4NF. В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.
Пример:
Если у вас есть сложные зависимости между несколькими таблицами, то нужно убедиться, что все соединения этих таблиц могут быть разложены обратно без потери информации.

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

Ставь 👍 и забирай 📚 Базу знаний
Post #1594 360
🤔 В чем разница между Postgres и MySQL?

Это реляционные системы управления базами данных (СУБД), но у них есть значительные различия, которые влияют на выбор той или иной системы в зависимости от проекта.

🟠Архитектура и модель хранения данных
PostgreSQL — объектно-реляционная СУБД (ORDBMS), поддерживающая расширяемость, сложные структуры данных и расширенные функции. Она использует MVCC (Multiversion Concurrency Control) для обработки транзакций.
MySQL — классическая реляционная СУБД (RDBMS). По умолчанию использует механизм хранения InnoDB, который поддерживает ACID, но менее гибок, чем у PostgreSQL.

🟠Язык SQL и расширенные функции
PostgreSQL поддерживает более сложные SQL-конструкции, такие как CTE (Common Table Expressions), оконные функции, пользовательские типы данных и полнотекстовый поиск.
MySQL менее гибок в плане сложных SQL-запросов, хотя в новых версиях поддержка CTE и оконных функций была добавлена.

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

🟠Расширяемость
PostgreSQL позволяет добавлять новые типы данных, операторы и даже писать пользовательские функции на различных языках (PL/pgSQL, Python, JavaScript и др.).
MySQL менее гибок, хотя поддерживает хранимые процедуры и триггеры.

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

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

🟠Поддержка JSON и NoSQL-функций
PostgreSQL изначально поддерживает JSONB, что делает его хорошим выбором для гибридных реляционно-документных решений.
MySQL тоже поддерживает JSON, но его функциональность более ограничена.

🟠Сообщество и лицензия
PostgreSQL — полностью open-source (лицензия PostgreSQL), активно развивается сообществом.
MySQL принадлежит Oracle, и хотя есть open-source-версия, некоторые функции доступны только в коммерческих редакциях.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1592 340
🤔 Что знаешь о принципах программирования DRY?

Это принцип программирования, который гласит, что информация или логика в коде не должны дублироваться. Каждый фрагмент знаний должен иметь одно, однозначное и авторитетное представление в системе. Этот принцип был введен в книге "The Pragmatic Programmer" Эндрю Хантом и Дэвидом Томасом.

🚩Аспекты

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

🚩Примеры применения

🟠Функции и методы
Вынос общих операций в функции или методы, которые затем можно вызывать в различных частях программы.
🟠Модули и библиотеки
Создание модулей или библиотек, которые содержат повторяющуюся логику и могут быть переиспользованы в различных проектах.
🟠Константы
Объявление констант вместо использования "магических чисел" или строковых литералов в нескольких местах кода.
🟠Шаблоны
Использование шаблонов в HTML, XML или других языках разметки для генерации повторяющихся структур.
🟠Конфигурационные файлы
Хранение конфигурационных данных в одном месте, а не встраивание их в код.

🚩Плюсы

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

🚩Примеры нарушений

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

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1591 355
🤔 Что такое блокировки (локи) в БД?

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

🚩Основные типы

🟠Блокировки уровня таблицы (Table-Level Locks):
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).

🟠Блокировки уровня строки (Row-Level Locks):
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.

🟠Консультативные блокировки (Advisory Locks):
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.

🚩Основные цели

🟠Предотвращение гонок (race conditions):
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
🟠Изоляция транзакций:
Выполнение каждой транзакции в изолированном контексте.
🟠Защита целостности данных:
Предотвращение одновременного изменения данных, что может привести к их несогласованности.

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

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

🚩Проблемы, связанные с блокировками

🟠Дедлоки (Deadlocks):
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
🟠Гранулярность блокировок:
Блокировки высокой гранулярности могут снижать производительность.

Ставь 👍 и забирай 📚 Базу знаний
Post #1590 341
🤔 Как работает хеш таблица?

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

🚩Основные концепции

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

🟠Коллизии
Это ситуации, когда два разных ключа хешируются в один и тот же индекс. Существуют различные методы разрешения коллизий:
Метод цепочек (chaining): В каждой ячейке массива хранится список (или другая структура данных), содержащий все значения, соответствующие этому индексу.
Открытая адресация (open addressing): При коллизии ищется другая свободная ячейка по определённому алгоритму (например, линейное пробирование, квадратичное пробирование или двойное хеширование).

🟠Размер хеш-таблицы
Количество ячеек (бакетов) в массиве. Оптимальный размер зависит от количества ключей и используемой хеш-функции. Обычно размер выбирается простым числом для уменьшения вероятности коллизий.

🚩Как работает хеш-таблица

🟠Вставка элемента
Хеш-функция вычисляет индекс для ключа.
Если ячейка пуста, значение записывается в неё.
Если ячейка занята (коллизия), применяется выбранный метод разрешения коллизий.

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

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

Ставь 👍 и забирай 📚 Базу знаний
Post #1589 370
🤔 Что такое клиент серверная архитектура?

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

🚩Основные компоненты клиент-серверной архитектуры

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

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

🚩Принцип работы клиент-серверной архитектуры

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Post #1588 348
🤔 Что такое IP?

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

🚩Основные аспекты IP:

Адресация: IP адресация обеспечивает уникальные адреса для устройств в сети, что позволяет им взаимодействовать друг с другом. Существует две версии IP адресации:
🟠Использует 32-битные адреса, что позволяет создать около 4,3 миллиарда уникальных адресов.
🟠Пример IPv4 адреса: 192.168.0.1
🟠IPv6 (Internet Protocol version 6):
🟠Использует 128-битные адреса, что позволяет создать около 340 ундециллионов (3,4×10^38) уникальных адресов.
🟠Пример IPv6 адреса: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

Маршрутизация: IP отвечает за определение пути для передачи пакетов от источника к назначению через сеть, включая множество промежуточных маршрутизаторов. Это позволяет передавать данные через различные сети и соединения.

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

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

🚩Основные функции IP:

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

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

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

🚩Недостатки IP

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

🚩Взаимодействие с другими протоколами

IP работает в комбинации с другими протоколами, чтобы обеспечить полное взаимодействие в сети:
🟠TCP (Transmission Control Protocol): Работает поверх IP и обеспечивает надежную передачу данных, проверку ошибок и управление потоком.
🟠UDP (User Datagram Protocol): Также работает поверх IP, но не обеспечивает надежность, что делает его подходящим для приложений, требующих высокой скорости и низкой задержки, таких как потоковая передача и игры.
🟠ICMP (Internet Control Message Protocol): Используется для передачи диагностических и управляющих сообщений, таких как запросы ping.

Ставь 👍 и забирай 📚 Базу знаний
Post #1587 367
🤔 Что происходит в конце спринта?

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

🚩Основные события в конце спринта

🟠Завершение задач спринта
Все задачи, включённые в спринт, должны быть либо выполнены, либо перенесены с соответствующими комментариями. Завершённые задачи проверяются на соответствие критериям "готовности" (Definition of Done, DoD). Если задачи не выполнены, они возвращаются в бэклог продукта для повторной оценки в будущем.

🟠Демонстрация инкремента (Sprint Review)
Показать заинтересованным сторонам результат работы команды. Команда демонстрирует готовый продукт или его обновления. Обсуждаются выполненные задачи, изменения в продукте и обратная связь от заказчиков или других участников. Результат: обновление бэклога продукта с учётом новой информации.

🟠Ретроспектива спринта (Sprint Retrospective)
Цель: анализировать, что прошло хорошо, что можно улучшить и какие действия предпринять в будущем. Участники обсуждают положительные моменты, трудности и проблемы, возникшие в процессе работы. Генерируются идеи для улучшения, которые затем внедряются в следующих спринтах. Используются форматы для выявления проблем, такие как "Start, Stop, Continue" или "Что было хорошо, что плохо, что можно улучшить".

🟠Обновление метрик
Обновление burndown chart, velocity chart или других метрик, используемых для отслеживания прогресса. Анализ выполнения целей спринта (например, процент выполненных задач). Уроки, извлечённые из анализа метрик, учитываются при планировании будущих спринтов.

🚩Итоговые действия перед началом нового спринта

🟠Рефайнмент бэклога продукта
С учётом новых идей, задач и обратной связи обновляется приоритет задач.
🟠Подготовка к планированию следующего спринта (Sprint Planning)
Команда и Product Owner готовятся к обсуждению целей нового спринта.
🟠Документирование
Фиксация результатов спринта, включая завершённые задачи, обратную связь и итоги ретроспективы.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Post #1586 348
🤔 Что такое singleton?

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

🚩Характеристики

🟠Единственный экземпляр
Класс Singleton создаёт только один экземпляр своего типа и предотвращает создание дополнительных экземпляров.
🟠Глобальная точка доступа
Singleton предоставляет глобальный доступ к своему экземпляру. Это может быть реализовано через статический метод, который возвращает экземпляр класса.

🚩Реализация на Python

class Singleton:
_instance = None

def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


🚩Реализация на Java

public class Singleton {
private static Singleton instance;

private Singleton() {
// приватный конструктор предотвращает создание объектов вне класса
}

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

// Пример использования
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();

System.out.println(singleton1 == singleton2); // True


Ставь 👍 и забирай 📚 Базу знаний
Post #1585 370
🤔 Почему NULL часто называют «Ошибкой на миллиард долларов»?

Термин «Ошибка на миллиард долларов» (The Billion Dollar Mistake) был введён Тони Хоаром (Tony Hoare), создателем NULL, который в 2009 году на конференции признался, что введение NULL было его крупнейшей ошибкой. Название связано с тем, что NULL стал причиной множества багов, сбоев в программах и уязвимостей, что привело к огромным финансовым потерям в индустрии.

🚩Какие проблемы вызывает `NULL`?

🟠NullPointerException (NPE) и аварийные сбои
- Попытка вызвать метод у NULL приводит к ошибке NullPointerException в Java, NullReferenceException в C# и аналогичным сбоям в других языках.
- Это одна из самых распространённых ошибок в программировании.

🟠Дополнительные проверки и сложность кода
- Из-за NULL приходится постоянно писать проверки if (x != null), что раздувает код и делает его менее читаемым.
- Если забыть такую проверку, можно получить неожиданный сбой.

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

🟠Проблемы с базами данных
- NULL в SQL ведёт себя неинтуитивно (NULL != NULL, сравнение может давать UNKNOWN).
- Может приводить к некорректным вычислениям в агрегатных функциях.

🟠Уязвимости в безопасности
- Некоторые атаки используют NULL для взлома систем (например, null dereference в C/C++ может привести к DoS-атаке).
- NULL может скрывать ошибки и приводить к утечке данных.

🚩Какие альтернативы `NULL`?

🟠Optional / Maybe (Java, Kotlin, Haskell, Rust)
- Использование обёрток вроде Optional<T> (Java) или Option<T> (Rust) позволяет явно указывать возможность отсутствия значения.

🟠Исключения вместо `NULL` (C# и Java)
- Вместо возврата NULL можно выбрасывать осмысленные исключения (IllegalArgumentException, NotFoundException).

🟠Специальные значения по умолчанию
- Вместо NULL можно использовать дефолтные объекты (EmptyList, GuestUser и т. д.).

🟠Типы-юнит (Tagged Union) в функциональных языках
- Например, в Haskell и Rust применяют Either<T, E>, Option<T>, что делает обработку NULL-подобных случаев более явной.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Post #1584 384
🤔 В чём разница между сцеплением и связанностью?

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

🚩Отличия

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

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

🚩Пример

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

🚩 Сравнение

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

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1583 368
🤔 Основные подводные камни удалённых вызовов?

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

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

🟠Обработка ошибок
Обработка ошибок в распределённых системах сложнее, чем при локальных вызовах:
Необходимо обрабатывать такие ошибки, как потеря соединения, тайм-ауты, отказ сервера. В некоторых случаях может возникнуть "проблема повторного вызова" (например, запрос был выполнен, но подтверждение потерялось), что приводит к возможной идемпотентности операций.

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

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

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

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

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

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

🟠Для создания распределённых систем
Микросервисные архитектуры. Взаимодействие клиент-сервер (например, мобильное приложение и API). Системы с тяжёлой серверной логикой.
🟠Чтобы избежать подводных камней
Чётко проектировать архитектуру, учитывая особенности сети. Использовать идемпотентные операции. Обеспечивать надёжные стратегии обработки ошибок. Применять мониторинг и трассировку (например, OpenTelemetry) для отслеживания поведения системы.

Ставь 👍 и забирай 📚 Базу знаний
Post #1582 349
🤔 Как с помощью одного запроса можно выбрать данные из двух таблиц?

Чтобы выбрать данные из двух таблиц в одном запросе, используется оператор JOIN. Например, INNER JOIN объединяет строки, где есть совпадения в обеих таблицах, а LEFT JOIN возвращает все строки из первой таблицы и соответствующие строки из второй, заполняя NULL там, где данных нет.

🚩Отличия между видами JOIN в SQL

В SQL существует несколько видов операторов JOIN, которые позволяют объединять данные из двух или более таблиц на основе определенных условий. Основные типы JOIN включают INNER JOIN, LEFT JOIN, RIGHT JOIN, и каждый из них имеет свои особенности и использование. Рассмотрим их различия на примере двух таблиц:

Таблица A:
id | name
-----------
1 | Alice
2 | Bob
3 | Charlie


Таблица B:
id | city
-----------
1 | New York
3 | Los Angeles
4 | Chicago


🟠INNER JOIN
INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах. Если нет совпадающих строк, такие строки не включаются в результат.
SELECT A.id, A.name, B.city
FROM A
INNER JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles


🟠LEFT JOIN (или LEFT OUTER JOIN)
LEFT JOIN возвращает все строки из левой таблицы (A) и совпадающие строки из правой таблицы (B). Если совпадения не найдено, в результате будут строки из левой таблицы с NULL значениями для столбцов из правой таблицы.
SELECT A.id, A.name, B.city
FROM A
LEFT JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
RIGHT JOIN возвращает все строки из правой таблицы (B) и совпадающие строки из левой таблицы (A). Если совпадения не найдено, в результате будут строки из правой таблицы с NULL значениями для столбцов из левой таблицы.
SELECT A.id, A.name, B.city
FROM A
RIGHT JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles
4 | NULL | Chicago


🟠FULL JOIN (или FULL OUTER JOIN)
FULL JOIN возвращает все строки, когда есть совпадение в одной из таблиц. Это объединение LEFT JOIN и RIGHT JOIN. Если совпадения не найдено, результат будет содержать NULL значения для столбцов из другой таблицы.
SELECT A.id, A.name, B.city
FROM A
FULL JOIN B ON A.id = B.id;
id | name | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles
4 | NULL | Chicago


Ставь 👍 и забирай 📚 Базу знаний
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →