一眨眼时间又临近周末,又可以休息了
今天给大家介绍一个比较轻量级的事件总线: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;
/// <summary>
/// 订阅者
/// </summary>
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要与订阅者一致。
/// <summary>
/// 事件总线
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[HttpPost("pub")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> EventPubAsync()
{
await _eventPublisher.PublishAsync(new ChannelEventSource(SubscribeEnum.登录事件, "这里是用户登录消息"));
return JsonView(true);
}
4、启动项目,访问接口,发现消息已经成功打印出来