Значение
null считается ошибкой в программировании, потому что оно часто приводит к непредсказуемым ошибкам, сложным для отладки и устранения. Его использование стало настолько проблематичным, что создатель null — Тони Хоар — назвал его "миллиардной ошибкой" из-за огромного количества проблем и уязвимостей, которые оно вызвало.null используется для обозначения "отсутствия значения", но сама по себе идея "пустоты" вводит двусмысленность в код. Например: "Отсутствует ли значение из-за ошибки, или это нормальное поведение?".Попытка вызвать метод или обратиться к полю объекта, который равен
null, приводит к исключению, например, NullPointerException в Java или TypeError в JavaScript. Эти ошибки сложно предсказать на этапе компиляции и они часто приводят к сбоям программы.String name = null;
int length = name.length(); // NullPointerException
null-ошибки часто проявляются в непредсказуемых местах, что делает их сложными для поиска. Программисты тратят много времени на отладку, чтобы понять, откуда возникло null.Каждый раз, когда переменная может быть
null, программист должен явно проверять её наличие перед использованием. Это делает код многословным и менее читаемым. Плохой код if (user != null && user.getAddress() != null) {
String city = user.getAddress().getCity();
}null не соответствует типу, который описывает переменную. Например, если переменная типа String равна null, то фактически в ней нет строки. Это нарушает типобезопасность и вносит неявное поведение в программу.Часто
null используется для обозначения нескольких состояний одновременно: "значение не инициализировано", "значение отсутствует" или "ошибка при получении данных". Это приводит к логическим ошибкам и двусмысленности.Если несколько потоков работают с общим объектом, и один из них устанавливает его в
null, то другие потоки могут столкнуться с ошибками времени выполнения.Из-за потенциального наличия
null разработчики должны добавлять дополнительные проверки, чтобы избежать ошибок. Это делает код менее чистым и увеличивает вероятность пропустить проверку. null
В Java, Kotlin и других языках существуют Optional (или аналоги), которые явно представляют "наличие или отсутствие значения". Это заставляет разработчика явно обрабатывать "пустое" состояние.
Optional<String> name = Optional.ofNullable(user.getName());
name.ifPresent(System.out::println);
В функциональных языках (Haskell, Scala) используются монады Maybe/Option, которые безопасно обрабатывают отсутствие значения.
Вместо использования
null можно задавать значения по умолчанию, например, пустую строку "" или 0 для чисел.Это шаблон проектирования, где вместо
null используется специальный "пустой объект", который имеет предсказуемое поведение. Например, вместо null можно вернуть объект с "пустыми" методами.class NullUser extends User {
@Override
public String getName() {
return "Unknown User";
}
}ength =
В Kotlin и Swift типы разделяются на nullable и non-nullable. Компилятор заставляет разработчика обрабатывать потенциальный
null.val name: String? = null // nullable
println(name?.length) // Безопасный вызов
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это платформа для контейнеризации, позволяющая запускать приложения в изолированных контейнерах. Контейнеры включают всё необходимое для работы приложения: код, библиотеки и зависимости. Это обеспечивает лёгкость развертывания, масштабируемость и консистентность среды выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Это два разных подхода к обмену сообщениями между компонентами распределённых систем. Они различаются архитектурными принципами, целями и способами взаимодействия между отправителями и получателями.
Это коммуникационная модель, при которой один компонент системы отправляет запрос другому компоненту и ожидает ответа.
Обычно предполагает синхронное взаимодействие, где отправитель блокируется до получения ответа.
Один запрос адресован одному конкретному получателю.
Для обработки ответа отправитель использует корреляционный идентификатор, чтобы сопоставить его с исходным запросом.
Это асинхронная модель взаимодействия, в которой один компонент публикует сообщения, а другие компоненты, подписанные на эти сообщения, получают их.
Публикация сообщений и их получение подписчиками происходят независимо.
Сообщение может быть отправлено нескольким подписчикам одновременно.
Публикация осуществляется в рамках определённых тем или каналов, а подписчики получают только интересующие их сообщения.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Различия в обработке родных (first-party) и сторонних (third-party) куки обусловлены соображениями безопасности, конфиденциальности и контекста использования. Эти различия возникают из-за того, что родные куки создаются и используются непосредственно сайтом, который пользователь посещает, в то время как сторонние куки обычно принадлежат и используются другими доменами (например, рекламными сетями), которые интегрированы в сайт.
Родные куки создаются доменом, который пользователь непосредственно посещает. Они используются для хранения информации, связанной с сессией пользователя или предпочтениями.
Авторизация пользователя.
Сохранение настроек сайта, таких как язык или тема оформления.
Хранение данных о товарах в корзине интернет-магазина.
Они считаются менее рискованными с точки зрения безопасности и конфиденциальности. Доступ к этим кукам имеет только сайт, который их установил. По умолчанию браузеры предоставляют полный доступ к родным кукам.
Сторонние куки устанавливаются другим доменом, отличным от того, который пользователь посещает. Обычно это происходит через интеграцию внешних сервисов, таких как рекламные сети, аналитические платформы или социальные виджеты.
Таргетированная реклама.
Аналитика кросс-доменного поведения пользователей.
Ретаргетинг.
Считаются более уязвимыми с точки зрения конфиденциальности, так как позволяют сторонним организациям отслеживать поведение пользователей на множестве сайтов.
Современные браузеры ограничивают или блокируют доступ к сторонним кукам:
Safari (Intelligent Tracking Prevention) и Firefox (Enhanced Tracking Protection) автоматически блокируют сторонние куки.
Google Chrome также планирует отказаться от сторонних куков, заменяя их на Privacy Sandbox.
a) Защита конфиденциальности
Сторонние куки используются для отслеживания пользователей на разных сайтах, что может нарушать их приватность. Регуляции, такие как GDPR и CCPA, требуют строгого контроля над сбором персональных данных.
b) Минимизация рисков безопасности
Сторонние куки могут быть использованы злоумышленниками для атак (например, CSRF). Ограничение доступа к таким кукам снижает эти риски.
c) Пользовательский контроль
Современные браузеры предоставляют пользователям больше контроля над тем, какие куки они принимают. Ограничение сторонних куков снижает вероятность нежелательной активности со стороны третьих лиц.
d) Регуляторные требования:
Правовые нормы требуют информировать пользователей о сборе данных и получать их согласие. Разные подходы к обработке куков помогают соблюдать эти требования.
Родные куки доступны только для домена, который их установил, и передаются только в рамках запросов к этому домену. Сторонние куки могут использоваться только если браузер явно разрешает это, либо если сервер настроен для совместимости с современными политиками (например,
SameSite=None; Secure).Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. LEFT JOIN: возвращает все строки из левой таблицы и совпадающие строки из правой.
3. RIGHT JOIN: возвращает все строки из правой таблицы и совпадающие строки из левой.
4. FULL OUTER JOIN: объединяет все строки из обеих таблиц, заполняя несоответствия NULL.
5. CROSS JOIN: возвращает декартово произведение строк двух таблиц.
6. SELF JOIN: соединяет таблицу саму с собой.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Событийно-ориентированная архитектура (event-driven architecture, EDA) улучшает масштабируемость за счет асинхронного и независимого взаимодействия между компонентами системы. Основной принцип EDA — использование событий в качестве триггеров для выполнения задач, что устраняет прямую зависимость между инициатором события и его обработчиками. Это позволяет системе более гибко реагировать на рост нагрузки и распределять её между различными частями системы.
В событийно-ориентированной архитектуре компоненты взаимодействуют через обмен сообщениями (событиями) без необходимости ожидания ответа. Это снижает блокировки, позволяет эффективно использовать ресурсы и масштабировать каждый компонент независимо. Если пользователь инициирует действие, например, загрузку файла, событие записывается в очередь. Обработка события выполняется в отдельном потоке или сервисе, что позволяет обрабатывать множество запросов одновременно.
EDA строится на слабой связанности компонентов: каждый сервис отвечает только за обработку определённых событий. Компоненты могут масштабироваться автономно, без влияния на другие части системы. Если в системе интернет-магазина одновременно увеличивается количество заказов и запросов аналитики, можно масштабировать сервис обработки заказов независимо от аналитического сервиса.
События отправляются в очереди сообщений или брокеры (Kafka, RabbitMQ, AWS SNS/SQS), которые выступают посредниками между производителями и потребителями событий. Это позволяет сглаживать пики нагрузки и временно сохранять события до их обработки, что улучшает масштабируемость. Если нагрузка на обработку увеличивается, можно просто добавить больше обработчиков событий, не изменяя остальную часть системы.
Сервисы, реагирующие на события, могут быть легко клонированы (горизонтально масштабированы), чтобы увеличить пропускную способность системы. Видеохостинг может масштабировать сервисы обработки видео, чтобы справляться с увеличением количества загрузок.
В EDA события — это четко определённые сообщения, которые передают состояние системы. Это упрощает добавление новых компонентов без изменения существующих. Новые компоненты могут подписываться на события и обрабатывать их, не нарушая текущую логику системы. Аналитическая система может быть подключена для обработки событий о действиях пользователей без необходимости вмешательства в код основной системы.
При внезапных всплесках трафика (например, во время распродаж) EDA позволяет накапливать события в очередях до тех пор, пока они не будут обработаны. Это снижает риск отказа системы под нагрузкой. Если сервис обработки платежей перегружен, события транзакций могут временно оставаться в очереди, чтобы быть обработанными позже.
EDA хорошо подходит для распределённых систем, так как её архитектура учитывает разнородность компонентов. Каждый компонент работает автономно, что облегчает их масштабирование и развёртывание в различных средах.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. Парсинг HTML: полученный код анализируется, создаётся DOM-дерево, которое описывает структуру страницы.
3. Загрузка ресурсов: CSS, JavaScript, изображения загружаются асинхронно. CSS формирует CSSOM (модель стилей), объединяясь с DOM.
4. Рендеринг: DOM и CSSOM объединяются в Render Tree, и браузер отображает страницу, выполняя раскладку и отрисовку.
5. JavaScript: выполняется на этапе рендеринга или после загрузки страницы, обновляя DOM.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Удалённый вызов процедур (Remote Procedure Call, RPC) используется для взаимодействия между компонентами распределённой системы, позволяя одной системе вызывать функции, реализованные в другой. Несмотря на удобство, RPC имеет несколько подводных камней, связанных с особенностями распределённых систем, сетевых взаимодействий и управления состоянием.
В отличие от локальных вызовов, удалённые вызовы зависят от сети, которая может быть ненадёжной. Пакеты могут теряться, задерживаться или приходить в неправильном порядке. Вызовы могут завершаться с таймаутами или зависать. Сложность восстановления после сетевых сбоев. Использовать повторные попытки (retries) с экспоненциальной задержкой. Проектировать системы, способные выдерживать временные сбои.
RPC неизбежно добавляет задержку из-за времени передачи данных по сети и сериализации/десериализации сообщений. Снижение производительности системы при большом количестве вызовов. Минимизировать количество RPC-вызовов, объединяя данные в пакеты. Использовать кеширование на стороне клиента.
Передача данных между системами требует их преобразования в формат, понятный обеим сторонам (например, JSON, Protobuf). Потери производительности из-за дополнительной обработки. Потенциальные ошибки преобразования из-за несовместимости форматов. Использовать оптимальные протоколы сериализации (например, Protobuf быстрее и компактнее, чем JSON). Тестировать совместимость форматов при изменении контрактов.
Изменение интерфейса RPC-сервиса (например, добавление новых параметров) может нарушить работу существующих клиентов. Поломка системы из-за несовместимости старых клиентов с новым API. Применять версионирование API. Использовать backward-compatible изменения (например, добавление необязательных полей).
RPC вызывает функции в удалённой системе, где их выполнение не является атомарным (например, если соединение разорвано). Частичное выполнение операций, что может привести к неконсистентности данных. Использовать механизмы транзакций, например, с помощью паттерна Saga для распределённых систем.
Клиенты не могут точно знать, завершился ли удалённый вызов, если произошёл тайм-аут. Клиент может повторить запрос, что приведёт к дублированию операций. Использовать идемпотентные операции (вызовы, результат которых одинаков независимо от числа выполнений). Определять чёткие тайм-ауты и возвращать клиенту информацию о статусе.
Отладка RPC сложнее из-за распределённого характера системы. Сложно отслеживать вызовы, возникающие между сервисами. Затруднён поиск причин ошибок. Использовать распределённые трейсинг-системы, такие как Jaeger или Zipkin.
RPC вызывает удалённые функции, которые могут быть атакованы злоумышленниками. Утечка данных, несанкционированное выполнение операций. Использовать шифрование (например, TLS). Применять аутентификацию и авторизацию (например, с использованием OAuth или JWT).
С ростом нагрузки увеличивается количество RPC-вызовов, что может перегружать сервис. Замедление или отказ системы. Использовать балансировку нагрузки. Проектировать системы с учётом горизонтального масштабирования.
RPC может сделать систему слишком связанной, так как компоненты напрямую зависят от вызовов друг друга. Усложнение изменений и тестирования. Применять более слабую связанность, например, через событийно-ориентированную архитектуру или очереди сообщений.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
• В CSS миксины добавляют группы стилей, которые можно переиспользовать.
• В JavaScript миксины реализуются через передачу методов или функционала между объектами.
Миксины помогают избегать дублирования кода и добавлять новые возможности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Отказоустойчивость системы — это её способность продолжать работать в случае отказа компонентов. Тестирование отказоустойчивости (resilience testing) направлено на проверку того, как система ведёт себя при сбоях, выявление уязвимостей и подтверждение эффективности мер по их устранению.
Этот метод предполагает преднамеренное внесение сбоев в систему, чтобы проверить её реакцию. Используются инструменты или ручные действия для моделирования отказов.
Недоступность узла.
Потеря сети или задержка.
Перегрузка памяти или процессора.
Моделируется нагрузка, превышающая обычный рабочий уровень, чтобы выявить, какие компоненты начинают отказывать под давлением.
Увеличение количества запросов к API.
Снижение доступных системных ресурсов (памяти, дисковое пространство).
Проверяется, насколько быстро и корректно система может восстановиться после сбоя.
Перезапуск сервисов.
Переключение на резервные копии данных.
Моделируются случайные сбои в производственной среде или её имитации для изучения поведения системы.
Chaos Monkey от Netflix.
Потеря соединения между сервисами.
Высокая задержка (latency).
Нестабильность сети (пакеты теряются, приходят с ошибками).
Отключение сервера или узла кластера.
Отказ жёсткого диска.
Уменьшение доступной памяти.
Непредвиденные исключения в коде.
Утечки памяти.
Перегрузка из-за неэффективных алгоритмов.
Всплеск количества пользователей.
Увеличение объёма входящих данных (например, в API или БД).
Недоступность внешних API или сервисов.
Непредсказуемое поведение внешних систем (например, возвращают неверные данные).
Выключение серверов. Уменьшение доступной памяти или процессорных ресурсов. Отключение или замедление сети.
Chaos Monkey: Генерация случайных сбоев в продакшене.
Gremlin: Моделирование различных видов отказов (сети, ресурсов, зависимостей).
Toxiproxy: Симуляция проблем с сетевым соединением (задержки, потеря пакетов).
Fault Injection Tool (FIT): Моделирование аппаратных и программных сбоев.
Использование инструментов для нагрузочного тестирования, таких как JMeter или Locust, для увеличения нагрузки до критических значений.
Ручное или автоматическое выключение сервисов и проверка работы механизмов восстановления (например, перезапусков через Orchestrator типа Kubernetes).
Как долго система остаётся недоступной после сбоя?
За сколько времени система восстанавливает свою работоспособность?
Какой объём данных теряется при сбоях?
Система возвращается в нормальное состояние или остаётся уязвимой?
От отдельных компонентов до всей системы.
Регулярное выполнение сценариев отказа.
Минимизировать риски в продакшене.
Только в зрелой системе для точных результатов.
Для анализа и улучшения системы.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
• В JavaScript используются шаблонные строки с синтаксисом ${expression}.
• В CSS, например, в препроцессорах (Sass), интерполяция позволяет динамически подставлять значения в свойства.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Восстановление работоспособности системы после сбоя — это процесс возвращения её в стабильное состояние, при котором она может продолжать выполнение своих функций. Однако, этот процесс может быть сложным из-за множества потенциальных проблем, возникающих на этапах диагностики, исправления и восстановления.
Выявление корневой причины (root cause) может быть затруднено в сложных распределённых системах. Ложные сигналы и ошибки усложняют диагностику.
Сбой вызван внешним API, но он маскируется внутренними проблемами. Непредсказуемые сбои в сети.
Использование инструментов для логирования и мониторинга (например, ELK Stack, Prometheus). Внедрение распределённого трейсинга (Jaeger, Zipkin).
Если данные не были надёжно сохранены, сбой может привести к их потере или неконсистентности.
Запрос был частично обработан перед сбоем. Утеря транзакции из-за недоступности базы данных.
Использовать механизмы журналирования (write-ahead logging). Реализовать стратегии резервного копирования и восстановления (backup & restore). Использовать идемпотентные операции для повторного выполнения.
Ручное восстановление занимает больше времени и подвержено ошибкам.
Сложная последовательность действий для перезапуска зависимых сервисов. Зависимость от человеческого фактора при переключении на резервные системы.
Автоматизировать восстановление с помощью оркестрации (Kubernetes, Ansible). Внедрить механизмы самовосстановления (self-healing systems).
Сбой одного компонента может вызвать отказ других, связанных с ним, компонентов.
Перегрузка базы данных приводит к сбою приложений, зависящих от неё. Потеря сетевого соединения между узлами вызывает массовую недоступность сервисов.
Внедрение изоляции между компонентами (например, с использованием Circuit Breaker). Использование очередей сообщений для асинхронной обработки.
Во время восстановления разные узлы системы могут использовать несовместимые версии программного обеспечения или данных.
Некорректная миграция базы данных. Разные версии микросервисов вызывают ошибки при взаимодействии.
Использовать механизм версионирования API и схем данных. Внедрять "blue-green" или "canary" деплойменты.
Операторы могут допустить ошибки при восстановлении системы, особенно в стрессовых условиях.
Неправильный ввод команд, ведущий к удалению данных. Неполное восстановление конфигурации после сбоя. Разрабатывать чёткую документацию и сценарии действий при сбоях. Использовать инфраструктуру как код (IaC) для автоматизации настройки среды.
Система может быть недоступна слишком долго, что приводит к значительным убыткам.
Затянувшийся процесс восстановления базы данных. Задержки из-за необходимости ручного вмешательства. Оптимизировать процессы резервного копирования и восстановления. Использовать резервные копии с минимальными задержками (например, репликация данных в режиме реального времени).
После восстановления состояние данных может быть неконсистентным между компонентами.
Пользователь видит устаревшие данные после переключения на резервный сервер. Несогласованные транзакции в распределённых базах данных. Использовать механизмы консенсуса (например, Raft, Paxos). Внедрить стратегии "eventual consistency" для распределённых систем.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Программы должны быть простыми, минималистичными и легко читаемыми.
2. Усложнения должны быть введены только в случае необходимости.
3. Упрощение структуры и логики снижает вероятность ошибок и упрощает сопровождение.
Этот принцип помогает создавать более надёжный и поддерживаемый код.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Индексы являются ключевым механизмом для улучшения производительности запросов в базах данных. Они позволяют значительно ускорить операции поиска и выборки данных, снижая необходимость полного сканирования таблицы. Вот как работают индексы и для чего они нужны.
Индексы организованы в специализированные структуры данных, такие как B-деревья, B+-деревья или хеш-таблицы. Эти структуры оптимизированы для быстрого поиска, вставки и удаления данных.
Когда создается индекс на один или несколько столбцов таблицы, база данных строит структуру данных, которая хранит значения этих столбцов в отсортированном виде, вместе с указателями на соответствующие строки таблицы. Это позволяет базе данных быстро находить нужные строки по значению индекса.
При выполнении запроса, который включает условия поиска по индексируемым столбцам, база данных может использовать индекс для быстрого нахождения строк. Вместо полного сканирования таблицы, база данных проходит по дереву индекса и быстро находит нужные строки.
Когда данные в таблице обновляются (добавляются новые строки, изменяются или удаляются существующие), индексы также должны обновляться. Это может привести к дополнительным затратам на время вставки и обновления данных, так как требуется поддерживать актуальность структуры индекса.
Правильный выбор индексов важен для оптимальной производительности. Индексы следует создавать на столбцах, которые часто используются в условиях поиска, соединениях и сортировках. Избыточные индексы могут увеличивать объем хранения и снижать производительность операций вставки и обновления.
Это уникальный индекс, который не допускает дубликатов и обычно используется для идентификации строк в таблице.
Обеспечивает уникальность значений в индексируемом столбце, но допускает одно или несколько NULL значений.
Используется для ускорения поиска и может содержать дублирующиеся значения.
Индекс, созданный на нескольких столбцах. Полезен, когда запросы часто включают условия на несколько столбцов одновременно.
Определяет физический порядок хранения строк в таблице. У таблицы может быть только один кластерный индекс, так как строки могут быть отсортированы только одним способом.
Запросы типа
SELECT * FROM users WHERE age > 30 значительно ускоряются, если столбец age индексирован.Запросы типа
SELECT * FROM users ORDER BY name будут быстрее, если столбец name индексирован.Запросы, которые соединяют несколько таблиц по индексируемым столбцам, выполняются быстрее, так как индексы облегчают поиск соответствующих строк.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Например: O(1) (константное время), O(n) (линейное), O(log n) (логарифмическое).
Она помогает оценить эффективность алгоритмов и выбрать оптимальный для задачи.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Это протокол для обмена структурированными сообщениями в распределённых вычислительных средах. Он основан на XML и используется для передачи данных между различными приложениями через сеть, часто по протоколу HTTP или SMTP.
SOAP сообщения формируются в формате XML, что обеспечивает независимость от платформы и языка программирования.
SOAP сообщение состоит из обязательных и необязательных элементов:
Envelope: Определяет начало и конец сообщения.
Header: Опциональный элемент, содержащий метаинформацию о сообщении.
Body: Основное содержимое сообщения, включающее данные и команды.
Fault: Опциональный элемент для обработки ошибок.
Чаще всего используется с HTTP/HTTPS, но может работать и с другими протоколами, такими как SMTP.
SOAP легко расширяется, позволяя добавлять дополнительные функциональные возможности через заголовки и другие элементы.
SOAP может быть использован в любой среде и на любом языке программирования, что обеспечивает высокую совместимость между различными системами.
<soapenv:Envelope xmlns:soapenv="https://schemas.xmlsoap.org/soap/envelope/" xmlns:example="https://example.com/">
<soapenv:Header/>
<soapenv:Body>
<example:getExampleRequest>
<example:parameter1>Value1</example:parameter1>
<example:parameter2>Value2</example:parameter2>
</example:getExampleRequest>
</soapenv:Body>
</soapenv:Envelope>
SOAP может взаимодействовать с любыми системами, поддерживающими XML и HTTP/SMTP.
SOAP основывается на строгих стандартах, что обеспечивает надежность и предсказуемость взаимодействия.
Легко адаптируется для специфических потребностей через расширения и заголовки.
Использует элемент Fault для детальной обработки и передачи ошибок.
Подходит для сложных операций и распределённых транзакций.
SOAP-сообщения могут быть сложными и громоздкими из-за использования XML.
Использование XML увеличивает объем передаваемых данных, что может снизить производительность.
Требует дополнительных ресурсов для обработки и передачи XML-сообщений.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
2. Использование памяти: Индексы занимают дополнительное пространство на диске и в оперативной памяти.
3. Сложность управления: Неоптимальное использование индексов может привести к ухудшению производительности запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Это последовательность одной или нескольких операций над базой данных, которая выполняется как единое целое. Транзакции обеспечивают, что все операции в рамках транзакции либо успешно выполняются, либо полностью отменяются, что гарантирует целостность данных.
Транзакция должна быть либо выполнена полностью, либо не выполнена вовсе. Если какая-то часть транзакции не удается, вся транзакция откатывается (roll back) к исходному состоянию.
Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после завершения транзакции все правила целостности данных должны быть соблюдены.
Результаты выполнения транзакции не должны быть видны другим параллельно выполняющимся транзакциям до тех пор, пока данная транзакция не завершится. Это предотвращает влияние одной транзакции на другую.
После успешного завершения транзакции (коммита) ее результаты должны быть зафиксированы в базе данных и сохранены, даже если произойдет сбой системы.
На SQL
BEGIN TRANSACTION;
-- Пример операций внутри транзакции
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Если все операции прошли успешно
COMMIT;
-- Если произошла ошибка
ROLLBACK;
Пример на Java (использование JDBC)
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");
connection.setAutoCommit(false); // Начало транзакции
// Пример операций внутри транзакции
PreparedStatement pstmt1 = connection.prepareStatement("UPDATE accounts SET balance = balance - 100 WHERE account_id = ?");
pstmt1.setInt(1, 1);
pstmt1.executeUpdate();
PreparedStatement pstmt2 = connection.prepareStatement("UPDATE accounts SET balance = balance + 100 WHERE account_id = ?");
pstmt2.setInt(1, 2);
pstmt2.executeUpdate();
connection.commit(); // Коммит транзакции
} catch (SQLException e) {
if (connection != null) {
try {
connection.rollback(); // Откат транзакции при ошибке
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯1
1. Каждый шард хранит часть данных, и они могут находиться на разных серверах.
2. Это повышает масштабируемость и производительность базы данных.
3. Сложность шардирования заключается в управлении распределением данных и маршрутизации запросов к нужным шардам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2