全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件

常见问题

更新时间:2018-01-29 14:39:30

问题索引

程序构建

你们只支持Node.js,我用C++写的程序怎么运行?

我们会根据用户需求不断拓展支持的语言种类。当前我们支持 Node.js,Python。Java 也会在近期支持。如果您的程序是用我们还未支持的语言实现的,您可以采用以下做法:

  • 看看是否能方便的用我们支持的语言改写。Node.js,Python等语言包含了非常丰富的类库,开发效率很高。
  • 将 C/C++ 等程序编译为可执行文件,通过fork等系统调用的方式运行可执行文件。
  • 将 C/C++ 模块编译为shared library,在Python等语言中通过binding的方式调用。

下表总结了以上方法的优缺点:

构建方式 实施难度 性能损失 适用场景
重写逻辑 取决于逻辑复杂度 取决于语言以及具体应用场景 适用于逻辑不太复杂的场景
调用可执行文件 适合对延时不敏感的场景,例如异步后台文件处理等等
调用shared library 适合性能要求很高的场景

如果以上方法仍不能解决您的问题,请联系我们。我们还可以为您定制其他方法。

现在 docker 这么火,为什么你们不支持用户自定义 docker 镜像?

实际上支持用户自定义镜像本身不是特别难,难的是支持特别大的自定义镜像。为了保证实时伸缩,系统必须在很短的时间内将容器启动。如果用户自定义的镜像特别大,下载镜像的时间可能就长达几分钟,这样的性能损失很难接受。我们希望您能使用微服务的开发方式,将逻辑解耦,每个函数的功能明确。这样函数代码一般不会有特别复杂的依赖,更容易构建。

函数计算的运行环境中所依赖的包如何自动安装?

函数计算要求您上传的代码包中包含了所有的依赖。不同的语言包管理机制不同,例如在 Node.js 中,您可以使用 npm 将依赖的包安装到代码目录中并打包上传。您可以使用我们的命令行工具 fcli 安装依赖并打包。具体过程请参考我们的示例

函数运行

我在函数里要运行一个可执行文件,在本地调试通过,为什么在函数计算的环境中返回 permission denied 错误?

通常在 Windows 系统中开发函数会遇到类似的问题,主要的原因是在打包代码时, Windows 平台下的有些压缩工具丢失了文件/文件夹的属性。当代码在函数计算的运行环境中解压后(Linux),就会遇到没有权限的问题。请确保您的压缩工具保留了文件或者文件夹的others权限,例如755或者664。或者使用 Linux/Mac OS 开发。

如果我程序要产生很大一个文件,或者需要一个比较大的空间,我什么地方能申请到?

您的函数在运行时有512MB的临时存储空间。如果还不够用,请考虑用流式的方式处理数据,通常这样会更加高效。这里是一个示例,通过流式的方式,将一个函数从原来消耗1G内存,运行几分钟,优化到消耗256MB内存,运行10秒钟。如果仍然不能解决您的问题,请联系我们

在程序运行过程中,实际使用了多少内存,我从哪些接口能获取到?

函数调用的返回信息中会包含最大内存消耗等信息。您也可以从性能监控指标中查看连续一段时间的函数运行资源消耗情况。

函数可以相互调用吗?

函数可以相互调用。由于函数可能运行在不同的机器上,所以是通过RPC的方式远程调用。您可以使用我们的 Invoke API 调用指定函数。

我的函数如果出现死循环,我怎么杀掉函数进程?

死循环可以分为两种:1) 单个函数运行逻辑出现死循环。2)多个函数调用出现无限递归,无法中止的情况。例如函数 A 调用 B,B 又调用 A。情况1比较容易,函数超时后,系统会自动中止函数,您会收到超时错误,但不会有财务损失。情况2比较麻烦,对系统来说,会认为这种调用是合法的。此时需要您通过函数级别的指标监控报警。此外,我们在用户粒度上设置了函数的最大并发度,确保您的费用消耗是可控的。

你们一个用户下的最大并发度只有100,所以我构建的服务每秒最多只能处理100个请求?这也太小了吧。

每秒处理请求数(qps)和最大并发度有关系,但二者不是一个概念。您可以用下面的公式来估计:每秒请求数 * 请求处理时间(秒) = 最大并发度。例如,假设您预期每秒10000个请求,平均每个请求处理时间为1秒,那么所需的最大并发度为10000;如果平均每个请求处理时间为10毫秒,那么所需的最大并发度是10000 * 0.01秒 = 100。细节信息请查阅我们的文档。此外,最大并发度的目的是对用户的保护,防止用户的费用失控,例如上面提到的函数相互调用无限递归而无法中止的例子。如果默认的值不够,您可以联系我们调整成您期望的值。

我的执行环境是否是独立安全的?怎么来保障?

确保安全是函数计算最重要的目标。我们在产品和系统设计的每个方面都把安全作为最高优先级的目标。您的程序在函数计算环境中运行的隔离保护和阿里云的ECS是同一级别,即我们是在虚拟机级别隔离运行,而非容器。此外我们还在网络,数据,代码,防DDos攻击等方面做了完备的保护,确保您的信息安全。

性能优化

函数返回后,执行环境也会随之释放吗?我能复用上一次调用缓存的资源/状态吗?

函数运行在容器的环境里。返回后,容器不会立即释放。只有在一段时间内(取决于系统的调度算法,通常在几分钟到几十分钟),该容器都没有收到任何请求,才会被释放。如果有持续的请求,可以认为函数是常驻的。因此,您可以通过全局变量等方式缓存资源来优化性能。但是,您的程序正确性不能依赖缓存一直可用这个假设。例如,当出现容器/机器宕机等情况,缓存的数据就不再有效。

日志监控

程序运行过程中产生的日志我如何批量下载?

如果您的日志保存在日志服务的LogStore中,您可以通过日志服务的 API 查询和下载相关内容。

函数调用正常,为什么在监控页面看不到调用次数等指标?

请检查您使用的账户是否是子账户,是否具备云监控的只读权限。

资源访问

函数计算如何访问RDS?

由于函数运行时的IP是不固定的,您需要设置RDS允许所有IP访问。但是这样会有风险,不建议这样做。函数计算会支持VPC功能,上线后用户可以通过授权的方式安全地访问VPC中的资源。

我使用函数的context参数中的access key id/secret等信息访问其他云资源,为什么身份验证失败,收到 The AccessKeyID does not exist 的错误?

函数 context 中提供了访问云资源的临时密钥,包含 access key id,access key secret,security token 3元组。请不要遗漏了security token。下图是在 python 函数中访问OSS代码示例。

  1. import json
  2. import oss2
  3. def my_handler(event, context):
  4. evt = json.loads(event)
  5. creds = context.credentials
  6. # 身份验证时,请不要遗漏了 security_token!
  7. # Do not miss the "security_token" for the authentication!
  8. auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
  9. bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
  10. bucket.put_object(evt['objectName'], evt['message'])
  11. return 'success'
本文导读目录