.NET事件总线(消息队列)轻松应对高并发

源码点我

一眨眼时间又临近周末,又可以休息了

今天给大家介绍一个比较轻量级的事件总线:Jaina。

总体介绍:
Jaina核心类为一个BackgroundService,通过While来监听消息,默认存储实现为Channel,可能有的朋友没听过Channel,从.NETCore3.0微软开始提供Channel类,Channel类本质为线程安全队列,其中结合了信号量,简化了队列的使用。
因此Jaina完全可以替代一般的消息队列来使用,将业务进行解耦,轻松应对高并发(Jaina非常轻量非常简洁,代码写的也比较不错,有兴趣的可以去git上搜一下源码研究,以前类似的代码我都是手写的,哭…)。

实际应用:2核16g云服务器,单机模式,稳定万级并发(性能应该还没用完…手动无奈)。

下面来看具体用法:
1、Nuget搜索Jaina安装,首先创建一个订阅者,EventSubscribe标记为事件源ID,其实就是订阅的Topic,要与发布者一致。

namespace NET6.Api.Subscribers;

/// 
/// 订阅者
/// 
public class LoginSubscriber : IEventSubscriber
{
    [EventSubscribe(SubscribeEnum.登录事件)]
    public async Task LoginEvent(EventHandlerExecutingContext context)
    {
        Log.Error($"事件总线:{context.Source.Payload}");
        await Task.CompletedTask;
    }
}

2、打开Program,注入Jaina和订阅者。

#region 注入事件总线
builder.Services.AddEventBus(builder =>
{
    builder.ChannelCapacity = 5000;
    builder.AddSubscriber<LoginSubscriber>();
    builder.UnobservedTaskExceptionHandler = (obj, args) =>
    {
        Log.Error($"事件总线异常:{args.Exception}");
    };
});
#endregion

3、我们新建一个接口用来测试,这里发布者的事件源ID要与订阅者一致。

/// 
    /// 事件总线
    /// 
    /// 
    [AllowAnonymous]
    [HttpPost("pub")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public async Task<IActionResult> EventPubAsync()
    {
        await _eventPublisher.PublishAsync(new ChannelEventSource(SubscribeEnum.登录事件, "这里是用户登录消息"));
        return JsonView(true);
    }

4、启动项目,访问接口,发现消息已经成功打印出来
.NET事件总线(消息队列)轻松应对高并发_第1张图片

你可能感兴趣的:(个人随笔,.net,c#,后端,redis)