Giter Club home page Giter Club logo

byndyusoft.data.relational's Introduction

Byndyusoft.Messaging.RabbitMq

Библиотека для работы с RabbitMq. Главные сделанные выборы:

  • Получение и публикация сообщений происходит через собственные объекты RabbitMqMessage и ReceivedRabbitMqMessage
  • Контент передаётся через HttpContent
  • Очередь ошибок есть всегда, в случае исключения сохраняется текст исключения
  • Встроенная поддержка трассировки
  • Встроенная поддержка метрик через активити сурц
  • Очереди нужно явно декларировать, для поддержки миграторов

IRabbtiMqСlient — рабочая лошадка библиотеки

IRabbtiMqСlient вдохновлён HttpClient'ом.

Работа с сообщениями

  • Опустошать очередь
  • Получать количество сообщений в очереди
  • Получать сообщения из очереди по одному
  • Завершать обработку полученного сообщения одним из 4-х возможных исходов
    • Ack
    • NackWithRequeue
    • NackWithoutRequeue
    • Error
  • Подписываться на сообщения очереди и возвращать один из 4-х возможных результатов
    • Ack
    • NackWithRequeue
    • NackWithoutRequeue
    • Error
  • Публиковать сообщения в очередь

Работа с топологией

  • Создание очереди
  • Проверка существования очереди
  • Удаление очереди
  • Создание обменника
  • Проверка существования обменника
  • Удаление обменника
  • Связывание очереди и обменника

Клиенты

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

Клиент — инкапсулирует в себе:

  • DTO
  • название обменников и routing
  • логику сериализации/десериализации DTO

Сценарии, которые должны закрываться с помощью клиентов (пока не всё готово)

(+) Я как создатель сервиса, который владеет контрактом очереди, должен предоставлять клиента для отправки ему сообщений, и подписки на события от него

(-) Я как пользователь клиента могу изменить исходящее сообщение

(+) Я как пользователь клиента могу задавать очередь, через которую получаю события, и её настройки

(+) Я как пользователь клиента могу задать свою стратегию обработки полученных сообщений

(+) Я как создатель клиента, должен понимать, что должно быть в клиенте, а чего не должно быть (название обменников, ключей, дто, формат)

(+) Я как пользователь библиотеки, могу написать клиента для тех случаев, когда его нет по какой либо причине.

(-) Я как пользователь библиотеки, при подписке настраиваю все необходимые для обработки сообщения очереди. Библиотека автоматически создаст всё настроенное при появлении коннекта и пересоздаст при его восстановлении после обрыва

(-) Я как автор клиента имею готовую инфраструктуру для реализации RPC

Simple usage

Send message

Create queue in hosted service:

public class QueueHostedService : IHostedService
{
    private readonly IRabbitMqClient _rabbitMqClient;

