Arrow Flight RPC#

Arrow Flight 是一个 RPC 框架,用于通过网络高效传输 Flight 数据。

另请参阅

Flight 协议文档

Flight 协议的文档,包括如何在概念上使用 Flight。

Flight API 文档

Python API 文档,列出了所有各种客户端和服务器类。

Python Cookbook

在 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 作为通用参数。要指示失败,请引发异常;可以通过引发 FlightError 的子类来指示特定于 Flight 的错误。

要启动服务器,请创建一个 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 获取此身份。

自定义中间件#

服务器和客户端支持在每个请求上调用的自定义中间件(或拦截器),并且可以以有限的方式修改请求。 可以通过子类化 ServerMiddlewareClientMiddleware 来实现,然后在创建客户端或服务器时提供它们。

中间件相当有限,但它们可以向请求/响应添加标头。 在服务器上,他们可以检查传入的标头并使请求失败; 因此,它们可用于实现自定义身份验证方法。

Flight 最佳实践#