C# 1001 notes
6.57K subscribers
361 photos
10 videos
2 files
329 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
Download Telegram
⚡️ Вышел pgbalancer 1.0 - интеллектуальный балансировщик нагрузки для PostgreSQL

Представлен первый стабильный релиз pgbalancer 1.0 — балансировщика нагрузки для PostgreSQL, построенного на основе pgpool-II с существенными доработками.

Проект позиционируется как решение с элементами адаптивной маршрутизации запросов, управляемое через REST API и поддерживающее MQTT для потоковой передачи событий в реальном времени.

Ключевые особенности:
• Управление пулом соединений и распределение нагрузки между репликами PostgreSQL;
•Поддержка HTTP/REST для конфигурации и мониторинга;
• Интеграция с MQTT для стриминга метрик и событий;
• Реализация на языке C с сохранением производительности оригинального pgpool-II;
• Распространяется под открытой лицензией PostgreSQL.

https://www.pgelephant.com/pgbalancer
Что выведет код?

Пишите ответ в комментариях
🖥 Полезный Совет по Visual Studio:

Когда вы создаете метод, который возвращает JSON через raw string literal, добавьте

/* lang=json*/

Этот момент нигде не задокументирован.

Если в JSON будет синтаксическая ошибка вроде пропущенной запятой, Visual Studio подсветит её.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Когда стоит применять паттерн Idempotent Consumer?

В распределённых системах всё непредсказуемо: сообщения могут прийти поздно, в неправильном порядке или продублироваться.
Если надеяться, что каждое сообщение обработается «строго один раз», рано или поздно появятся тихие ошибки в данных.

Производитель может частично решить проблему: многие брокеры (Azure Service Bus, Amazon SQS) сами отбрасывают дубликаты, если у сообщения есть уникальный MessageId.

Но у потребителя ответственность больше.
Паттерн Idempotent Consumer предотвращает повторные побочные эффекты:

1. Перед обработкой проверяем локальную таблицу с ключом (MessageId, ConsumerName).
2. Если записи нет - выполняем логику, коммитим транзакцию и записываем факт обработки.
3. Если запись уже есть - сообщение повторное, просто выходим.

Что делать с внешними сервисами?
Некоторые поддерживают idempotency key (например, email-сервисы), и тогда повторный запрос просто игнорируется.
Если сервис это не умеет, можно сохранять намерение локально и выполнять действие отдельным надёжным процессом.

Важно: не все обработчики нуждаются в этом паттерне.
Если операция сама по себе безопасна при повторе (обновить статус, пересобрать кэш) — дополнительные проверки не нужны.

Используйте Idempotent Consumer там, где повторное выполнение может привести к деньгам, ошибкам или сбоям в бизнес-логике.

milanjovanovic.tech/blog/the-idempotent-consumer-pattern-in-dotnet-and-why-you-need-it
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Быстрый совет для Cursor

Хочешь, чтобы Cursor писал точнее и в твоём стиле?

🧠 Просто создай файл `.cursorrules` в корне проекта и опиши в нём:
- правила кодстайла, которые ты используешь
- предпочтения по структуре, форматированию, именованию

Чем конкретнее, тем лучше работает автогенерация.

🔥 Это помогает избежать «галлюцинаций» и потери контекста при создании кода.
Один навык сделает вас ценным в любой команде — умение находить и устранять узкие места производительности.

Скорость приложения — это не просто «хорошо иметь».
Это деньги, стабильность и доверие пользователей.

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

Почему так происходит?

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

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

Это настоящий рентген системы.

Если вы хотите внедрить распределённый трейcинг, автор подготовил пошаговый гайд, который можно адаптировать под любой .NET-проект.

Вот отличная отправная точка:
milanjovanovic.tech/blog/introduction-to-distributed-tracing-with-opentelemetry-in-dotnet
ASP .NET 10 получил новую возможность — Server-Sent Events (SSE)

В свежем ASP .NET 10 появилась поддержка Server-Sent Events — современного способа стримить данные в браузер без WebSockets.

