Sergei Batsura

Ловушка eventual consistency или uncommitted transaction problem?

Интересный эффект я наблюдал во время интеграции с одной из внешних систем. Мой сервис должен был выполнить два последовательных запроса: сначала — на создание сущности в сторонней АС, затем — на изменение её статуса. К моему удивлению, несмотря на то, что первый запрос завершался успешно (получен положительный ответ), второй запрос, отправляемый сразу
1 min read

Как сопоставить комментарии с полями в proto?

Помогает версия Sonnet 4.5: * 4 - message_type * 2 - field в message * 5 - enum_type * 8 - service try (InputStream is = ...) { DescriptorProtos.FileDescriptorSet fileDescriptorSet = DescriptorProtos.FileDescriptorSet.parseFrom(is); for (DescriptorProtos.FileDescriptorProto fileProto : fileDescriptorSet.getFileList()) { // Получаем SourceCodeInfo с комментариями DescriptorProtos.SourceCodeInfo sourceCodeInfo = fileProto.getSourceCodeInfo(); // Создаем карту: path -&
1 min read

Интересные вопросы от бота на скрининге

Чем отличаются «потенциальный» (candidate) и «альтернативный» (alternate) ключи. 1. Потенциальный – используеется в тестовых целях, альтернативный – резервный ключ 2. Потенциальный – может стать первичным ключем, альтернативный – вторичный уникальный ключ 3. Потенциальный – ключ который рассматривают в качестве вторичного, альтернативный – устаревший ключ 4. Потенциальный – используется для идентификации данных, альтернативный – используемый для шифрования Имеется функция

Как в таблице postresql эффективно инкрементировать значение поля одной записи из нескольких потоков под большой нагрузкой

Отвечает claude: Для эффективного инкрементирования значения поля одной записи из нескольких потоков с большой нагрузкой в PostgreSQL, можно использовать следующие подходы: 1. Использование UPDATE с условием WHERE и RETURNING: UPDATE table_name SET column_name = column_name + 1 WHERE id = $1 RETURNING column_name; Этот подход гарантирует атомарность операции инкремента

Проектирование модели данных в Cassandra

В реляционных БД проектирование начинается с бизнес-сущностей. Сначала создаются таблицы, каждая из которых описывает сущность, при этом на этом этапе мы не задумываемся о SQL-запросах. Это возможно потому, что мы знаем: всегда можем начать запрос из любой таблицы, использовать JOIN или вложенные SELECT, чтобы получить нужные данные. В Cassandra используется

Data Warehouse vs Data Lake

DWH это архитектура управления данными основана главным образом на сценариях извлечения-преобразования-загрузки (Extract-Transform-Load, ETL). Загрузка очищенных и обработанных данных в специализированную базу данных, разработанную именно для целей анализа. В Data Lake сохраняют данные в неструктурированном виде (в формате источника) в так называемом озере (Lake).

Какую SAGA выбрать?

Используем хореографию в случае небольших рабочих процессов. Два–три сервиса — предел для хореографии. При дальнейшем увеличении числа сервисов, участвующих в транзакции, сложность обработки ошибок и понимания всего потока становится запредельной и используем оркестрацию.

Закон Конвея

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

Неочевидные нюансы с отладкой

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

Бесплатный программист от Atlassian

Вчера попробовал acli rovodev https://developer.atlassian.com/cloud/acli/guides/install-linux/. Плюсы: 1. Бесплатный пока бета 2. Суточный лимит 20 миллионов токенов и много запросов 3. Прилежный 4. За час он создал реактивный гейтвей https://github.com/batsura-sa/reactive-gateway-project Минусы: 1. Требует VPN

Прикладные блокировки в PostgreSQL

Мне известны следующие варианты: 1. Advisory lock - придумываем константу и используем pg_advisory_lock и pg_try_advisory_lock 2. Создаем таблицу блокировок и в этой таблице создаем запись. Если запись создана, то блокировка успешна. Для удаления блокировки удаляем запись. 3. Можно переиспользовать shedlock и соорудить что-то типа https:

Шардирование в postgreSQL

Иногда данных бывает много и приходится задумываться о распределении их между экземплярами БД. Рассматриваю варианты: 1. Citus https://github.com/citusdata/citus 2. Apache shardingsphere https://github.com/apache/shardingsphere 3. Pg-sharding https://github.com/pg-sharding/spqr 4. Yuogabytedb https://github.com/yugabyte/yugabyte-db Какие еще есть варианты? Интересные алгоритмы

Помним про оверхед, при использовании JSON вместо PROTOBUF

В 2024 году Андрей Комягин в докладе "Глубокое погружение в архитектуру Kafka" привел такие цифры для 100 атрибутов в сообщении: 1. PROTOBUF в среднем компактнее в 2.5 раза 2. Скорость сериализация PROTOBUF выше в 2 раза 3. Скорость десериализации PROTOBUF выше в 6 раз! 4. Производительность сериализации/

Можно ли использовать ThreadLocal контейнер с VirtualThreads? Да, можно!

Для ответа на этот вопрос решил написать тесты https://github.com/batsura-sa/java-samples/tree/main/thread-local-in-threads/src/test/java/org/example Кратко резюме такое в Java 21 ThreadLocal с VirtualThread работают, что в общем-то и указано в https://openjdk.org/jeps/444 , однако, поскольку виртуальных потоков может быть очень много,

Как массово поменять местами аргументы методов в Idea

Заметил, что в одном из сервисов перепутаны местами аргументы, например, в коде прописано Assertions.assertEquals(order.getAwaitingActivation(), true), хотя по сигнатуре метода должно быть наоборот assertEquals(Object expected, Object actual), то есть должно быть Assertions.assertEquals(true, order.getAwaitingActivation()). Так как мест, где нужно сделать замену больше 100, решил сделать
1 min read