全部产品
云市场
云游戏

VPC高速直连调用

更新时间:2020-04-30 14:46:38

一、VPC高速直连调用说明

下图说明了VPC高速直连调用(绿色背景)与公网调用(紫色背景)及VPC地址调用(黄色背景)的调用链路及原理区别:

当用户开启运行的服务务运行所在的资源组的网络直连功能后(详见:资源组开通VPC高速直连),用户在自己的VPC中可不再通过网关来访问部署在EAS的服务,绕过四层和七层的网络转发,直连到EAS内用户部署的服务的Instance中去,同时EAS内置的RPC实现了HTTP相关的协议栈,整个调用链路缩短到最短,从而对于高QPS大流量的服务(如图像服务)极大地提升访问性能和降低延时。

二、调用前提

  1. 仅支持部署在专属资源组中的服务,专属资源组创建查看资源组使用介绍
  2. 部署服务前,专属资源组需要先和用户VPC进行打通,具体原理及使用步骤请查看资源组开通VPC高速直连

三、调用方式

EAS为了方便用户的调用,将调用逻辑进行了封装,并提供了应用较广的Python的官方SDK。

  • 我们推荐您使用官方SDK方式进行调用,可有效节约您的服务调用逻辑编写的时间并提升调用稳定性。

  • 若您需要使用其他语言或希望自己编写实现调用逻辑,我们也在3.2节提供了方法指导,供您参考。此外,自行实现调用逻辑需要根据不同的框架进行服务请求构造,具体请参见《通用processor服务请求数据构造》章节。

    3.1 官方SDK调用(Python)

Python SDK使用指南

(1)、安装

  1. pip install -U eas-prediction --user

该Python SDK调用接口详细说明请参见GitHub链接

(2)、编写调用程序

示例(此处以字符串为输入输出的程序为例,更多格式的输入输出的程序Demo(TF、PyTorch等)请参见GitHub链接):

  1. #!/usr/bin/env python
  2. from eas_prediction import PredictClient
  3. from eas_prediction import StringRequest
  4. from eas_prediction import TFRequest
  5. from eas_prediction import ENDPOINT_TYPE_DIRECT
  6. if __name__ == '__main__':
  7. client = PredictClient('http://pai-eas-vpc.cn-shanghai.aliyuncs.com', 'mnist_saved_model_example')
  8. client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFiMw==')
  9. client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 表示通过直连通道来访问服务
  10. client.init()
  11. #request = StringRequest('[{}]')
  12. req = TFRequest('predict_images')
  13. req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
  14. for x in range(0, 1000000):
  15. resp = client.predict(req)
  16. print(resp)

注意上面的client = PredictClient()内填入的信息,是通过对调用信息窗口(下图)中获取的访问地址的拆分,例:

调用链接:

http://1664081855183111.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online

转PredictClient:

client = PredictClient('http://1664081855183111.vpc.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online')

3.2 自行实现调用

若您需要使用其他语言或希望自己编写实现调用逻辑,可以按照下面的方法自己来实现直连访问的功能,采用HTTP接口调用。

上面已经提到EAS提供了服务发现的机制,在VPC环境中通过如下的地址即可获取用户服务的后端地址列表:

区域 地址
上海 http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/
北京 http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/
杭州 http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/

如访问杭州的名为mnist_saved_model_example的服务,该服务有两个instance:

  1. $curl http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example

得到如下结果:

  1. {
  2. "correlative": [
  3. "mnist_saved_model_example"
  4. ],
  5. "endpoints": {
  6. "items": [
  7. {
  8. "app": "mnist-saved-model-example",
  9. "ip": "172.16.0.22",
  10. "port": 50000,
  11. "weight": 100
  12. },
  13. {
  14. "app": "mnist-saved-model-example",
  15. "ip": "172.16.0.23",
  16. "port": 50000,
  17. "weight": 100
  18. }
  19. ]
  20. }
  21. }

如上所示,客户端可获取该服务后端对应的两个instance的ip,port,weight信息,可实现一个weighted round robin 算法来在每次调用前获取一个instance,并对其进行直连访问。注意:endpoint list需要在后台定期从服务端同步后cache在本地,每次请求前从cache中根据wrr算法随机拿一个instance进行访问,千万不要每次请求前同步地从服务端获取这个list,性能会有非常大的损耗。

由于服务更新时或节点异常发生failover时,部分instance可能不可用,在检测到请求失败时,客户端需要进行自动重试,以避免健康检查失败的instance在从instance list中移除的延时过程中被访问到,造成服务质量下降。