EventBus/EventQueue 再思考 (2)

定义 PageViewEvent 和 PageViewEventHandler,用来记录和处理请求访问记录

public class PageViewEvent : EventBase { } public class PageViewEventHandler : EventHandlerBase<PageViewEvent> { public static int Count; public override Task Handle(PageViewEvent @event) { Interlocked.Increment(ref Count); return Task.CompletedTask; } }

事件很简单,事件处理也只是增加了 PageViewEventHandler 内定义的 Count。

服务注册:

// 注册事件核心组件 // 会注册 EventBus、EventHandlerFactory、EventQueue 等 services.AddEvents() // 注册 EventHanlder .AddEventHandler<PageViewEvent, PageViewEventHandler>() ; // 注册 EventQueuePubliser,默认注册的 IEventPublisher 是 EventBus services.AddSingleton<IEventPublisher, EventQueuePublisher>(); // 注册 EventConsumer services.AddHostedService<EventConsumer>();

事件发布,定义了一个中间件来发布 PageViewEvent,定义如下:

// pageView middleware app.Use((context, next) => { var eventPublisher = context.RequestServices.GetRequiredService<IEventPublisher>(); eventPublisher.Publish(new PageViewEvent()); return next(); });

然后定义一个接口来获取上面定义的 PageViewEventHandler 中的 Count

[Route("api/[controller]")] public class EventsController : ControllerBase { [HttpGet("pageViewCount")] public IActionResult Count() { return Ok(new { Count = PageViewEventHandler.Count }); } }

运行起来之后,访问几次接口,看上面的接口返回 Count 是否会增加,正常的话每访问一次接口就会增加 1,并发访问问题也不大,因为每个事件都是顺序处理的,即使并发访问也没有关系,事件发布之后,在队列里都是顺序处理的,这也就是引入事件队列的目的(好像上面的原子递增没什么用了...) 如果没看到了增加,稍等一会儿再访问试试,事件处理会迟到,但总会处理,毕竟是异步处理的,有些延迟很正常,而且上面我们还有一个 1s 的延迟

EventBus/EventQueue 再思考

More

作者水平有限,如果上述有哪些不对的地方还望指出,万分感谢

Reference

https://github.com/WeihanLi/WeihanLi.Common/tree/dev/src/WeihanLi.Common/Event

https://github.com/WeihanLi/WeihanLi.Common/blob/dev/samples/AspNetCoreSample/Startup.cs

https://www.cnblogs.com/weihanli/p/implement-a-simple-event-bus.html

https://www.cnblogs.com/weihanli/p/implement-event-queue.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxgyf.html