.NET事件总线(消息队列)轻松应对高并发
源码点我
一眨眼时间又临近周末,又可以休息了
总体介绍:
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、启动项目,访问接口,发现消息已经成功打印出来