Как стать автором
Обновить
0
@RuRa22read⁠-⁠only

Пользователь

Отправить сообщение

MVCC-1. Изоляция

Время на прочтение25 мин
Количество просмотров142K
Привет, Хабр! Этой статьей я начинаю серию циклов (или цикл серий? в общем, задумка грандиозная) о внутреннем устройстве PostgreSQL.

Материал будет основан на учебных курсах по администрированию, которые делаем мы с Павлом pluzanov. Смотреть видео не все любят (я точно не люблю), а читать слайды, пусть даже с комментариями, — совсем «не то».

Конечно, статьи не будут повторять содержание курсов один в один. Я буду говорить только о том, как все устроено, опуская собственно администрирование, зато постараюсь делать это более подробно и обстоятельно. И я верю в то, что такие знания полезны прикладному разработчику не меньше, чем администратору.

Ориентироваться я буду на тех, кто уже имеет определенный опыт использования PostgreSQL и хотя бы в общих чертах представляет себе, что к чему. Для совсем новичков текст будет тяжеловат. Например, я ни слова не скажу о том, как установить PostgreSQL и запустить psql.

Вещи, о которых пойдет речь, не сильно меняются от версии к версии, но использовать я буду текущий, 11-й «ванильный» PostgreSQL.

Первый цикл посвящен вопросам, связанным с изоляцией и многоверсионностью, и план его таков:

  1. Изоляция, как ее понимают стандарт и PostgreSQL (эта статья);
  2. Слои, файлы, страницы — что творится на физическом уровне;
  3. Версии строк, виртуальные и вложенные транзакции;
  4. Снимки данных и видимость версий строк, горизонт событий;
  5. Внутристраничная очистка и HOT-обновления;
  6. Обычная очистка (vacuum);
  7. Автоматическая очистка (autovacuum);
  8. Переполнение счетчика транзакций и заморозка.

Ну, поехали.
Читать дальше →
Всего голосов 34: ↑34 и ↓0+34
Комментарии37

Record structs в C#: эффективные и безопасные типы данных

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

C# 9 представил новую функцию, называемую Запись (record), которая обеспечивает неизменяемость и семантику сравнения на основе значений для классов. Записи упрощают создание типов данных и обеспечивают лучшую безопасность при работе с ними. Однако до C# 10 они были доступны только для классов, теперь же у нас есть record struct, позволяющие применить те же преимущества Записей и к структурам.

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

Читать далее
Всего голосов 10: ↑8 и ↓2+9
Комментарии10

System.Threading.Channels — высокопроизводительный производитель-потребитель и асинхронность без аллокаций и стэк дайва

Время на прочтение18 мин
Количество просмотров38K
И снова здравствуй. Какое-то время назад я писал о другом малоизвестном инструменте для любителей высокой производительности — System.IO.Pipelines. По своей сути, рассматриваемый System.Threading.Channels (в дальнейшем «каналы») построен по похожим принципам, что и Пайплайны, решает ту же задачу — Производитель-Потребитель. Однако имеет в разы более простое апи, которое изящно вольется в любого рода enterprise-код. При этом использует асинхронность без аллокаций и без stack-dive даже в асинхронном случае! (Не всегда, но часто).


Читать дальше →
Всего голосов 25: ↑25 и ↓0+25
Комментарии7

Потоковый захват изменений из PostgreSQL/MySQL с помощью Apache Flink

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

Привет! Сегодня мы поговорим и попробуем на практике реализацию паттерна Change Data Capture (далее – CDC) в Apache Flink. 

Статья разделена на несколько частей: в первой мы рассмотрим теоретические основы Change Data Capture, варианты реализации и сферы применения. Во второй – обратимся к особенностям CDC-коннекторов экосистемы Apache Flink, а также выделим самые интересные фичи (а заодно и немного расскажем об Apache Flink для тех, кто раньше с ним не сталкивался). В третьей части – перейдем к практике, закатаем рукава и реализуем несложный сценарий захвата изменений из WAL PostgreSQL, приправленный объединениями, агрегацией, стеком ELK и целым кластером Flink, правда в миниатюре.

Читать далее
Всего голосов 7: ↑7 и ↓0+7
Комментарии4

WireMock – швейцарский нож в арсенале тестировщика. Часть 1

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

Всем привет! Меня зовут Анатолий Калмыков, и я отвечаю за качество создаваемых решений в «Ростелеком ИТ». Сегодня я расскажу вам про WireMock – это одновременно и утилита, и библиотека на Java для создания HTTP заглушек над веб-сервисами. Он создает HTTP-сервер, к которому мы могли бы подключиться, как к реальному веб-сервису.

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

