Qlib-Server
章节大纲
-
Qlib-Server:量化库数据服务器
简介
Qlib-Server 是 Qlib 的配套服务器系统,它利用 Qlib 进行基础计算,并提供了丰富的服务器系统和缓存机制。有了 Qlib-Server,可以对为 Qlib 提供的数据进行集中管理。
框架
Qlib 的客户端/服务器框架基于 WebSocket,因为它支持客户端和服务器之间在异步模式下的双向通信。
Qlib-Server 基于 Flask,这是一个用于 Python 的微框架。这里使用 Flask-SocketIO 来建立 WebSocket 连接。
Qlib-Server 提供以下功能流程:
监听来自客户端的传入请求
客户端会向服务器发送几种类型的请求。服务器将解析这些请求,从不同的客户端收集相同的请求,记录它们的会话 ID(session-ids),并将这些解析后的任务提交到一个管道中。Qlib 使用 RabbitMQ 作为这个管道。这些任务将被发布到名为 task_queue 的通道中。
RequestListener 用于实现此功能:
在接收到这些请求后,服务器会检查不同的客户端是否请求了相同的数据。如果是,为了防止重复生成数据或重复生成缓存文件,服务器将使用 Redis 来维护这些客户端的会话 ID。一旦任务完成,这些会话 ID 将被删除。为了避免 I/O 冲突,我们引入了 Redis_Lock,以确保 Redis 中的任务不会被同时读写。
向客户端响应数据
服务器从 message_queue 消费结果,并获取请求此结果的客户端的会话 ID。然后,它将结果响应给这些客户端。
RequestResponder 用于实现此方法。
上述两个类被组合成 RequestHandler,它负责与客户端进行通信。
接受来自 RabbitMQ 的任务并处理数据
服务器会自动从 RabbitMQ 收集任务并处理相关数据。RabbitMQ 提供了一种机制:当服务器消费一个任务时,会触发一个回调函数。数据处理过程就是在这些回调中实现的,目前它支持以下三种类型的任务:
-
Calendar (日历)
-
Instruments (标的)
-
Features (特征)
DataProcessor 用于实现此功能。
服务器将使用 qlib.data.Provider 来处理数据。RabbitMQ 还提供了一种机制,可以确保所有任务都被消费者成功消费和完成。这要求消费者在成功处理数据后调用 ch.basic_ack(delivery_tag=method.delivery_tag)。如果任务没有被 acked(确认),它将返回到管道中并等待另一次消费。
一旦任务完成,一个结果(可以是数据或 URI)将被发布到另一个名为 message_queue 的通道中。
-