Все потоки
Поиск
Написать публикацию
Обновить

Бэкенд

Сначала показывать
Порог рейтинга
Уровень сложности

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

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров1.3K

О паттернах отказоустойчивой архитектуры написано уже немало. Но когда дело доходит до реальных кейсов, особенно в специфических отраслях вроде лотерейной — информации почти нет. А ведь здесь, как и в любой высоконагруженной системе, отказоустойчивость — не просто галочка в ТЗ, а вопрос пользовательского доверия и бизнес-репутации. 

В этой статье расскажем, как мы в «Столото» подошли к проектированию Lottery Payment System. Это полностью вымышленный сервис для выплат выигрышей, построенный на опыте реальных вызовов и ограничений для того, чтобы на его примере описать, как работают ключевые паттерны отказоустойчивой архитектуры: Retry, Idempotency Key, Deadlines, Rate Limit и Circuit Breaker. Также покажем, как они применяются в контексте распределённой системы, которая должна стабильно работать, даже когда вокруг всё пошло не по плану. 

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

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

Читать далее

Как работает база данных Firebird, часть 4

Уровень сложностиСложный
Время на прочтение18 мин
Количество просмотров683

В первой части мы разбирались, как Firebird забирает строку таблицы с диска. Во второй и третьей частях мы разбирались, что происходит с прочитанной строкой в процессе выполнения SELECT-запроса. Но остался неотвеченным такой вопрос: а как указать на строку таблицы, которую надо прочитать? Этим вопросом мы и займёмся.

Читать далее

Fast Lane / Slow Lane: разделение трафика через две очереди Kafka

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров801

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

Сегодня мы рассмотрим Fast Lane / Slow Lane для Kafka: как одним росчерком кода защитить SLA‑критичный поток от толстых сообщений, не перекраивая пол‑стека и не устраивая зоопарк из очередей.

Читать далее

Java и ООП: путешествие туда и обратно

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров5.6K

Недавно на подкасте Spring АйО мы обсуждали новые свитчи в Джаве — с паттерн‑матчингом и деструктуризацией. Я тогда ещё выразил мнение, что всё это неправославно, по‑зумерски и отход от принципов ООП.

Не от инкапсуляции, полиморфизма и наследования, а вообще от подхода. Новые свитчи будут провоцировать разработчиков писать код по‑новому, а не так, как завещали нам наши далёкие предки. С нарушением традиций, норм и устоев. Как учит Кейси Муратори, если вы понимаете о ком я.

Но какие они вообще были эти устои? Каким было ООП, когда всё только началось и чем это отличается от свитчей, до которых мы в конце концов докатились?

Читать далее

Битва, где все проигрывают, или Как Kafka Compact Topics остановил войну данных

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров3.2K

В статье рассказывается о типичной проблеме синхронизации данных между микросервисами через связку «снапшот + инкременты» и предлагается решение на основе Kafka Compact Topics. Это своего рода «волшебная тетрадь», которая автоматически оставляет только последние версии записей, избавляя от головной боли с рассинхронизацией.

Разбираются практические кейсы применения, подводные камни, тонкости настройки и интеграция с Debezium для автоматической выгрузки из PostgreSQL.

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

Читать далее

Самый загадочный баг в моей работе

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров16K

Предыстория

Моя команда занимается разработкой медицинского ПО: приложения для передачи направлений пациентов в системе здравоохранения Австралии.

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

Система электронных направлений удобна для всех. Когда врач создаёт новое направление, мы автоматически извлекаем информацию из PMS (patient management software, системы управления пациентами, которой владеет наша компания) с данными пациента, этнической принадлежностью, индексом массы тела, принимаемыми лекарствами, медицинской историей и всем остальным, что необходимо для направления. В бланке направления есть валидируемая «форма специализации» с полями, относящимися к конкретной услуге, для которой выписывается направление.

Благодаря этому в направлении содержится вся необходимая информация. И, разумеется, в форме также есть большое текстовое поле для свободного текста (referral letter), в котором терапевт может объяснить, почему он решил выписать пациенту направление.

При отправке направления данные передаются в цифровом виде. Они преобразуются в один из нескольких форматов в зависимости от получателя. Некоторые получатели используют для приёма направлений наш продукт Referral Manager; в этом случае нам не нужно ничего преобразовывать, они просто получают доступ в веб-интерфейсе к тем данным, которые хранятся в базе данных. Однако обычно данные преобразуются в HL7 (старый текстовый формат файлов медицинской информации), CDA (XML-документ с отдельной таблицей стилей) или просто в PDF с человекочитаемой информацией. Благодаря этому данные совместимы со множеством различных электронных систем других компаний.

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