Читать далее
Всего голосов 15: ↑14 и ↓1+13
Комментарии7

Паттерн Outbox: как не растерять сообщения в микросервисной архитектуре

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

Привет! Меня зовут Михаил Боровиков, я тимлид команды, которая отвечает за систему процессинга заказов Lamoda — Orders Management. Эта система, словно «сердце» Lamoda, через которое проходит самый важный для бизнеса шаг — оформление заказа.

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

Для решения этой проблемы мы выбрали паттерн Outbox. И в этой статье я расскажу, что он из себя представляет, как мы его применили, почему пошли по пути at-least-once и не положились на работу одного брокера сообщений.

Читать далее
Всего голосов 28: ↑26 и ↓2+27
Комментарии27

KeyDB как [потенциальная] замена Redis

Время на прочтение6 мин
Количество просмотров37K
На хабре не нашлось обзоров «более быстрой альтернативы Redis» — KeyDB. Получив достаточно свежий опыт его использования, хочется восполнить этот пробел.



Предыстория достаточно банальна: однажды с большим наплывом трафика была зафиксирована значительная деградация производительности приложения (а именно — времени ответа). На тот момент, к сожалению, не удалось провести нормальную диагностику происходящего, поэтому впоследствии запланировали ряд нагрузочных тестирований. После их проведения удалось обнаружить узкое место, коим стал кэш базы данных в Redis. Как это часто бывает, проблему нельзя было решить сию секунду и правильным путём — силами разработчиков (изменением логики работы). Поэтому включилось любопытство и желание побороть ситуацию обходным путём. Так и появилась эта статья.
Читать дальше →
Всего голосов 64: ↑62 и ↓2+76
Комментарии41

Что такое фильтр Блума?

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

Всем привет! В этой статье я постараюсь описать, что такое фильтр Блума, рассказать о его назначении и показать сценарии, в которых его можно использовать. Я также реализую фильтр Блума на Python с нуля в целях облегчения понимания его внутреннего устройства.

Фильтр Блума. Что это?
Всего голосов 17: ↑16 и ↓1+22
Комментарии22

Зачем в Hoff Tech архитекторы или как мы строим и описываем ИТ-ландшафт

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

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

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

Читать далее
Всего голосов 15: ↑14 и ↓1+15
Комментарии6

DDD на практике. Проектирование списка желаний

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

В интернете довольно много разрозненного материала по DDD. Если не считать синей книги, то в основном это короткие статьи с теорией, надёрганной из этой же книги, и которая мало пересекается с практикой. Возможно, конечно, что я просто плохо искал, но мне давно хотелось найти какой-нибудь цельный пример, что называется, «от и до». И я решил такой пример создать на Symfony 3 и VueJS. Сразу хочу сказать, что я изучаю DDD недавно, поэтому взял довольно простую предметную область — список желаний (wish list).

Читать дальше →
Всего голосов 17: ↑14 и ↓3+11
Комментарии56

Обзор утилиты Lens. Управление кластером Kubernetes из графической оболочки

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

Управление кластером Kubernetes чаще всего осуществляется при помощи командной строки и утилиты kubectl. Однако, кроме этого распространенного способа, есть и другие. Например, с помощью программы Lens.

Lens — программное обеспечение, которое позволяет полноценно управлять кластером Kubernetes через графический интерфейс пользователя — GUI (graphical user interface).

Читать далее
Всего голосов 10: ↑10 и ↓0+10
Комментарии10

Разбираемся с Redis

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

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

Читать далее
Всего голосов 46: ↑45 и ↓1+62
Комментарии7

RabbitMQ. Часть 3. Разбираемся с Queues и Bindings

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

Queue (очередь) — структура данных на диске или в оперативной памяти, которая хранит ссылки на сообщения и отдает их копии consumers (потребителям). Queue представляет собой Erlang-процесс с состоянием (где могут кэшироваться и сами сообщения). 1 тысяча очередей может занимать порядка 80Mb.


Binding (привязка) — правило, которое сообщает обменнику в какую из очередей должны попадать сообщения.

Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии9

Использование DiagnosticSource в .NET Core: теория

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

DiagnosticSource — это простой, но весьма полезный набор API (доступен в NuGet пакете System.Diagnostics.DiagnosticSource), который, с одной стороны, позволяет различным библиотекам отправлять именованные события о своей работе, а с другой — позволяет приложениям подписываться на эти события и обрабатывать их.


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


