Arrow Flight RPC#
Arrow Flight 是一个用于在网络上高效传输 Flight 数据的 RPC 框架。
另请参阅
- Flight 协议文档
Flight 协议的文档,包括如何概念性地使用 Flight。
- Flight API 文档
列出所有各种客户端和服务器类的 Python API 文档。
- Python 指南
在 Python 中使用 Arrow Flight 的配方(示例)。
编写 Flight 服务#
服务器是 FlightServerBase 的子类。要实现单独的 RPC,请覆盖此类上的 RPC 方法。
import pyarrow.flight as flight
class MyFlightServer(flight.FlightServerBase):
def list_flights(self, context, criteria):
info = flight.FlightInfo(...)
yield info
每个 RPC 方法始终接收一个 ServerCallContext 以获取通用参数。若要指示失败,请抛出异常;特定于 Flight 的错误可以通过抛出 FlightError 的子类之一来指示。
要启动服务器,创建一个 Location 来指定监听位置,并创建服务器的一个实例。(字符串会被转换为位置。)这将启动服务器,但不会阻塞程序的其余部分。调用 FlightServerBase.serve() 以阻塞程序,直到服务器停止。
# Listen to all interfaces on a free port
server = MyFlightServer("grpc://0.0.0.0:0")
print("Server listening on port", server.port)
server.serve()
使用 Flight 客户端#
要连接到 Flight 服务,请使用一个位置调用 pyarrow.flight.connect()。
取消和超时#
进行调用时,客户端可以选择提供 FlightCallOptions。这允许客户端设置调用超时或提供自定义 HTTP 标头等功能。此外,客户端 RPC 调用返回的一些对象公开了一个 cancel 方法,允许提前终止调用。
在服务器端,超时是透明的。对于取消操作,服务器需要手动轮询 ServerCallContext.is_cancelled() 来检查客户端是否已取消调用,如果是,则中断服务器当前正在进行的任何处理。
启用 TLS#
在设置服务器时,可以通过向 FlightServerBase 提供证书和密钥对来启用 TLS。
在客户端,使用 Location.for_grpc_tls() 来构建要监听的 Location。
启用身份验证#
警告
如果没有启用 TLS,身份验证是不安全的。
可以通过实现 ServerAuthHandler 来启用基于握手的身份验证。身份验证由两部分组成:在初始客户端连接时,服务器和客户端的身份验证实现可以执行所需的任何协商;然后,在此后的每次 RPC 上,客户端提供一个令牌。服务器身份验证处理程序验证该令牌并提供客户端的身份。此身份可以从 ServerCallContext 中获取。
自定义中间件#
服务器和客户端支持自定义中间件(或拦截器),这些中间件会在每个请求上被调用,并且可以以有限的方式修改请求。这些可以通过继承 ServerMiddleware 和 ClientMiddleware,然后在创建客户端或服务器时提供它们来实现。
中间件功能相当有限,但它们可以向请求/响应添加头部。在服务器上,它们可以检查传入的头部并使请求失败;因此,它们可以用于实现自定义身份验证方法。