全部产品
云市场

高速直连通道调用

更新时间:2019-07-23 15:25:58

直连通道调用方式前提

  1. 仅支持部署在预付费资源组中的服务,资源组创建查看资源组使用介绍
  2. 部署服务前,资源组需要先和VPC进行打通,步骤查看资源组打通专有网络VPC

原理

原理包括两部分,一部分是网络打通,另一部分是服务发现。

对于网络打通,在用户给EAS授权后,EAS扮演用户的角色来在用户指定的VSwitch和SecurityGroup中创建弹性网卡(免费),弹性网卡会占用用户VSwitch中的网段地址,请确保用于打通的VSwitch的网段中剩余IP充裕,对于EAS的预付费资源组中的实例,会为每个实例创建一张弹性网卡,并绑写到EAS的预付费资源组中的实例上。以次实现了用户可在自己的VPC访问EAS VPC中的实例。

对于服务发现,用户在预付费资源组中部署服务后,EAS会根据用户申请的资源数量,为该服务创建对应的EAS实例(区别于资源组实例,这里可以理解成为一个进程),每个EAS实例在资源组节点上会自动分配一个端口,用户通过资源组节点上挂载的弹性网卡的IP地址和这个自动生成的端口号,即可以直接访问服务进程。EAS提供了服务发现的机制,可以定期查询更新服务所对应的IP:PORT列表。具体使用方法请参考后续章节。

优点

当网络打通后,用户在VPC中可不再通过网关来访问服务,绕过了四层和七层的网络转发,直连到EAS的Instance中去,同时EAS内置的RPC实现了HTTP相关的协议栈,整个链路缩短到最短,对于高QPS大流量的服务(如图像服务)极大的提升访问性能和延时。

缺点

直连模式相比于网关模式的缺点在于,直连模式为了提升性能绕过了四层的SLB和七层的网关转发,主动放弃了服务端负载均衡和容错的功能,因此需要依赖于客户端来做负载均衡和容错。客户端需要实现相关的负载均衡和重试算法,对于服务测试和调试会带来一定的难度。EAS后续会提供相关的配置SDK来帮助用户完成客户端的访问。

具体调用

Python SDK

EAS目前提供了python sdk用于进行服务访问,python sdk中集成了通过vpc直连的方式进行访问的接口。

安装python sdk

  1. pip install -U eas-prediction

使用示例

  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)

其它语言

目前仅提供了Python版本的SDK,其它语言版本会陆续开放,敬请期待。用户可以按照下面的方法自己来实现直连访问的功能。

上面已经提到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-internet.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中移除的延时过程中被访问到,造成服务质量下降。