Внутренний EventBus для AspNetCore 2.0

172
28 августа 2018, 01:00

Здравсвуйте, нужно реализовать внутрениий EventBus (не микросервисное взаимодействие на основе например RabbitMq). Все издатели пишут на общую шину генерацию события с типизированным данными (MyData) Подписчики слушают шину и фильтруют издателей по типу дачных (MyData). Желательно чтобы при подписке возвращался IDisposable. И издатель мог также отписать всех подписчиков.

Не было времени искать готовые решения поэтому быстро сделал обертку над ReactiveExt

public class ReactiveEventBus
{
    public ISubject<object> Bus { get; set; }

    public ReactiveEventBus()
    {
        Bus = new Subject<object>();
    }

    public void Publish<TMessage>(TMessage msg)
    {
        Bus.OnNext(msg);
    }

    public IDisposable Subscribe<TMessage>(Action<TMessage> action)
    {
        return Bus
            .Where(item=> item.GetType() == typeof(TMessage))
            .Subscribe((obj) =>
            {
                var val = (TMessage) obj;
                action(val);
            });
    }
}

Т.е. Subscribe срабатывает на всех Publish, для сработки только на нужных событиях, фильтрую через Where по типу.

Тут есть проблема boxing/unboxing если TMessage Value типа, т.к. идет преобразование из object ( var val = (TMessage) obj) перед вызовом самого делегата. Но у меня события Value врядли будут.

Как сильно сказывается на производительности фильтрация (Where) в Rx событиях если много подписчиков и часто публикуются события.

Стоит ли это реализацию заменять на готовые решения (первое что попалось MemBus)?

Answer 1

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

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

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

PS а если вы решите остаться на текущей архитектуре - изучите что делает метод OfType :-)

READ ALSO
Как сократить долгую проверку на каждую букву C#

Как сократить долгую проверку на каждую букву C#

Нужно сделать проверку что бы введенное слово не содержало английских символов (f,a,g)Но простым, длинным str

169
Использование Scrypt и Bcrypt C#

Использование Scrypt и Bcrypt C#

Как использовать Scrypt или Bcrypt в C#Прошерстил несколько сайтов и форумов, но не вижу никаких объяснений, как скачать и установить библиотеку...

212
Шанс выпадение предметов(drop chance) в Unity3d

Шанс выпадение предметов(drop chance) в Unity3d

Сразу говорю, что ответ, скорее всего, лежит у меня перед глазами, но я его, как обычно, не вижу(А ещё, скорее всего, я запутался xD) Есть код, в котором...

218