DiagnosticSource уже используется в AspNetCore, EntityFrameworkCore, HttpClient и SqlClient, что фактически даёт разработчикам возможность перехватывать входящие/исходящие http запросы, запросы к базам данных, получать доступ к таким объектам, как HttpContext, DbConnection, DbCommand, HttpRequestMessage и многим другим и даже изменять эти объекты при необходимости.


Я решил разделить свой рассказ про DiagnosticSource на две статьи. В этой статье мы на простом примере разберем принцип работы механизма, а в следующей я расскажу о существующих в .NET событиях, которые можно обрабатывать с его помощью и покажу несколько примеров его использования в OZON.ru.

Читать дальше →
Всего голосов 26: ↑26 и ↓0+26
Комментарии7

Selenium vs Puppeteer vs Cypress vs Playwright

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

Всем привет. Я qa automation engineer уже 14 лет и 9 из них мне так или иначе приходилось работать с автоматизацией веб-приложении (и не только). Я писала свои автотесты на C#, Java, и Js. Сейчас я хотела бы поделиться опытом, как я выбираю фреймворк для тестирования веб приложения. Думаю кому-то мой текст может быть полезен. 

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

Читать далее
Всего голосов 9: ↑6 и ↓3+6
Комментарии17

Хакаем WhatsApp, чтобы следить за активностью контактов

Время на прочтение11 мин
Количество просмотров92K
WhatsApp сообщает пользователю статус его контактов.

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

Дисклеймер: эта статья является proof of concept, призванной привлечь внимание к проблеме, а также попрактиковать свои технические навыки. Не используйте код для слежки за людьми.



WhatsApp на Android

Эксплойт функции


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

Чтобы разобраться, я использую https://web.whatsapp.com/ в веб-браузере ноутбука вместо приложения в Android-смартфоне. То есть для создания эксплойта мне придётся иметь дело с обычным реверс-инжинирингом веб-приложения. Реверс-инжиниринг приложения для Android я оставлю на потом.
Читать дальше →
Всего голосов 24: ↑23 и ↓1+32
Комментарии14

Балансировка нагрузки: основные алгоритмы и методы

Время на прочтение11 мин
Количество просмотров187K
балансировка нагрузки

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

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

Балансировка нагрузки может осуществляться при помощи как аппаратных, так и программных инструментов. Об основных методах и алгоритмах и балансировки мы бы хотели рассказать в этой статье.
Читать дальше →
Всего голосов 36: ↑31 и ↓5+26
Комментарии15

Приручить «зоопарк»: как мы искали IT-подход к разнообразному парку самокатов

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

Всем привет!
Меня зовут Андрей Калинин, я директор по IT сервиса кикшеринга «Юрент» – вы наверняка видели наши фиолетовые самокаты во многих городах. У нас есть интересная особенность по сравнению с другими сервисами: в нашем парке не 1-2 модели самокатов, а с десяток разных моделей и поколений. Внутри мы называем это многообразие «наш зоопарк». Масштабировать «зоопарк» (сейчас это уже больше 80 тыс. самокатов) было нетривиальной задачей с точки зрения IT-разработки. Да и вообще работа с «железом» – это иногда сложно и больно, но всегда интересно.

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

Поехали!
Всего голосов 8: ↑8 и ↓0+8
Комментарии5

«Глаза» беспилотных автомобилей: LiDAR и компьютерное зрение

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

Самоуправляемое транспортное средство может «видеть» разными способами. Человеческое зрение ему заменяют радары, камеры, лазеры, радиоволны и ультразвук. В этом обзоре поговорим о лидарах и компьютерном зрении (CV) — двух основных инструментах, на которых основано автономное восприятие окружающего мира беспилотными автомобилями. Мы коротко опишем принцип работы технологий, расскажем, кто производит и внедряет подобные устройства, а также сравним их основные достоинства и недостатки.

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии7

Не всё пропало: как мы провели импортозамещение роботов незаметно для 90% пользователей

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

 

С 2019 года мы роботизируем различные рутинные процессы. Это снимает с сотрудников часть монотонной работы и позволяет им уделять больше времени важным задачам. Мы использовали RPA-платформу UiPath, но в феврале 2022 года начался обратный отсчет до момента, когда все, что мы сделали за три года, превратится в тыкву. Нужно было срочно найти замену и избежать наихудшего сценария. 

Как мы это сделали, какое решение выбрали и какие проблемы решили — читайте под катом.

Читать далее
Всего голосов 19: ↑16 и ↓3+15
Комментарии9

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность