Найти в Дзене
Как реализовать получение метрик из Grafana для мониторинга системы?
В микросервисной архитектуре нужно точно знать, как работает ваша система. Мониторинг помогает не только обнаружить проблемы, но и понять бизнес-метрики: сколько заказов обработано, какие внешние системы тормозят и тд. OpenTelemetry или Prometheus.Client Библиотеки реализованы для большинства популярных языков, в том числе для C#/.NET. Метрики могут быть как автоматические (время обработки запросов), так и ваши собственные (количество обработанных заказов). .NET Для добавления собственных метрик можно использовать классы Meter и Counter (или интерфейс IMetricFactory), более подробнее можно изучить в документации - https://learn...
2 месяца назад
Какие библиотеки в .NET лучше использовать для генерации PDF?
Недавно ресерчил поиск решения по генерации PDF файла. Нашел несколько библиотек, которые используют в нашей компании, но полного обоснования - почему была выбрана та или иная не было, поэтому подготовил свой материал по выбору библиотеки. Эта библиотечка пришла к нам из NodeJS. https://www.puppeteersharp.com/api/index.html Возможности: Так как библиотека написана для .NET, то в качестве шаблонов можно использовать Razor Pages (cshtml). Для работы папитера требуется Chromium (веб браузер) для рендеринга...
7 месяцев назад
Сравнение возможностей разных "ГеоБД"
PostgreSQL с POSTGIS особо не буду упоминать из-за отсутствия горизонтального масштабирования из под "коробки". Геопоиск по радиусу: Геопоиск по полигону: Нахождение расстояния между точками: Все эти БД умеют в запросах определять расстояние от координат пользователя до хранящихся точек на заданном полигоне/радиусе. Но именно находить расстояние между двумя точками: Если нужно построение оптимальных...
1 год назад
Что приписывает DDD - использование монолитов или микросервисов?
Это мои мысли, если с чем-то не согласны – пишите, обсудим. Возможно подготовлю материал еще по тому как поделить один контекст на несколько и то какие вопросы задать себе, чтобы проверить наличие разных моделей в рамках одного контекста, может они были ошибочно объединены в одном контексте. DDD - это решение сложности в самом сердце - предметной области, бизнес-задаче (domain). DDD это про моделирование сложной бизнес-логики (стратегическое проектирование) и организацию кода (тактические паттерны), а не про использование микросервисов или монолитов. Фокус идет только на домене (бизнес-логике)...
1 год назад
Поиск самого ближайшего узла к пользователю в распределенной системе (GeoDNS vs Anycast)
В CDN применяется два метода для определения самого близкого узла к пользователю, в этой статье расскажем о GeoDNS, Anycast и нюансы их работы. · Anycast – выбирает наиболее эффективные маршруты для доставки интернет-трафика. · GeoDNS – определяет ближайший узел по местоположению запроса. Обычно GeoDNS и Anycast нецелесообразно использовать вместе, если у вас не самая крупная система в мире или если нет бюджета на поддержание всей этой инфраструктуры. Выберите один метод, который больше всего подходит для вашей системы...
209 читали · 1 год назад
Задержки в Kafka и перебалансировка (rebalancing)
В Kafka есть механизм отправки сообщения батчами Продюсером. Когда Продюсер отправляет сообщения в Kafka, он может объединять их в батчи. Батчи помогают уменьшить нагрузку, так как вместо множества мелких запросов обрабатывается один крупный (снижение нагрузки на сеть, экономия ресурсов), но и влияют на задержки доставки сообщений Потребителям. Батч формируется на основе двух параметров: · linger.ms: Время ожидания (в миллисекундах) перед отправкой батча. Если за это время накопились сообщения, то они отправляются как один батч. · batch.size: Максимальный размер батча (в байтах). Если размер накопленных сообщений достигает этого значения, батч отправляется немедленно...
1 год назад
Запуск длительных задач с помощью Task.Run Если вы планируете запускать длительные задачи с помощью Task.Run и внутри создавать "scope" для получения сервисов из контейнера служб в ASP.NET, то нельзя использовать IServiceProvider для этого, тк он регистрируется как Scoped и внутри Task.Run может выйти ошибка, что используемый объект уже задиспоузился. Поэтому используем IServiceScopeFactory - данный интерфейс регистрируется как Singleton. Task.Run(async () => {   using (var scope = _serviceScopeFactory.CreateScope())   {    var myService = scope.ServiceProvider.GetRequiredService<IMyService>();    await myService .Work();   } }); Чтобы логировать ошибки из Task.Run нужно добавить обработчик события TaskScheduler.UnobservedTaskException (в Program перед сборкой хоста): TaskScheduler.UnobservedTaskException += OnTaskSchedulerOnUnobservedTaskException;
1 год назад
Разбор проблем и понятий по масштабированию БД
Failover – это переключение Мастер узла, когда одна из Реплик берет на себя ответственность Мастера, когда текущий Мастер упал. Для этого Реплика должна хранить одни и те же данные с Мастером, реализовать это нужно с помощью синхронной репликации. Hot standby – Реплика которая использует синхронную репликацию и хранит одни и те же данные, что и Мастер. А также он готов взять на себя ответственность если мастер из сети пропадет. Split Brain – возвращение мертвеца. Когда сервис восстановился после того как пропал из сети и снова попал в кластер. В такой момент в кластере есть 2 МАСТЕРА. В такой...
1 год назад
Raft Алгоритм для распределенного консенсуса - несколько серверов будут совместно решать о том, произошло ли событие или нет, а также синхронизироваться на основе "логов". Сервер может находить в одним из этих состояний: Лидер - используется для записи и занимается отправкой "логов" "Фолловерам". Фолловер - сервер, который только читает новые записи "логов" от "Лидера", также отправляет входящие запросы от клиентов на "Лидера" (hot-standby реплика "Лидера"). Кандидат - состояние сервера, когда данный сервер может быть выбран в качестве нового "Лидера". Исходник
1 год назад
Получение уведомлений от БД о изменении/создании сущности в PostgreSQL. Создание хранимки для отправки сообщения в канал: CREATE FUNCTION public."NotifyOnApplicationStatusChange"()  RETURNS trigger  LANGUAGE 'plpgsql' AS $BODY$ DECLARE  data JSON;  notification JSON; BEGIN  IF (TG_OP = 'DELETE') THEN   data = row_to_json(OLD);  ELSE   data = row_to_json(NEW);  END IF;  notification = json_build_object(    'table',TG_TABLE_NAME,    'action', TG_OP,    'data', data);   PERFORM pg_notify('datachange', notification::TEXT);  RETURN NEW; END $BODY$; Создание тригера для вызова хранимки: CREATE TRIGGER "OnStatusChange"  AFTER UPDATE ON public."Applications"  FOR EACH ROW  WHEN (OLD."State" != NEW."State")  EXECUTE PROCEDURE public."NotifyOnApplicationStatusChange"(); Код для чтения сообщений из БД в .NET (прослушивание канала). Также с помощью LISTEN и NOTIFY в PostgreSQL можно построить очередь сообщений.
1 год назад
Атрибут DebuggerDisplay Eсли часто дебажите к классам можно добавлять атрибут DebuggerDisplay и выводить свойства/поля. Про другие атрибуты можно узнать в данной статье.
1 год назад