Читать далее

flowOn vs withContext: правильное переключение потоков в Flow в Kotlin

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров503

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

Сегодня мы рассмотрим, как правильно переключать контексты в Kotlin Flow и почему flowOn — это не то же самое, что withContext.

Читать далее

Explyt Spring Debugger

Время на прочтение5 мин
Количество просмотров1.3K

Всем привет! На связи команда Explyt Spring. Недавно была статья от JetBrains, а также ее перевод на Habr, где они рассказывали о новом плагине Spring Debugger и о том как используют нативный код Spring для лучшего понимания контекста приложения. С помощью non‑suspending breakpoints JetBrains «вклиниваются» в жизненный цикл Spring и собирают все необходимые для плагина данные. Но ведь это почти тоже что и мы пытались делать в нашем плагине с помощью javaagent, о котором писали статьи. И нам даже показалось, что они вдохновлялись нашими статьями, первая из которых увидела свет в октябре 2024 года (возможно только показалось).

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

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

Читать далее

GIMP Script-Fu ООП. Статические поля класса

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров249

Библиотека функций к Script-fu

Итак, мы разработали практически полнофункциональную ООП систему для языка tinyscheme, так же работающую в script-fu GIMP. Но гложет меня одна мысль, реализовать поля общие для всех объектов класса. В разных языках они называются по разному, но смысл один, некие значения которые общие для всех объектов одного класса. В принципе как я уже указывал, такие поля реализуются как глобальные переменные, но реализация их в виде подсистемы ООП облегчит управление этими полями и использование их в обобщённых функциях. Тут есть тонкий момент: обобщённая функция может работать не только с объявленными типами параметров, но и с их наследниками. Если мы используем общие поля для класса в виде какой то глобальной переменной, то с этими полями могут работать не только объекты объявленных в параметрах классов, но и их потомки. И по идее методы обобщённой функции должны работать с типами соответствующим типам входных аргументов, а не просто типам объявленных параметров. А работа с глобальной переменной не будет различать одних потомков объявленных параметров метода от других. Во всяком случае такая персонализация работы будет затруднена и должна будет выполняться в ручную.

Читать далее

AI в IDE: Правда ли Junie экономит время? Цифры, боль, восторги за 2.5 месяца использования

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.8K

Привет! Меня зовут Максим, я бэкенд-разработчик и тимлид в Clevertec, и сегодня хочу поделиться опытом пилота AI-инструментов в команде финтех-проекта. Спойлер: обошлось без магии, но кое-что действительно работает и экономит время.

Читать далее

HTMX, AlpineJS, SSR v1/2/3 и SPA. Что к чему

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров2.9K

HTMX и AlpineJS это две JS библиотеки, которые расширяют HTML специальными аттрибутами и позволяют писать фронтенд без SPA фреймворков.

Это альтернативы React/Vue/Angular и иже с ними. Их появление вызвано усталостью от сложной JS экосистемы и тоской по временам, когда задачи решались с помощью PHP и jQuery.

Я всю жизнь писал JSON API и SPA интерфейсы и моему мозгу трудно было переварить, зачем нужны эти библиотеки и как с ними работать. Поэтому я написал эту статью.

Читать далее

Все почти готово — осталось лишь чуть-чуть доделать

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров8.4K

Эпохе LLM, обзоров от Gartner и вайбкодинга для MVP проектов от кодинг агентов посвящается. Вспомнил несколько случаев из своего опыта.

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

На следующий день я вышел на новое рабочее место. Первые полдня получал доступы к Bamboo, Confluence, Jira и системе контроля версий, где лежал код проекта. Каково же было мое удивление, когда я наконец увидел исходники проекта, который до меня разрабатывали почти год. Мне до сдачи проекта заказчику и найма команды оставалось меньше месяца…

Читать далее

Маршрутизация в одноранговых сетях

Уровень сложностиСложный
Время на прочтение21 мин
Количество просмотров4.5K

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

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

Читать далее

Ближайшие события

Консолидация памяти — или как избежать альцгеймера у LLM

Время на прочтение7 мин
Количество просмотров4K

