Здравсвуйте, нужно реализовать внутрениий 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)?
Сама по себе фильтрация на производительности никак не сказывается. Это же просто условный оператор, пусть и в нескольких обертках...
Важно другое: каждое сообщение в такой схеме направляется сразу всем подписчикам, а потом частью отбрасывается. То есть чем больше подписчиков - тем медленнее работа.
Если вы планируете пересылать через такую шину много данных - лучше создать отдельный Subject для каждого типа сообщений.
PS а если вы решите остаться на текущей архитектуре - изучите что делает метод OfType :-)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости