VPC高速直连调用
EAS支持通过Python官方SDK或自行实现调用逻辑的方式对服务进行VPC高速直连调用。本文详细介绍这两种调用方式的实现方法。
调用原理
VPC高速直连调用、公网调用及VPC地址调用的链路如下图所示。开启服务运行所在资源组的VPC高速直连功能后,EAS会在您指定的安全组内绑定辅助网卡,打通您的VPC和EAS服务实例之间的网络。之后您可以在自己的VPC中直接访问EAS实例,无需通过网关访问服务,避免了四层SLB和七层网络转发。同时,EAS预置的RPC实现了HTTP相关协议栈,对于高QPS(Queries Per Second)的大流量服务(例如图像服务),可以大幅度提高访问性能、降低访问延时。
前提条件
如果您使用专属资源组部署服务,则部署服务前,需要为专属资源组开通VPC高速直连功能,详情请参见配置网络连通。
安全组控制ECS实例机器的出入流量,用户的ECS实例和EAS服务实例之间的网络互通也受安全组的配置控制。默认普通安全组内,实例之间是内网互通的,您可以在配置VPC高速直连时,选择需要访问在线服务的ECS实例所在安全组,从而支持实例之间网络互通。当需要配置使用不同的安全组时,请设置安全组的规则支持ECS实例之间能够互通。
调用方式
为方便用户调用服务,EAS提供了以下两种方式实现VPC高速直连调用:
EAS封装了调用逻辑并提供了Python官方SDK,您可以直接使用该SDK实现VPC高速直连调用。
推荐使用官方SDK调用服务,从而有效减少编写调用逻辑的时间并提高服务调用稳定性。如果您需要使用其他语言或希望自己编写实现调用逻辑,下文也提供了方法指导供您参考。此外,自行实现调用逻辑需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求。
使用官方SDK调用(Python)
使用Python官方SDK调用服务的方法如下:
安装。
pip install -U eas-prediction --user
该Python SDK的调用详情请参见Python SDK使用说明。
编写调用程序。
以字符串作为输入输出的程序示例如下,其他格式(TensorFlow或PyTorch等)的输入输出的程序示例请参见Python SDK使用说明。
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest from eas_prediction import ENDPOINT_TYPE_DIRECT if __name__ == '__main__': client = PredictClient('http://pai-eas-vpc.cn-shanghai.aliyuncs.com', 'mnist_saved_model_example') client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 表示通过直连通道访问服务。 client.init() #request = StringRequest('[{}]') req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) for x in range(0, 1000000): resp = client.predict(req) print(resp)
其中
client = PredictClient()
的函数入参分别为高速直连Endpoint地址(endpoint参数),服务的名称(service_name参数)。高速直连Endpoint地址和地域绑定的,他的格式是pai-eas-vpc.{RegionId}.aliyuncs.com
,例如华东2(上海)地域的高速直连Endpoint地址为pai-eas-vpc.cn-shanghai.aliyuncs.com
。
自行实现调用逻辑
如果您需要使用其他语言或希望自己编写调用逻辑,则可以参见如下方法,自行实现直连访问功能,采用HTTP接口调用。EAS提供服务发现机制,在VPC环境中,通过如下地址即可获得服务的后端地址列表。
地域 | 地址 |
华东2(上海) | http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
华北2(北京) | http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
华东1(杭州) | http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
例如访问华东1(杭州)的mnist_saved_model_example服务(该服务有两个Instance),示例如下。
$curl http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
获得的服务后端地址列表如下。
{
"correlative": [
"mnist_saved_model_example"
],
"endpoints": {
"items": [
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
},
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
}
]
}
}
如上所示,客户pai两个Instance的ip、port及weight信息。您可以实现一个weighted round robin算法,在每次调用服务前获取一个Instance,并对其进行VPC直连访问。
您需要从服务端定期同步Endpoint List至本地,每次请求前,从本地Cache中根据WRR(Weighted Round Robin)算法随机访问一个Instance。如果每次请求前从服务端获取Endpoint List,则会大幅度降低访问性能。
服务更新或节点异常发生Failover时,部分Instance可能不可用。因此检测到请求失败时,客户端需要进行自动重试,以避免健康检查失败的Instance在从Instance List中移除的延时过程中被访问,进而造成服务质量下降。
完整的实现流程,详情请参见Python SDK的实现。