Search
Write a publication
Pull to refresh
19
0
Vladimir @mvs

Creator, founder, developer

Send message

Многоуровневая группировка в SQL: Grouping sets

Level of difficultyMedium
Reading time3 min
Views18K

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

Читать далее

Вы кто такие, я вас не знаю, или Как мы делаем JWT-аутентификацию

Level of difficultyMedium
Reading time11 min
Views88K

Привет! Меня зовут Данил, я backend-разработчик в Doubletapp. Почти во всех наших проектах есть пользователи, которые могут войти в систему. А значит, нам почти всегда нужна авторизация. Мы используем авторизацию, построенную на JSON Web Token. Она отлично сочетает в себе простоту реализации и безопасность для приложений.

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

Путеводитель:

Что такое JSON Web Token?
Использование и реализация
Простая реализация JWT
Access и refresh tokens
Как отозвать токены
Доступ с нескольких устройств
Удаление старых данных
Резюмируем

Читать далее

Загрузка ассоциаций по запросу в Symfony

Reading time5 min
Views4.5K

Всех приветствую!

Стандартно Doctrine загружает сущности отложено (Lazy load). Это означает, что данные взаимосвязей фактически не загружаются до тех пор, пока не будет явный вызов свойства. Механизмы Doctrine позволяют изменить поведение и загружать связи во время запроса к родительской сущности (fetch:'EAGER'), однако это не совсем подходит для динамической загрузки ассоциаций по запросу.

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

Читать далее

Неортодоксальный Eloquent. Часть 2

Level of difficultyMedium
Reading time9 min
Views3.6K

Eloquent - это мощный и умный инструмент, нравящийся многим своими возможностями. Он позволяет с лёгкостью выполнять операции с базами данных, сохраняя при этом простоту использования. Реализуя паттерн Active Record (AR), описанный Фаулером в книге "PoEAA", является одним из лучших реализаций на сегодняшний день.

В этой статье я хотел бы рассказать о нескольких советах и рекомендациях, о которых узнал экспериментальным путём. Например, Вы когда-нибудь задумывались о том, чтобы тем или иным образом разделить жадные загрузки? Нет? Тогда, я уверен, Вы узнаете как минимум что-то новое, так что обязательно дочитайте до конца!

Если Вы ещё не читали первую часть, самое время это сделать.

Читать далее

Как мы выдержали x20 рост нагрузки на сервис Авито Автозагрузка

Reading time16 min
Views9.9K

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

Читать далее

Спасти за 60 дней: новая архитектура для ресурса с большой нагрузкой

Level of difficultyMedium
Reading time6 min
Views6.1K

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

Нетривиальность задачи оказалось в том, что кейсов инсталляции сервисов Moodle на ресурсы с нагрузкой >10 тыс. человек нет ни у Яши, ни у других сервисов, к которым мы привыкли. Из коробки ничего не работало, документации тоже не нашлось. Предыдущий исполнитель с задачей не справился и оставил сервис в печальном состоянии.

Срок выполнения задачи  – 2 месяца, что добавило остроты проекту перед Новым годом…

Успели к новому году?

Почему тип поля enum на уровне базы — зло

Level of difficultyEasy
Reading time4 min
Views41K

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

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

Но это в теории. А что на практике? Рассмотрим под катом.

Читать далее

Продажи ленточных накопителей растут, хотя продажи HDD падают. Причины и перспективы

Reading time4 min
Views6.2K

В I квартале 2023 года продажи ленточных накопителей стали неожиданно расти. Неожиданно потому, что объёмы отгрузок всех прочих видов накопителей постепенно падают, особенно жёстких дисков. Показатель для последних упал сразу на 30%, и тенденция к снижению сохраняется. Что касается ленточных накопителей, то рост вроде бы и небольшой, всего 5%, но на самом деле это весьма значительный результат. Почему сложилась такая ситуация?

Читать далее

Компании МойОфис исполнилось 10 лет. Ретроспектива большого пути

Reading time5 min
Views3.7K

Сегодня, 25 августа, МойОфис отмечает 10 лет со дня основания. За эти годы мы прошли большой путь от создания редакторов документов до полноценной экосистемы офисного ПО. В настоящий момент платформа МойОфис включает в себя 15 продуктов для общения и совместной работы с документами. Решения востребованы со стороны как коммерческих заказчиков (реализовано более 1 млн лицензий), так и частных пользователей (приложения установили около 27 млн раз).

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

Читать далее

Все что вам нужно знать о таймаутах

Level of difficultyMedium
Reading time8 min
Views33K

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

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

В конце статьи есть небольшая шпаргалка и куча полезных ссылок. Приятного чтения.

Читать далее

Как мы планировали повысить версию PHP за месяц, а потратили на это год

Level of difficultyEasy
Reading time14 min
Views27K

