云服务器内容精选

  • 单实例单并发与单实例多并发的对比 当一个函数执行需要花费5秒,若配置为单实例单并发,三次函数调用请求分别在三个函数实例执行,总执行时长为15秒。 若配置为单实例多并发,设置单实例并发数为5,即单个实例最多支持5个并发请求,如果有三次函数调用请求,将在一个实例内并发处理,总执行时间为5秒。 单实例并发数大于1,在您设置的“单函数最大实例数”范围内,超过单实例并发处理能力时会自动扩容新实例。 表1 单并发与多并发对比 对比项 单实例单并发 单实例多并发 日志打印 - Node.js Runtime使用console.info()函数,Python Runtime使用print()函数,Java Runtime使用System.out.println()函数打印日志,该方式会把当前请求的Request ID包含在日志内容中。当多请求在同一个实例并发处理时,当前请求可能有很多个,继续使用这些函数打印日志会导致Request ID错乱。此时应该使用context.getLogger(),获取一个日志输出对象,通过这个日志输出对象打印日志,例如Python Runtime: log = context.getLogger() log.info("test") 共享变量 不涉及 单实例多并发处理时,修改共享变量会导致错误。这要求您在编写函数时,对于非线程安全的变量修改要进行互斥保护。 监控指标 按实际情况进行监控。 相同负载下,函数的实例数明显减少。 流控错误 不涉及 太多请求时,body中的errorcode为“FSS.0429” ,响应头中的status为429 ,错误信息提示:Your request has been controlled by overload sdk, please retry later。
  • 应用场景 单实例多并发适合函数处理逻辑中有较长时间等待下游服务响应的场景,也适合函数逻辑中初始化时间较长的场景,具备以下优势: 降低冷启动概率,优化函数处理时延:例如并发三个请求,不配置单实例多并发,FunctionGraph默认启动三个实例处理请求,会有三次冷启动。若配置了单实例支持三并发,三个并发请求,FunctionGraph只启动一个实例处理请求,减少了两次冷启动。 减少总请求处理时长,节省费用:单实例单并发下,多个请求的总处理时长为每个请求的处理时长相加。单实例多并发下,同一个实例对并发的多个请求的计费时间为,从第一个请求开始处理计时,到最后一个并发的请求处理结束记一次时长费用。
  • 网络限制 根据对网络的不同设置,函数有以下网络访问能力,您可按需设置。 网络配置 说明 允许函数访问公网 当前函数默认的公网NAT访问带宽在多个租户间共享,带宽小,仅适合小量调用的测试业务场景使用;如果对带宽、性能、可靠性有高要求的生产业务场景,需开启函数访问VPC,在VPC内添加公网NAT网关并绑定EIP,分配独占的外网访问带宽。 允许函数访问VPC内资源 开启“允许函数访问VPC内资源”时,函数将禁用默认网卡并使用VPC绑定的网卡,是否允许公网访问由配置的VPC决定,开关“允许函数访问公网”将不生效。 仅允许指定的VPC调用函数 开启“仅允许指定的VPC调用函数”时,将仅允许通过指定的VPC调用函数,并禁止通过公网调用函数。
  • 示例 请求url路径 如下图所示,请求url路径中参数“test”的值为二元加法运算函数,函数中的参数A、B均为“1000”。 请求头 如下图所示,请求头中参数“add”的值为二元加法运算函数,函数中的参数A为二元减法运算“$subtract(1001,1000)”、参数B为“-1”。 检查点属性 如下图所示,检查点属性“result”的目标值为二元加法运算函数,函数中的参数A为局部参数“test”,参数B为“1”。局部参数的设置方式请参考局部参数。 if判断 如下图所示,if判断的目标值为二元加法运算函数,函数中的参数A为数字“1”,参数B为环境变量“status”。环境参数的设置方式请参考设置环境参数。 for循环中断条件 如下图所示,for循环中断条件的目标值为二元加法运算函数,函数中的参数A、B均为“1000”。
  • DriverClient::syncSubDevices 发送子设备同步请求事件。 函数描述 public void syncSubDevices(String eventId, SyncSubDevicesEvent syncSubDevicesEvent) throws IllegalArgumentException, JsonException 表9 参数说明 参数名称 类型 参数描述 eventId String 事件ID syncSubDevicesEvent SyncSubDevicesEvent 同步子设备请求事件
  • DriverClient::updateSubDevicesStatus 发送更新子设备状态事件。 函数描述 public void updateSubDevicesStatus(String eventId, UpdateSubDevicesStatusEvent statusEvent) throws JsonException 表10 参数说明 参数名称 类型 参数描述 eventId String 事件ID statusEvent UpdateSubDevicesStatusEvent 更新子设备状态事件
  • DriverClient::getProducts 发送获取产品事件。 函数描述 public void getProducts(String eventId, GetProductsEvent getProductsEvent) throws IllegalArgumentException, JsonException 表11 参数说明 参数名称 类型 参数描述 eventId String 事件ID getProductsEvent GetProductsEvent 获取产品事件
  • DriverClient::reportScanResult 上报子设备扫描结果。 函数描述 public void reportScanResult(String eventId, ScanResultEvent scanResultEvent) throws JsonException 表12 参数说明 参数名称 类型 参数描述 eventId String 事件ID scanResultEvent ScanResultEvent 子设备扫描结果事件
  • DriverClient::reportSubDevicesPropertiesAndDiscovery 上报子设备发现属性。 函数描述 public void reportSubDevicesPropertiesAndDiscovery(SubDevicesDiscoveryPropsReport report) 表8 参数说明 参数名称 类型 参数描述 report SubDevicesDiscoveryPropsReport 子设备发现属性数据消息体
  • DriverClient::getDeviceShadow 获取设备影子。 函数描述 public void getDeviceShadow(String requestId, ShadowGet shadowGet) throws IllegalArgumentException, JsonException 表6 参数说明 参数名称 类型 参数描述 requestId String 请求ID shadowGet ShadowGet 应获取请求
  • 日志告警 如果没有对函数代码执行返回结果有特定要求,例如绑定了APIG触发器的事件函数需要返回一个APIG响应格式的结果如下: import json def handler (event, context): return { "statusCode": 200, "isBase64Encoded": False, "body": json.dumps(event), "headers": { "Content-Type": "application/json" } } 一般不建议在函数代码内捕获异常,其会导致创建的错误次数告警配置不生效。但是FunctionGraph实现了与云日志服务(LTS)的对接,支持在LTS服务中配置告警,LTS支持日志告警实时监控函数日志中出现的异常信息。 父主题: 使用函数访问Redis数据库
  • UDTF(User Defined Timeseries Generating Function) 编写一个UDTF需要继承“org.apache.iotdb.db.query.udf.api.UDTF”类,并至少实现“beforeStart”方法和一种“transform”方法。 表2是所有可供用户实现的接口说明。 表2 接口说明 接口定义 描述 是否必须 void validate(UDFParameterValidator validator) throws Exception 在初始化方法“beforeStart”调用前执行,用于检测“UDFParameters”中用户输入的参数是否合法。 否 void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception 初始化方法,在UDTF处理输入数据前,调用用户自定义的初始化行为。用户每执行一次UDTF查询,框架就会构造一个新的UDF类实例,该方法在每个UDF类实例被初始化时调用一次。在每一个UDF类实例的生命周期内,该方法只会被调用一次。 是 void transform(Row row, PointCollector collector) throws Exception 该方法由框架调用。当在“beforeStart”中选择以“RowByRowAccessStrategy”的策略消费原始数据时,这个数据处理方法就会被调用。输入参数以“Row”的形式传入,输出结果通过“PointCollector”输出。需要在该方法内自行调用“collector”提供的数据收集方法,以决定最终的输出数据。 与“transform(RowWindow rowWindow, PointCollector collector) ”方法二选一 void transform(RowWindow rowWindow, PointCollector collector) throws Exception 该方法由框架调用。当在“beforeStart”中选择以“SlidingSizeWindowAccessStrategy”或者“SlidingTimeWindowAccessStrategy”的策略消费原始数据时,这个数据处理方法就会被调用。输入参数以“RowWindow”的形式传入,输出结果通过“PointCollector”输出。需要在该方法内自行调用“collector”提供的数据收集方法,以决定最终的输出数据。 与“transform(Row row, PointCollector collector)”方法二选一 void terminate(PointCollector collector) throws Exception 该方法由框架调用。该方法会在所有的“transform”调用执行完成后,在“beforeDestory”方法执行前被调用。在一个UDF查询过程中,该方法会且只会调用一次。需要在该方法内自行调用“collector”提供的数据收集方法,以决定最终的输出数据。 否 void beforeDestroy() UDTF的结束方法。此方法由框架调用,并且只会被调用一次,即在处理完最后一条记录之后被调用。 否 调用顺序: void validate(UDFParameterValidator validator) throws Exception void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception void transform(Row row, PointCollector collector) throws Exception或者void transform(RowWindow rowWindow, PointCollector collector) throws Exception void terminate(PointCollector collector) throws Exception void beforeDestroy() 框架每执行一次UDTF查询,都会构造一个全新的UDF类实例,查询结束时,对应的UDF类实例即被销毁,因此不同UDTF查询(即使是在同一个SQL语句中)UDF类实例内部的数据都是隔离的。用户可以放心地在UDTF中维护一些状态数据,无需考虑并发对UDF类实例内部状态数据的影响。 使用方法: void validate(UDFParameterValidator validator) throws Exception “validate”方法能够对用户输入的参数进行验证。 在该方法中限制输入序列的数量和类型,检查用户输入的属性或者进行自定义逻辑的验证。 void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception “beforeStart”方法有以下作用: 帮助用户解析SQL语句中的UDF参数。 配置UDF运行时必要的信息,即指定UDF访问原始数据时采取的策略和输出结果序列的类型。 创建资源,比如建立外部链接,打开文件等。
  • UDFParameters UDFParameters的作用是解析SQL语句中的UDF参数(SQL中UDF函数名称后括号中的部分)。参数包括路径(及其序列类型)参数和字符串“key-value”对形式输入的属性参数。 例如: SELECT UDF(s1, s2, 'key1'='iotdb', 'key2'='123.45') FROM root.sg.d; 用法: void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception { // parameters for (PartialPath path : parameters.getPaths()) { TSDataType dataType = parameters.getDataType(path); // do something } String stringValue = parameters.getString("key1"); // iotdb Float floatValue = parameters.getFloat("key2"); // 123.45 Double doubleValue = parameters.getDouble("key3"); // null int intValue = parameters.getIntOrDefault("key4", 678); // 678 // do something // configurations // ... }
  • Data Size parse_presto_data_size函数支持以下单位: 单位 描述 值 B Bytes 1 kB Kilobytes 1024 MB Megabytes 10242 GB Gigabytes 10243 TB Terabytes 10244 PB Petabytes 10245 EB Exabytes 10246 ZB Zettabytes 10247 YB Yottabytes 10248 parse_presto_data_size(string) → decimal(38) 将带单位的格式化的值转为数字,值可以是小数,如下所示: SELECT parse_presto_data_size('1B'); -- 1 SELECT parse_presto_data_size('1kB'); -- 1024 SELECT parse_presto_data_size('1MB'); -- 1048576 SELECT parse_presto_data_size('2.3MB'); -- 2411724
  • cast转换函数 HetuEngine会将数字和字符值隐式转换成正确的类型。HetuEngine不会把字符和数字类型相互转换。例如,一个查询期望得到一个varchar类型的值,HetuEngine不会自动将bigint类型的值转换为varchar类型。 如果有必要,可以将值显式转换为指定类型。 cast(value AS type) → type 显式转换一个值的类型。可以将varchar类型的值转为数字类型,反过来转换也可以。 select cast('186' as int ); select cast(186 as varchar); try_cast(value AS type) → type 与cast()相似,区别是转换失败返回null。 select try_cast(1860 as tinyint); _col0 ------- NULL (1 row) 当出现数字溢出,null值转换等情况,会返回NULL,但无法转换的情况,还是会报错。 例如:select try_cast(186 as date); Cannot cast integer to date