Просыпаюсь утром, открываю свой чат с GPT, начинаю увлеченно обсуждать архитектуру нового проекта. Через час диалог превращается в философский трактат о смысле жизни, еще через час - в рецепт борща. И вот, когда я пытаюсь вернуться к архитектуре, модель смотрит на меня как на незнакомца: "А что за проект? Борщ, говорите?"

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

В итоге, пройдя 10 кругов ада, так и решил наконец сесть и разобраться, а почему они начинают забывать все важные детали, а также можно ли как-то удешевить таки API в подобных задачах?

Читать далее

Нужно ли в PHP перед вызовом функций ставить обратный слэш?

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров8.2K

Несколько лет назад я прочитал статью «How to dump and inspect PHP OPCodes» в которой наконец увидел, что опкоды в PHP действительно существуют. И кроме того, мы, разработчики, которые пишем на PHP на эти опкоды можем влиять, тем самым оптимизируя производительность нашего кода. В статье так же рассказывалось о том, как применение бэкслэшей может ускорить выполнение программ. Я был под впечатлением...

Опкодами (см. Код операции) называется некий промежуточный код, который всё ещё понятен человеку и который выполняется некой исполняющей средой. В случае PHP этой средой является Zend Virtual Machine (она же Zend Engine).

Технология опкодов и виртуальной машины не является чем то уникальным для PHP. Подобный подход использует Java, где опкоды компилируются в их бинарное представление и выполняются Java VM. Исходные коды Java-программ хранятся в файлах с расширением .class (потому что в Java искодники хранятся только в виде классов), а скомпилированные опкоды в файлах с расширением .java. В PHP же исходные коды программ хранятся в файлах с расширением .php. А вот опкоды не хранятся нигде, что вызвало к жизни многочисленные расширения, самым популярным из которых на сегодняшний день является OPcache.

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

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

Читать далее

C#, Логи которые пишут себя сами, 2

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров1.3K

Всем привет.

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

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

Ниже я подробно опишу применение этого способа автоматического логирования.

Читать далее

Как я заменил кучу флагов двумя словарями в Python

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров19K

Я создаю приложение с GUI для сбора и обработки данных с микроконтроллера на Python с помощью PyQt. И вот я наконец-то доделал часть функционала, предназначенного для взаимодействия компьютера с платой STM32, теперь необходимо было сделать интерфейс для обработки данных, в котором легко можно было бы настраивать параметры выполнения программы. Я начал думать, как не вносить в программу кучу флагов с соответствующими if-else конструкциями, и вот, что я придумал.

Читать далее

Финансовый учет: адаптация приложения для коробочного «Битрикс24»

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров456

Некоторое время назад нами был разработано и опубликовано приложение Финансовый учет для облачного «Битрикс24». В этом материале мы хотим поделиться как мы занимались портированием его на коробку «Битрикса», почему так решили делать и с какими сложностями столкнулись.

Читать далее

Как разработать CSI-драйвер с поддержкой Swordfish API и запустить его без железа

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров555

Контейнерные приложения все чаще требуют постоянного хранилища, будь то базы данных, кэш или файловые серверы. Но Kubernetes по умолчанию не «умеет» работать напрямую с системами хранения данных, в этом ему помогает CSI (Container Storage Interface). А если хочется управлять хранилищем через единый стандарт и без привязки к конкретному вендору, на помощь приходит спецификация Swordfish.

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

Читать далее

Как спрятать сontrol plane Kubernetes от любопытных глаз

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров4.5K

Control plane Kubernetes — как сейф с главными ключами. Он управляет кластером, хранит sensitive-информацию и зачастую представляет собой лакомую цель для злоумышленников. 

В этой статье — разбор того, как спрятать control plane в сервисе Managed Kubernetes, предоставляемом в облаке: зачем это нужно, какие варианты существуют и с какими проблемами мы столкнулись на практике. Рассмотрим несколько open source решений, которые протестировали у себя в поисках надёжного способа изолировать control plane-ноды от пользователя и сделать их недоступными для какого-либо внешнего взаимодействия.

Меня зовут Каиржан, я DevOps/Software-инженер в команде разработки
MWS Cloud Platform, пишу на Go под Kubernetes и ClusterAPI. Наша команда разрабатывает сервис Managed Kubernetes для публичного облака — от инфраструктуры до собственных провайдеров для ClusterAPI. Поэтому вопрос безопасности control plane (CP) для нас стоит особенно остро.  

Читать далее