    public QueueHostedService(
        IRabbitMqClient rabbitMqClient)
    {
        _rabbitMqClient = rabbitMqClient;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        await _rabbitMqClient.CreateQueueAsync("app.sample_dto", o => o.AsDurable(true), cancellationToken: cancellationToken);
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

Send message:

public async Task SendMessageAsync(int id)
{
    var sampleDto = new SampleDto
                        {
                            Id = id,
                            Name = "name"
                        };
    await _rabbitMqClient.PublishAsJsonAsync(exchangeName: null, 
                                             routingKey: "app.sample_dto", 
                                             model: sampleDto);
}

Handle message

Register handler in hosted service:

public class QueueHostedService : BackgroundService
{
    private readonly IRabbitMqClient _rabbitMqClient;
    private readonly SampleDtoHandler _sampleDtoHandler;

    public QueueHostedService(
        IRabbitMqClient rabbitMqClient,
        SampleDtoHandler sampleDtoHandler)
    {
        _rabbitMqClient = rabbitMqClient;
        _sampleDtoHandler = sampleDtoHandler;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        await _rabbitMqClient.SubscribeAsJson<SampleDto>("app.sample_dto", OnMessage)
                             .WithDeclareErrorQueue(o => o.AsDurable(true))
                             .WithConstantTimeoutRetryStrategy(TimeSpan.FromSeconds(5), 5, o => o.AsDurable(true))
                             .StartAsync(stoppingToken);
    }

    private async Task<ConsumeResult> OnMessage(SampleDto? dto, CancellationToken cancellationToken)
    {
        if (dto == null)
            throw new InvalidOperationException("content is null");

        await _sampleDtoHandler.HandleAsync(dto);
        return ConsumeResult.Ack;
    }
}

(License)

Package name Nuget Downloads
Byndyusoft.Messaging.RabbitMq.Abstractions Nuget Downloads
Byndyusoft.Messaging.RabbitMq.Core Nuget Downloads
Byndyusoft.Messaging.RabbitMq Nuget Downloads
Byndyusoft.Messaging.RabbitMq.OpenTelemetry Nuget Downloads
Byndyusoft.Messaging.RabbitMq.Annotations Nuget Downloads

Byndyusoft.Messaging.RabbitMq.Abstractions

Abstractions for Byndyusoft.Messaging.RabbitMq.

Installing

dotnet add package Byndyusoft.Messaging.RabbitMq.Abstractions

Byndyusoft.Messaging.RabbitMq.Core

Core implementation for Byndyusoft.Messaging.RabbitMq.

Installing

dotnet add package Byndyusoft.Messaging.RabbitMq.Core

Byndyusoft.Messaging.RabbitMq

EasyNetQ implementation for Byndyusoft.Messaging.RabbitMq.

Installing

dotnet add package Byndyusoft.Messaging.RabbitMq

Byndyusoft.Messaging.RabbitMq.OpenTelemetry

OpenTelemetry support for Byndyusoft.Messaging.RabbitMq.

Installing

dotnet add package Byndyusoft.Messaging.RabbitMq.OpenTelemetry

Contributing

To contribute, you will need to setup your local environment, see prerequisites. For the contribution and workflow guide, see package development lifecycle.

A detailed overview on how to contribute can be found in the contributing guide.

Prerequisites

Make sure you have installed all of the following prerequisites on your development machine:

General folders layout

src

  • source code

tests

  • unit-tests

example

  • example console application

Package development lifecycle

  • Implement package logic in src
  • Add or addapt unit-tests (prefer before and simultaneously with coding) in tests
  • Add or change the documentation as needed
  • Open pull request in the correct branch. Target the project's master branch

Maintainers

[email protected]

byndyusoft.data.relational's People

Contributors

alex-grigorichev avatar govorovvs avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

byndyusoft.data.relational's Issues

Добавить Readme в кубик Byndyusoft.Data.Relational.

Непонятно для чего и как может использоваться этот кубик, какую функциональность он предоставляет?
Чтобы это исправить, нужно расписать в README функционал кубика, а также как его подключать и использовать.
DoD:

  • Добавить README
  • В release.yml добавить следующий шаг:
    - name: install dotnet 6.0
    uses: actions/setup-dotnet@v1
    with:
    dotnet-version: 6.0.x
  • Удалить шаги с установкой более низкий версий dotnet SDK
  • Если версия dotnet в проектах с тестами ниже версии 6, то поднять её до 6
  • Добавить публикацию README в nuget (статья с описанием, пример)

Не хватает примеров использования

Как нужно использовать классы DbSessionConsumer, TypeDeserializerExtensions и ITypeDeserializer?

Как заводить проект под постгрес?

вот так как оказалось
services.AddRelationalDb(Npgsql.NpgsqlFactory.Instance, connectionString)

Как нужно использовать сборку с абстракцией и без?

Substitute AsyncLocal with a diffrent type of session storage

Using AsyncLocal as a mechanism for storing a DbSession dictates that a programmer must create a transaction on the top level of all the code that is executed inside this transaction. As a consequence, it is impossible to use a wrapper(for purposes of creating distributed transactions, for example) that would encapsulate library calls like "await sessionFactory.CreateCommittableSessionAsync()".

Нужно получить notnull сессию из DbSessionConsumer

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

  1. Может, добавить свойство NullableSession, а просто в свойстве Session проверять на null в самом свойстве.
  2. Или наоборот добавить свойство NotNullableSession, но тогда придется использовать это длинное наименование в каждом свойстве.
    Я за 1-й вариант.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.