openstack storlet 文档(四):storlet引擎

Storlet Engine Overview

在高层视图中, the storlet engine由一下描述的组件组成。

The storlet middleware

storlet middleware是一个Swift WSGI中间件,它拦截storlet调用请求(storlet invocation requests),并将输入数据和计算输出路由到执行storlet的Docker容器中。这个中间件需要在代理服务器和对象服务器的piplines中。

该storlet中间件是允许扩展引擎以支持Docker以外的沙盒技术的方式编写的。 这表现在“storlet gateway”API中,该API定义了从沙盒运行storlet所需的功能。 而且,部分storlet中间件配置是“storlet gateway”实现的类的加载。(原文: Moreover, part of the storlet middleware configuration is what “storlet gateway” implementation class to load.) 目前,我们有一个单一的API实现,我们称之为“storlet docker gateway”。

Swift accounts

storlet引擎与Swift中的account紧密结合,方式如下:

为了在驻留在某个Swift帐户中的数据对象上调用storlet,该帐户必须启用storlet。也就是说,它必须在帐户设置中将特定的用户定义的元数据标志为true。

每个Swift帐户必须具有引擎所需的某些容器。一个这样的容器是“storlet”容器,在其中storlet被上传。上传到这个container中的storlets可以调用这个账户中的任意数据对象,给定调用用户对“storlet”容器具有读取权限。

每个帐户都有一个独立的Docker映像(和容器),storlets在其中执行。在属于某个帐户的数据对象上执行的所有的storlet将在同一个Docker容器中执行。 这有助于为不同的Swift帐户提供不同的images。Docker映像名称必须是其所属的帐户ID。

the docker image

如上所述,每个帐户都有一个Docker映像,可以用于storlet。在高层次,这个images包含:

  • 一个Java运行时环境。 当您运行用Java编写的storlet时,这是必需的
  • 一个守护工厂(A daemon factory)。是一个Python进程,它作为Docker容器启动的一部分。该进程根据在storlet_middleware的上下文中运行的“storlet docker gateway”的请求产生“per storlet守护程序”。
  • 一个storlet守护进程。 storlet守护进程是一个通用的守护进程,加载某个storlet并等待调用请求。 不同的storlets,例如 一个filter storlet和一个compresssion storlet会被加载到不同的守护进程中。当第一次需要执行某个storlet时会调用守护程序。目前,我们有两种类型的守护进程,一种用于加载和运行Java编写的storlet的Java守护进程,以及一个用于加载和运行Python编写的storlet的Python守护程序
  • The storlet common jar。这是用于开发Javax编写的storlet的jar。除其他事项之外,它还定义了storlet必须实现的invoke API。

the storlet bus

the storlet bus是Swift端的storlet中间件和Docker容器中的工厂守护程序以及storlet守护程序之间的通信通道。对于每个Docker容器(或Swift帐户),都有与该容器的storlet工厂的通信通道。对于容器中的每个storlet守护程序,都有一个通信通道,在其上侦听调用。这些通道基于unix域套接字。(PS: 不懂??)

the storlet engine components illustration

storlet引擎组件





Flow

为了把所有的东西结合起来,我们展示一个端到端的场景。

writing and deploying a storlet

流程开始于编写一个storlet,然后部署它。编写和部署一个storlet的过程将在写入和部署storlet指南中进行介绍。

Invoking a storlet

storlet可以在对象下载、上传或复制操作(分别为GET,PUT和COPY)时调用。对于流程描述,我们假设我们希望在对象下载时调用该storlet。这涉及使用额外header“X-Run-Storlet”进行Swift GET请求,该头部指定了要调用的storlet,例如:”X-Run-Storlet:compress-1.0.jar”

handling the request at the proxy server

看到“X-Run-Storlet”头,代理服务器的storlet_middleware拦截请求,并在用户指定的storlet上执行HEAD。该HEAD操作包括:

  • 执行execution权限:访问storlet容器意味着允许用户调用storlet。如果HEAD失败,则引擎返回HTTP未授权。
  • 获取storlet元数据。此元数据稍后用于验证正在执行的实际代码是最新更新的代码。

一旦HEAD成功,那么storlet中间件将storlet元数据添加到请求中,并让请求继续流过代理管道。管道结束,请求被路由到一个对象服务器,该对象服务器保存了GET uri中指定的对象的副本。

handling the request at the object server

看到“X-Run-Storlet”头,对象服务器上的storlert_middleware拦截请求并执行以下两个阶段流:

phase one

第一阶段确保Docker容器内运行的本地storlet守护程序是在适当帐户中。在这个阶段,中间件执行以下操作:

  • 检查出现在请求uri中的帐户是否有运行的Docker容器。如果没有,中间件试图产生它。
  • 检查要执行的所需的storlet是否有一个本地更新的副本。 如果没有本地副本或副本不是最新的,则中间件启动内部GET请求,以从“storlet”容器中提取它。(PS:???本地更新的副本?从storlet容器中获取??
  • 如果本地副本已更新,则中间件将检查容器中是否存在该storlet的运行守护程序。这是通过在名为“factory pipe”的命名管道上查询storlet守护程序来完成的。
  • 如果没有运行守护程序,中间件要求工厂为其生成一个。一旦产生了守护进程,在指定的命名管道上开始监听调用。
phase two

在第二阶段,中间件实际在request上调用了这个storlet。一旦运行守护进程就会执行一下中间件过程:


  • 中间件允许request继续流过对象服务器的管道,直到它得到响应。响应带有一个描述符标识哪个对象数据可以被访问。
  • 中间件使用名为管道的storlet守护进程来实现对storlet的实际调用。实际的invocation是通过沿着管道传递一个包含对象数据的描述符,以及一个描述符用于storlet写入其输出,另一个描述符用于存储日志。(ps:通过管道传递3个描述符,输入对象、输出、日志)
  • 一旦storlet开始将结果写入输出描述符,storlet_middleware将返回一个携带storlet输出描述符的响应,以使输出可以流回代理和用户。

Note: 注意上述是一个简化,突出显示了由storlet引擎完成的主要工作。
Note: 有些情况下,代理服务器上执行了这些代码。 一个这样的情况是PUT请求。 在代理上执行一个storlet涉及到上述几个精确的步骤.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值