摘要:
VH的driver对上层提供的接口,是会保持状态。这个状态,可以分为,查询的数据的状态,主要是为了提供翻页查询的功能。另一种状态,就是订阅。
有状态的服务:
- 状态是什么? 其实从调用方的角度更好的理解,会话的保持,查询的数据的保持,调用层已经订阅过的东西
- 那么服务的状态,会如何影响设计呢? 最核心的是对于状态的保持,状态什么会丢失?当下层VH服务,断线重连后,下层的VH服务,是不会保持已经订阅的东西,那么如何做呢?
- 另一种就是查询的缓存的保持,断线重连之后,缓存是如何做?
状态处理:
一. 查询的保持
查询的并发控制
- 查询的处理,被包装成task, 然后task交由线程池去执行。
- 这样就遇到了关于多个线程的同步的问题
- 调用方的调用线程A
- 线程池里用于执行task的线程B
- VH回调数据的线程C
- 这三个线程,执行task的线程B,与VH回调函数的线程C,同时去访问同一块数据队列。 线程B向队列写数据,线程C从队列里都数据。所以线程B和线程C,要使用同一个锁。
- 调用方的调用线程A,去读取task的是否完成的状态。线程B里,更新task的状态。所以线程A和线程B,同时访问这个状态。线程A和线程B,对于状态的访问,要使用同一个锁。
查询的缓存数据的保持
- 主要出现在VH断线重连了之后,查询到的数据是否要缓存
- 从缓存的角度上,上次查询已经完成,断线重连,不影响已经查询到的数据
- 所以即使是短线重连,查询的缓存的数据也要保持
二. 订阅的保持
VH断线重连后driver重新订阅:
- 如果VH数据库断线重连,但是不保持此前连接的订阅,那么就必须driver在重新订阅后重新订阅。
- 这就需要driver记录之前的订阅,在断线重连了之后,重新订阅。
VH订阅数量的限制:
- 调用方给出了一堆要订阅的,但是如果超出VH数据库的接口的订阅的数量的限制,那么就需要多次去订阅
- 多次去订阅,是要在driver中去处理。这块要独立的去设计。