基本原理
針對(duì)Custom Runtime,您的代碼文件ZIP包是一個(gè)HTTP Server程序。本文介紹冷啟動(dòng)Custom Runtime的基本原理和HTTP Server配置要求。
基本原理
針對(duì)Custom Runtime,您的代碼文件ZIP包是一個(gè)HTTP Server程序,您只需設(shè)置函數(shù)配置中的啟動(dòng)命令和啟動(dòng)參數(shù)完成HTTP Server的啟動(dòng)。函數(shù)計(jì)算冷啟動(dòng)Custom Runtime時(shí),會(huì)調(diào)用您設(shè)置的啟動(dòng)命令和啟動(dòng)參數(shù)啟動(dòng)您自定義的HTTP Server,該HTTP Server接管了來(lái)自函數(shù)計(jì)算的所有請(qǐng)求。HTTP Server的默認(rèn)端口是9000,如果您的HTTP Server是其他端口,例如8080,您可以設(shè)置函數(shù)配置中的監(jiān)聽(tīng)端口為8080。
例如,函數(shù)的程序包名稱(chēng)為function.zip
,該運(yùn)行時(shí)各個(gè)語(yǔ)言程序包內(nèi)的文件形式和相應(yīng)的啟動(dòng)命令和啟動(dòng)參數(shù)示例如下。
Java 8或Spring Boot
.
├── demo.jar
customRuntimeConfig:
command:
- java
args:
- '-jar'
- 'demo.jar'
Python 3.7
.
├── server.py
customRuntimeConfig:
command:
- python
args:
- 'server.py'
Node.js 10
.
├── server.js
customRuntimeConfig:
command:
- node
args:
- 'server.js'
PHP 7.4
.
├── server.php
customRuntimeConfig:
command:
- php
args:
- 'server.php'
customRuntimeConfig
是函數(shù)的自定義啟動(dòng)命令配置。其中command
是容器的入口命令列表,args
是啟動(dòng)參數(shù)列表。函數(shù)計(jì)算依次把command
和args
列表中的內(nèi)容進(jìn)行拼接,形成完整的啟動(dòng)命令。如果未配置啟動(dòng)命令及啟動(dòng)參數(shù),HTTP Server將默認(rèn)從/code/bootstrap啟動(dòng)。
HTTP Server配置要求
創(chuàng)建HTTP Server時(shí)您需要滿足以下要求:
Custom Runtime啟動(dòng)的服務(wù)一定要監(jiān)聽(tīng)
0.0.0.0:CAPort
或*:CAPort
端口。如果您使用127.0.0.1:CAPort
端口,會(huì)導(dǎo)致請(qǐng)求超時(shí),出現(xiàn)以下錯(cuò)誤:{ "ErrorCode":"FunctionNotStarted", "ErrorMessage":"TheCA'shttpservercannotbestarted:ContainerStartDuration:25000000000.PingCAfaileddueto:dialtcp21.0.XX.XX:9000:getsockopt:connectionrefusedLogs:2019-11-29T09:53:30.859837462ZListeningonport9000" }
Custom Runtime的監(jiān)聽(tīng)端口,即函數(shù)屬性監(jiān)聽(tīng)端口默認(rèn)是9000。如果Custom Runtime使用默認(rèn)的監(jiān)聽(tīng)端口,那么您實(shí)現(xiàn)的Custom Runtime的HTTP Server監(jiān)聽(tīng)的端口也必須是9000。如果Custom Runtime使用的監(jiān)聽(tīng)端口是8080,那么您實(shí)現(xiàn)的Custom Runtime的HTTP Server監(jiān)聽(tīng)的端口也必須是8080。
Connection需要設(shè)置為Keep-Alive,Server端請(qǐng)求超時(shí)時(shí)間需設(shè)置在24小時(shí)(函數(shù)最大運(yùn)行時(shí)間)及以上。示例如下:
//例如Node.js使用express時(shí)。 var server = app.listen(PORT, HOST); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout
HTTP Server需要在120秒內(nèi)啟動(dòng)完畢。