夜雨聆风学习资料网

ARTICLE · 1348822

插件管理器:四层境界,多数只在第三层

插件管理器:四层境界,多数只在第三层
三十个插件、要互相通信,线程不能随插件数量增长——这时候才需要插件框架。

但大部分人搭到第三层就停了:能加载、能通信,然后每个插件开一个线程。插件一多,线程数就失控。

单机服务中最常用的扩展框架:插件结构,也是模块化的重要形式。

先分清插件和组件的概念。插件和组件在物理形态上都是共享库。插件是强调根据配置插拔,动态加载卸载。组件是业务依赖复用的公共库。

插件的实现有几个必要的点:

第一层 · 插件管理器

1、插件需要有插件管理器,负责根据配置等加载插件,保存插件的实例。插件本质上使用动态库的动态加载卸载功能。

真正的可扩展模式,是把变化交给数据。

第二层 · 统一契约接口

2、插件需要有统一的契约接口,简单点有 init、run、uninit。常用于插件之间独立运行,互不通信。插件管理器加载后依次调用 init、run、最后 uninit。

当然插件接口要符合 ABI ——我的c++洁癖19:二进制边界使用纯 c 和 POD。

第三层 · 消息总线

3、插件需要消息总线。前面两条可以实现简单的插件功能。复杂一点如果想要通信,插件的契约接口可以增加发送消息接口 sendMsg。

简单的方式插件 A 直接 sendMsg(B, msg1) 发给插件 B,这种方式 A 直接耦合 B。

解耦就用订阅发布方式:插件 B 注册消息接口 registerMsg(msg1) 的消息,插件 A 只管 sendMsg(msg1),并不知道插件 B 的存在。插件之间只注册自己可以处理的消息,并不耦合其他插件。

想通信就发对应消息到总线上,有人注册就转给对应的插件,没人注册就拉倒。

这就引出了:消息总线。可以使用插件管理器充当总线功能,不必专门另写。

插件通信,每个插件都需要线程进行事件循环。

第四层 · 二级队列 + 线程池

4、插件多了,避免线程膨胀。前面三点已经有了稍微复杂的插件间可通信的插件框架。但是如果每个插件都有自己的线程进行事件循环,那么插件多了,线程就多了。

这时理想的插件框架就是:不论插件多少,线程数量不变。就需要二级队列 + 线程池。

线程模型:从每任务一线程到二级队列线程池。

插件框架可简单可复杂。主要看项目业务采用不同复杂度的实现。

你的插件框架在第几层?第三层,还是已经做成第四层了?评论区说说,我看看能不能一起解。

往期推荐

◦︎ 单机程序数据对象管理全策略

◦︎ 数据采集的通信交互模式

◦︎ 还在用面向过程思想进行数据解析?

◦︎ 数据终究要转成内存对象才能计算

◦︎ 单机程序数据对象管理全策略

◦︎ 业务代码究竟在写什么?

◦︎ 数据流成环:架构设计中最隐蔽的坏味道

◦︎ 线程模型:从每任务一线程到二级队列线程池

◦︎ 所有程序先得接入数据tcp篇

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料