摘要:
2024-05-28 blue-VH-driver-需求分析,VH是个数据库,需要写一个driver,形态是dll/so动态库,调用VH的接口,然后给上层的标准数据服务去调用。
这个需求会涉及很多隐含的可能出问题的地方,需要详细分析下。
当前已知的标准服务的要求:
一. 功能上
- 枚举位号,拿出所有的信息
- 获取位号的变化消息
- 批量的读取位号, 可以翻页批量读取
- 实时订阅位号
- 历史数据查询
- 固定查询,统计查询
- 点查询
- 指定时间范围的聚合运算查询
- 实时数据相关查询
二. 从访问方式上
- 标准数据服务,提到了会使用使用单个线程去对外使用,但是不做保证
- 标准数据服务调用driver,两个线程去调用同一个接口,不能互相阻塞对方线程,不能互相影响
- 也就是说driver,必须要考虑并发访问
所要考虑的问题:
一. 架构设计相关
- 访问位号的时候,是先拿到位号的数量,然后再翻页的批量访问位号。
- 那么两个不同的客户端线程,如何做到互相不影响?
- 并发模型怎么设计?线程池怎么设计? 线程池又如何与task进行配合? 线程池又如何与客户端线程接口访问进行配合?
- driver内部的缓存要如何设计?缓存如何与特定的客户端会话绑定?
- 如果VH数据库断开连接,那么标准数据服务翻页批量访问位号的时候,断开连接,是否认为是已经出错了?是否要报错?还是不报错,只是将此前缓存的数据继续返回?也就是说,不同的客户端会话的位点缓存,生命周期如何控制?
二. 业务相关
- 组态是什么?位点是什么?为什么位点是位于组态里面?组态和工厂中的什么东西能进行关联来理解? 位点能和什么东西结合起来理解?
- 从组态中,能获取什么样的数据?获取方式是什么样的?组态中包含多少不同的数据结构? 每个数据结构的成员,又是代表了什么意思? 为什么要这么定义? 这种数据结构是在多高的层次上做了抽象?
- 订阅位点,获取位点的变化, 是否要和特定的客户端会话绑定? 还是说当作全局的?