Nacos源码刨析之⭐事件发布与订阅⭐

本文深入解析了Nacos中事件监听的实现,主要围绕DefaultPublisher和DefaultSharePublisher两个事件发布器展开。DefaultPublisher是单线程执行,保证任务有序,而DefaultSharePublisher则按事件类型区分,允许慢速事件处理。Nacos在初始化时通过SPI加载默认发布器,并提供了统一的事件管理方式。虽然DefaultPublisher为每个实例启动独立线程,但可能导致线程过多的问题。

阅读nacos源码并手撸注册中心:第二个礼拜,这礼拜开始慢慢解析nacos源码里的设计,本篇解析Naocs里的事件监听-观察者模式

一、Nacos事件发布与订阅-观察者模式

在Nacos中主要事件发布器主要分为两种

  1. DefaultPublisher:只能监听一种Event.class子类,每个一个线程;
  2. DefaultSharePublisher:可以区分监听多种Event.class子类,使用Map<Class,Subscriber>做了事件类型监听区分,多种Event也共用一个线程;
DefaultPublisher 默认事件发布器

不根据事件的具体实现类通知,一次发布,不管具体实现的Event子类都会接收到通知

在这里插入图片描述

DefaultSharePublisher 可区分类型监听发布器

该发布器,可以实现根据具体的事件实现类类型,指定监听事件,也可以全部监听

在这里插入图片描述

DefaultPublisher 具体实现

到这里已经能明显看出是观察者模式(创建subject、创建observer、添加监听 、subject发布事件),核心方法在init() 看下张图

在这里插入图片描述

核心init方法里设置了线程属性,创建了阻塞队列,核心方法在start(),start()方法里执行了Thread的start()方法 ,也就是下面的run()方法

在这里插入图片描述

run方法里执行了openEventHandler(),该方法做了两件事
1.检查是否有监听者–每一秒检查一次,检查60次一共60秒,六十秒后就放行不检查了避免任务堆过多
2.从阻塞队列获取任务执

⭐这里可以发现是单线程去执行,因为要保证任务的有序性⭐
在这里插入图片描述

DefaultSharePublisher具体实现

与默认的实现没什么不同,还是单线程,区别在于会根据添加的事件Class进行分类,在通知的时候也只会通知监听了指定的Class类型;

在这里插入图片描述

因为是单线程共享执行,所以提供了一个Event继承类SlowEvent,代表是DefaultSharePublisher的事件。表示可以接受在单线程的情况下,执行可能要排队比较久;

在这里插入图片描述

二、在Nacos中的使用

如何初始化

在Nacos中NotifyCenter类是事件通知中心的管理类,初始化在static代码块中;

  1. 在静态代码块中去初始化–只用真正使用到的时候才会初始化,不依赖其他地方调用初始化(隔离);
  2. 通过SPI的方式去加载默认的事件发布器类型–目前没有配置SPI,使用的是DefaultPublisher
  3. 提供DefaultPublisher创建工厂给予业务类使用

在这里插入图片描述

如何统一管理

DefaultPublisher 和 DefaultSharePublisher 代表了一对一 和 一对多,在添加时调用的方法都是一样的,根据事件类型进行区分使用哪种事件发布器
可以看到IF做了SlowEvent.class的判断,true则使用DefaultSharePublisher(共享)事件发布器

在这里插入图片描述

缺点
  1. DefaultPublisher(默认事件发布器)每实例一个都需要启动一个线程单独执行,来保证事件被快速执行–控制事件数量避免线程过多

— EOF —

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值