Что такое SSE
- Односторонний канал: сервер → браузер
- Идеально подходит для потоковых обновлений, логов, нотификаций, live-данных
- Работает поверх обычного HTTP, без сложной настройки протокола

Почему это круто
- Проще, чем WebSockets
- Легче масштабировать
- Отлично подходит для real-time интерфейсов и hypermedia-приложений
- Встроено прямо в ASP .NET 10, без сторонних библиотек

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

#dotnet #aspnet #csharp #backend #webdev
This media is not supported in your browser
VIEW IN TELEGRAM
Так вот как становятся ПМ…
⚡️ Полное руководство по Bash: от основ к продвинутым темам

Bash (Bourne Again SHell) — это одна из самых популярных Unix-оболочек, широко используемая для запуска команд и написания скриптов в Linux и macOS.

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

Данное руководство последовательно познакомит вас с основами Bash (синтаксис, переменные, условия, циклы и т.д.), а затем перейдет к продвинутым возможностям (таким как настройка strict mode, использование trap-обработчиков, планирование задач через cron и др.). Мы рассмотрим практические примеры скриптов, сопровождая их поясняющими комментариями, чтобы у вас сложилось цельное понимание создания надежных Bash-скриптов.

https://uproger.com/polnoe-rukovodstvo-po-bash-ot-osnov-k-prodvinutym-temam/

Видео: https://www.youtube.com/watch?v=ei0a1TT4ukU
🧩 Борьба с блокировками в PostgreSQL: как достичь высокой параллельности при большой нагрузке 🚀

🔥 2 декабря в 20:00 мск — открытый урок в OTUS.

📌 На вебинаре рассмотрим:
— Почему возникают блокировки и как они влияют на скорость работы базы данных— Типы блокировок в PostgreSQL и их особенности на уровне транзакций и строк
— Как находить узкие места, анализировать ожидания и устранять deadlock-и
— Методы оптимизации запросов и транзакций для повышения параллельности
— Архитектурные приёмы и практики проектирования систем с высокой конкурентностью

🎓 После урока вы:
— Поймёте, как устроен механизм блокировок и научитесь управлять ими осознанно
— Научитесь диагностировать и устранять конфликты между транзакциями
— Получите набор практических решений по оптимизации PostgreSQL под нагрузкой
— Сможете спроектировать архитектуру, обеспечивающую высокую стабильность и масштабируемость

👉 Регистрация https://otus.pw/k3A0/?erid=2W5zFHrYhVa

Бесплатное занятие приурочено к старту курса Highload Architect, на котором вы освоите подходы к построению производительных архитектур, готовых к тысячам запросов в секунду.

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
«Обзор нововведений в C# 14»

Статья от PVS-Studio на Хабре описывает, что именно добавили в C# 14 и как эти изменения делают код чище и короче.

1. Ключевое слово field
Теперь в сеттере свойства можно обращаться к скрытому полю без его явного объявления.
Это уменьшает шаблонный код и делает свойства компактнее.

Пример было:

private string _email;
public string Email
{
get => _email;
set => _email = value.Trim();
}

Пример стало:



public string Email
{
get;
set => field = value.Trim();
}

Лямбды с модификаторами без указания типа
Если в параметрах используются ref, out, in, теперь можно не писать тип.
Это улучшает читаемость и уменьшает шум.

Было:


(value, out string error) => ...

Стало:


(value, out error) => ...

Перегрузка операторов составного присваивания (+=, -=, *=, /=)
Теперь такие операторы можно перегружать напрямую, а не через комбинацию бинарного оператора и присваивания.
Это делает пользовательские типы более естественными и управляемыми.

nameof для открытых обобщённых типов
Теперь можно писать:



nameof(List<>)

Это полезно при генерации кода, рефлексии и работе с API, где нужны именно открытые generics.

C# 14 - небольшое, но важное обновление языка, направленное на упрощение синтаксиса и уменьшение шаблонного кода. Наиболее заметные улучшения - field и новые правила для лямбд.