Как и множество больших сервисов, Яндекс Еда основана на микросервисной архитектуре. В общей сложности у нас чуть больше 200 микросервисов. Но есть один сервис, который совсем не микро – легаси-монолит.

Он написан на PHP 7.2 разработчиками разного уровня и в разное время. Мы подумали, что так больше нельзя, и решили навести порядок. В ходе разбирательств выяснилось, что версия языка, на котором всё написано, устарела и уже не поддерживается, что ведёт к рискам безопасности. Делать нечего — мы приняли решение обновиться до 8-й версии.

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

Читать далее

Сгенерировать web интерфейс из БД или объектной модели не стало проще даже 10 лет спустя

Level of difficultyEasy
Reading time4 min
Views9.1K

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

Однако, реальность оказалась несколько иной. На бэкэнде, базах данных и в big data ситуация гораздо лучше с возможностями бесплатных и открытых проектов, когда не надо покупать лицензии или платить за дополнительные компоненты, можно без СМС и платных подписок запустить хоть Ingenuity на Марс.

Читать далее

EasyAdmin и Mercure: реальный юзкейс

Reading time8 min
Views4.2K

EasyAdmin — один из самых популярных генераторов административных панелей, доступных для Symfony-приложений. Поскольку для аутентификации пользователей он использует стандартный компонент безопасности Symfony, он позволяет входить в систему и изменять данные множеству пользователей одновременно. Но есть одна проблема…

Читать далее

Виды баз данных. Большой обзор типов СУБД

Reading time21 min
Views154K

Часто, в обзорах видов баз данных упоминают реляционные и “другие”, “NoSQL” и т.д., либо приводят самые основные типы СУБД (базы данных), забывая о редких. В данной статье я постараюсь описать максимально полно виды баз данных и привести примеры конкретных реализаций. Разумеется, статья не претендует на всеохватность и классифицировать базы данных можно по разному, в том числе по типам оптимальной нагрузки и т.д., но надеюсь, она даст базовое представление о видах СУБД и принципах их работы.

В статье мы рассмотрим следующие типы баз данных:

Читать далее

Бизнес-ключ и суррогатный ключ нужны оба

Level of difficultyMedium
Reading time4 min
Views6K

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

Читать далее

Новые рельсы Kubernetes для интеграционных сервисов

Level of difficultyMedium
Reading time5 min
Views4.3K

Привет, Хабр!

Меня зовут Павел, и я руковожу группой автоматизации и интеграции в банке РНКБ. Сегодня я хочу рассказать о том, как мы переводили множество интеграционных сервисов на новые рельсы. В нашем банке большинство сервисов самописные и разрабатываются штатными разработчиками, в связи с чем возникла необходимость адаптировать работу существующих сервисов для использования современных подходов разработки. В качестве пилота было выбрано направление «Интеграционные сервисы» (можно просто ИС). ИС – это не что иное, как приложения, обрабатывающие запросы к автоматизированной банковской системе (сокращенно – АБС).

Читать далее

Как мы поднимаем dev-стэнд(ы) и гоняем полноценные тесты api на каждый коммит

Level of difficultyEasy
Reading time8 min
Views6.3K

Мы в API отказались от большого количества unit-тестов в пользу большого количества интеграционных/системных, чтобы тестировать меньшим количеством кода большее количество функций, а также наблюдать за взаимодействием разных частей системы.

На самом деле мы просто решили писать тесты не на отдельные классы/методы, а на интерфейс api, которым пользуются клиенты - на сервисы этого API. Тестируя их, мы убиваем двух зайцев: проверяем логику работы сервисов api + форматирование результата.

А такое тестирование сопряжено с несколькими проблемами.

Читать далее

Как написанный на Symfony Kbin покоряет Threadiverse

Reading time7 min
Views1.8K

Из-за недавнего скандала с Reddit и его недальновидным CEO опенсорсные альтернативы сейчас переживают настоящий бум. И kbin — это как раз такая Fediverse-платформа, созданная с применением Symfony, API Platform и Schema Generator 3 Эрнестом Вишневски (Ernest Wiśniewski). Это именно то, на что вам нужно обратить свое внимание в первую очередь, если вы больше не хотите поддерживать самодуров, управляющих Reddit.

Читать далее

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

Level of difficultyMedium
Reading time11 min
Views16K

1. Введенние.
2. Zval.
3. Циклические ссылки.
4. Сборщик мусора.
5. Алгоритм работы сборщика мусора.
6. Смотрим глазами.
7. Слабые ссылки.
8. Бонус-трэк: WeakMap.
9. Заключение.

Читать далее

Решение проблемы N+1 запроса с помощью группировки вызовов

Level of difficultyEasy
Reading time8 min
Views4.2K

Проблема N+1 запросов

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

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

Читать далее

Information

Rating
Does not participate
Date of birth
Registered
Activity