If you want to write a program based on a popular framework, such as Flask, Express, and Spring Boot, or migrate existing framework applications, you can choose to create a web function. You can use the instance concurrency feature to effectively manage resource usage during traffic peaks and mitigate the impact of cold starts. This helps improve performance and control costs.
Create a function
Log on to the Function Compute console. In the left-side navigation pane, click Functions.
In the top navigation bar, select a region. On the Functions page, click Create Function.
On the Create Function page, select Web Function, configure the following parameters, and then click Create.
Basic Settings: Configure Function Name.
Code: Configure the runtime and code-related information of the function. The following table describes the parameters.
Parameter
Description
Example
Runtime
Select a runtime, such as a Python, Java, PHP, Node.js, or Custom Container Image.
Node.js 16
Code Upload Method
Specify how to upload code to Function Compute.
Use Sample Code: You can select the sample code provided by Function Compute to create a function based on your business requirements. This is the default method.
Upload ZIP: Select and upload a .zip file that contains your function code.
Upload Folder: Select and upload the folder that contains your function code.
OSS: Specify the Bucket Name and Object Name parameters for your function code.
Use Sample Images: Select a sample image that comes with Function Compute.
Use Container Registry Images: Select an image from Container Registry. In the Select Container Image panel, specify the Container Image Instance and Container Registry Repository parameters, find the desired image, and click Select in the Actions column.
NoteYou cannot use public images from Container Registry that belong to another account to create a function.
Use Sample Code
Startup Command
Configure the startup command of the program. If you do not configure the startup command, you must manually create a startup script named bootstrap in the root directory of the code. You can use the bootstrap script to start your program.
npm run start
Listening Port
Specify the port on which the HTTP server in your code listens.
9000
In the Advanced Settings section, configure instance settings and other items such as the function execution timeout period.
Parameter
Description
Example
Specifications
Configure the vCPU Capacity and Memory Capacity parameters based on your business requirements. For more information about billing of resources, see Billing overview.
NoteThe ratio of vCPU capacity to memory capacity (in GB) must be set within a range of 1:1 to 1:4.
0.35 vCPUs, 512 MB
Size of Temporary Disk
Specify the size of the disk that is used to temporarily store files based on your business requirements.
Valid values:
512 MB: the default value. You are not charged for using a temporary disk of this size. Function Compute provides you with a free disk space of 512 MB.
10 GB: You are charged based on a disk size of 9.5 GB.
NoteData shares the space of the temporary disk and can be written to all directories in the disk.
The size of the temporary disk is consistent with the lifecycles of underlying instances. After an instance is reclaimed by the system, the corresponding data on the disk is cleared. To persist files, you can use File Storage NAS (NAS) or Object Storage Service (OSS). For more information, see Configure a NAS file system and Configure an OSS file system.
512 MB
Execution Timeout Period
Specify timeout period for execution of the function. The default timeout period is 60 seconds, and the maximum value is 86,400 seconds.
60
Instance Concurrency
NoteThis parameter is required if you select Web Function or Container Images to create a function.
Function Compute supports the instance concurrency feature, which allows an instance to process multiple requests at the same time. The Instance Concurrency parameter specifies the maximum number of requests a function instance can process at the same time. For more information, see Configure instance concurrency.
20
Time Zone
Specify the time zone of the function. After you configure the time zone of the function, the environment variable TZ is automatically added to the function. The value is the time zone that you configure.
UTC
Function Role
Specify the RAM role of the function. Function Compute uses this role to generate a temporary AccessKey pair for accessing your Alibaba Cloud resources and passes the AccessKey pair to your code. For more information, see Grant Function Compute permissions to access other Alibaba Cloud services.
mytestrole
Access to VPC
Specify whether to allow the function to access virtual private cloud (VPC) resources. For more information, see Configure network settings.
Yes
VPC
This parameter is required if you set the Access to VPC parameter to Yes. Create a VPC or select the ID of an existing VPC that you want to access from the drop-down list.
fc.auto.create.vpc.1632317****
vSwitch
Specify the vSwitch. This parameter is required if you set Access to VPC to Yes. Create a vSwitch or select the ID of an existing vSwitch from the drop-down list.
fc.auto.create.vswitch.vpc-bp1p8248****
Security Group
Specify the security group. This parameter is required if you set Access to VPC to Yes. Create a security group or select an existing security group from the drop-down list.
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****
Allow Default NIC to Access Internet
Specify whether to allow the function to access the Internet through the default network interface controller (NIC). If you select No, the function cannot access the Internet through the default NIC of Function Compute.
ImportantIf you use a static public IP address, you must set Allow Default NIC to Access Internet to No. Otherwise, the configured static public IP address does not take effect. For more information, see Configure static public IP addresses.
Yes
Logging
Specifies whether to enable the logging feature. Value description:
Enable: Function execution logs are persistently stored in Simple Log Service for code debugging, fault analysis, and data analysis.
Disable: You cannot use Simple Log Service to store or query function execution logs.
Enable
In the Environment Variables section, configure environment variables of the runtime of the function. For more information, see Configure environment variables.
After the function is created, go to the Function Details page. On the Code tab, you can modify, deploy, and test the function.
Update the function: After the function is created, you can modify its configurations on the Configurations tab based on your business requirements.
Delete the function: You can also delete the function in the function list or on the function details page if you no longer need the function
Configure instance concurrency
Instance concurrency specifies the maximum number of concurrent requests that each function instance can process at the same time. You can use the instance concurrency feature of Function Compute to manage resource usage in an efficient manner during traffic peaks and mitigate the impact of cold starts. This helps improve performance and reduce costs.
Background
Function Compute is billed based on the execution duration of instances. For example, three requests need to be processed at the same time. The processing of each request lasts 10 seconds. The following items describe the execution duration for different concurrency values:
If instance concurrency is set to 1, each instance can process only one request at the same time. Function Compute creates three instances to process the three requests. The total execution duration is 30 seconds.
If instance concurrency is set to 10, each instance can process 10 requests at the same time. Function Compute creates only one instance to process the three requests. The total execution duration is 10 seconds.
By default, instance concurrency of a function is 1, which indicates that each instance can process only one request at the same time. If you set instance concurrency to a value greater than 1, Function Compute creates a new instance only when the number of requests that are concurrently processed by existing instances exceeds the specified value.
The following figure shows the difference in request execution when instance concurrency is set to different values.
Scenarios
If a large amount of time is required for a function to wait for responses from downstream services, we recommend that you use the instance concurrency feature to allow a single instance to concurrently process multiple requests. In most cases, waiting for responses does not consume resources. Concurrent processing of multiple requests by one instance saves costs and improves the responsiveness and throughput of applications.
Benefits
Shorter execution duration and lower costs
For example, for functions that involve a large number of input/output (I/O) operations, you can use a single instance to concurrently process multiple requests. This reduces the number of instances that are used to process requests and reduces the total execution duration of requests.
Status shareable among requests
Multiple requests can share the connection pool of a database in one instance to minimize connections between requests and your database.
Lower frequency of cold starts
One instance can process multiple requests, which reduces the number of new instances and reduces the frequency of cold starts.
Fewer IP addresses used in VPCs
For a fixed number of requests to be processed, the number of required instances is reduced if each instance can process multiple requests. This reduces the number of IP addresses used in VPCs.
ImportantMake sure that the vSwitch associated with your VPC has at least two available IP addresses. Otherwise, the service may be unavailable and requests fail to be executed.
Limits
Item | Limit |
Supported runtimes |
|
Instance concurrency value | 1 to 200 |
Logs in the X-Fc-Log-Result response header | Not supported if instance concurrency is set to a value greater than 1 |
Procedure
You can specify the instance concurrency of a function when you create or update the function.
If you select Web Function to create a function, you can configure the instance concurrency when you create the function.
Provisioned instances can also concurrently process multiple requests. For more information, see Configure provisioned instances.
Impacts
This section compares the instance concurrency of a value of 1 (instance concurrency = 1) and the instance concurrency of a value greater than 1 (instance concurrency > 1).
Billing
The execution duration is different for different instance concurrency values. As a result, costs are different. For more information, see Billing overview.
A single instance with concurrency = 1
An instance can process only one request at a time. The billing duration starts when the first request starts to be processed and ends when the last request is processed.
A single instance with concurrency > 1
An instance can process multiple requests at a time. The actual running duration of the instance is used to measure the function execution duration. The billing duration starts when the first request starts to be processed and ends when the last request is processed.
Concurrency throttling
By default, the maximum number of on-demand instances of Function Compute in a region is 300. The maximum number of requests that can be processed at the same time in a region is 300 × Instance concurrency. For example, if you set instance concurrency to 10, a maximum of 3,000 concurrent requests can be processed at the same time in a region. If the number of concurrent requests exceeds the maximum number of requests that Function Compute can handle, the throttling control error ResourceExhausted is reported.
To increase the upper limit of on-demand instances in a region, contact us.
Logging
If instance concurrency is set to 1, Function Compute returns function logs in the
X-Fc-Log-Result
response header if you specifyX-Fc-Log-Type: Tail
in the HTTP request header when you invoke a function. If instance concurrency is set to a value greater than 1, the response header does not contain function logs because the logs of a specific request cannot be obtained among concurrent requests.For a Node.js runtime,
console.info()
is conventionally used to return logs, which includes request IDs. If instance concurrency is set to a value greater than 1,console.info()
cannot print request IDs as expected. All the request IDs are printed asreq 2
. The following example shows a sample log:2019-11-06T14:23:37.587Z req1 [info] logger begin 2019-11-06T14:23:37.587Z req1 [info] ctxlogger begin 2019-11-06T14:23:37.587Z req2 [info] logger begin 2019-11-06T14:23:37.587Z req2 [info] ctxlogger begin 2019-11-06T14:23:40.587Z req1 [info] ctxlogger end 2019-11-06T14:23:40.587Z req2 [info] ctxlogger end 2019-11-06T14:23:37.587Z req2 [info] logger end 2019-11-06T14:23:37.587Z req2 [info] logger end
In this case, we recommend that you use
context.logger.info()
to print logs. This method allows request IDs to be printed as expected. The following sample code shows an example:exports.handler = (event, context, callback) => { console.info('logger begin'); context.logger.info('ctxlogger begin'); setTimeout(function() { context.logger.info('ctxlogger end'); console.info('logger end'); callback(null, 'hello world'); }, 3000); };
Error handling
When an instance concurrently processes multiple requests, unexpected process quits caused by failed requests affect other concurrent requests. Therefore, you must compile logic to capture request-level exceptions in the function code to prevent impacts on other requests. The following example shows sample code in Node.js:
exports.handler = (event, context, callback) => {
try {
JSON.parse(event);
} catch (ex) {
callback(ex);
}
callback(null, 'hello world');
};
Shared variables
When an instance concurrently processes multiple requests, errors may occur if multiple requests attempt to modify a variable at the same time. You must use mutual exclusion in your code to protect non-thread-safe variables upon modifications. The following example shows sample code in Java:
public class App implements StreamRequestHandler
{
private static int counter = 0;
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
synchronized (this) {
counter = counter + 1;
}
outputStream.write(new String("hello world").getBytes());
}
}
Monitoring metrics
After you set instance concurrency to a value greater than 1, you can see that the number of used instances is reduced in the instance monitoring chart.
Additional information
In addition to the Function Compute console, Function Compute also allows you to use API operations to manage functions. For more information, see Function.
If the function timeout period elapses, see What do I do if the function execution times out and the error "Function time out after" is reported?
If it takes a long time to invoke a function that is not frequently used, see Why do functions that are infrequently used take a longer period of time to invoke? To mitigate the impact of cold starts, you can use provisioned instances. For more information, see How to keep instances alive to eliminate the impact of cold starts?
For more information about how to obtain the Alibaba Cloud Resource Name (ARN) of a function, see Obtain the ARN of a function.