近期手上的一个基于Function Grap(类AWS的Lambda)小项目的改造引发的思考

news2025/6/4 7:08:58

函数式Function是云计算里最近几年流行起来的新的架构和模式,因为它不依赖云主机,非常轻量,按需使用,甚至是免费使用,特别适合哪种数据同步,数据转发,本身不需要保存数据的业务场景,或者通过一个输入转换或者变化,处理以后流转到下一个输出。

我们刚好有这样的业务,云云对接,把一个储能云的数据,经过接口查询以后,转换后保存到我们的私有云平台上(内部是微软提供的IoT平台底座)。

但是在实际开发中发现了有两个痛点,
 触发方式,云厂商一般会提供2个方式,
1.基于事件的调用,比如Python语言的固定式的函数,比如

def handler(event, context)

,函数名和内存占用,网络设置等配置,这里有一个重要的设置就是触发器,

一般最常用的是定时触发器:

当你编写好以后,在云平台上直接点击运行测试,云平台会调用你的这个handler,你也可以通过参数event, context 获取运行时的一些数据。如果是简单任务,只需要在这里调用你的业务代码就开发完成。

一切都很自然,这里的定时器,相当于linux里的cronjob, 最后运行的python ss.py 这样的方式会导致每次启动都会把代码重新执行一遍,但是如果你的业务要求严格的话,希望这个程序运行了以后一直不退出,在程序内部运行Schedule,这样的好处会节省调用方的资源,比如代码需要访问MQ,每隔3分钟程序重新执行的时候,会频繁得创建TCP连接。会给MQ broker的连接创造一定的压力,我刚好遇到了对方投诉我们占用了他们的连接资源。所以我需要改造程序,让程序一直不退出的方式,复用创建好的连接。一共经历了3次优化

  1. 修改代码,创建一个全局的Connection对象,然后在handler里直接写while True的方式执行,发现云平台给的handler函数,有个限制,如果超时没有返回,平台强制终止程序,可以在日志里查看到,程序超时被终止。这条路走不通
  2. 不改架构使用异步,handler里启动一个线程,在线程里while True,后来发现执行一段时间后,效果并不好。
通过Schedule包,顺便说一下,Python竟然没有一个特别强大的定时器,非常不好用,想这样, 

import schedule
schedule.every(3).minutes.do(job1)

需要设置好了以后,还需要 if __name __ =="__main__": 

        schedule.run_pending()

为了防止程序退出还有在主线程里写上while True: time.sleep(5)
 
或者类似这样的代码
import time
import threading

def background_task():
    print("后台任务开始")
    time.sleep(5)  # 模拟长时间任务
    print("后台任务完成")

def handler(event, context):
    print("收到请求")

    def delayed_run():
        time.sleep(0.1)
        background_task()

    thread = threading.Thread(target=delayed_run)
    thread.start()

    # 主线程故意睡一会儿,防止函数提前退出
    time.sleep(6)

    return {"statusCode": 200, "body": "已尝试启动后台任务"}
这样恶心的代码,非常的不优雅。

3. 改动架构,使用彻底异步

  1. 使用redis的发布订阅模式(或者其他MQ),把启动和执行分开。在执行同步的代码里,handler里把连接建立好,就等待redis的消息通知,代码如下:
  2. def handler(event, context):
  3.     localtime = time.asctime(time.localtime(time.time()))
  4.     print(f"execution at {localtime}.")
  5.     startConn()
  6.     start_redis_listener()
  7.     print("??",client)
  8.     return {"statusCode": 200, "isBase64Encoded": False, "headers": {"Content-Type": "application/json;charset=UTF-8"},
  9.             "body": "sucess"}

  10. 这样非常优雅,如下:
  11. def sync_data():
  12.     print("开始执行耗时的数据同步任务...")    
  13.     print(client)  
  14.     try:
  15.         while True:
  16.             time.sleep(5)
  17.             print("开始处理站点列表")
  18.             for conf in configLs:
  19.                 print(f"开始处理站点: {conf.station_name} 数据")
  20.                 site = AccessSite(conf)
  21.                 site.publish_mqtt()
  22.                 # msg = msg + f"{conf.station_name}"
  23.                 print("成功处理站点数据至能源平台!")
  24.     except Exception as e:
  25.         print("同步出错:", str(e))
  26. # Redis 订阅客户端
  27. def start_redis_listener():
  28.    
  29.     pubsub = redisClient.pubsub()
  30.     pubsub.subscribe(["stored_energy_sync_channel"])
  31.     print("等待 Redis 消息...")
  32.     for message in pubsub.listen():
  33.         if message['type'] == 'message':
  34.             print(f"收到消息: {message['data'].decode()}")
  35.             if message['data'].decode() == "start_sync":
  36.                 sync_data()

至于程序何时启动,只需要在另外一个FG里,通过调用redis的pub接口,把这个sync_data()给启动。

非常的完美,容易维护。而第二个版本,使用线程和使用定时器都无法取得满意的效果。

注意这里的redis还可以替换成Kafka, RocketMQ,或者其他通知SMN, SQS。
2. 还有一个方式是基于http或者https的方式启动任务,方式大同小异,都是一次执行完成以后,需要再次触发才能继续执行。如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode的下载与安装(2025亲测有效)

目录 0 前言1 下载2 安装3 后记 0 前言 丫的,谁懂啊,尝试了各种办法不行的话,我就不得不拿出我的最后绝招了,卸载,重新安装,我经常要重新安装,所以自己写了一个博客,给自己&#xf…

千库/六图素材下载工具

—————【下 载 地 址】——————— 【​本章下载一】:https://pan.xunlei.com/s/VORW9TbxC9Lmz8gCynFrgdBzA1?pwdxiut# 【​本章下载二】:https://pan.quark.cn/s/829e2a4085d3 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…

差分S参数-信号与电源完整性分析

差分S参数: 由于差分互连中使用差分信号传递信息,接收器最关心的是差分信号的质量,如果互连通道的S参数能直接反映出对差分信号的影响,对分析问题将方便得多。差分互连通道可以看成是一个四端口网络,激励源为单端信号,…

PostIn V1.1.2版本发布,新增接口评审功能,提升接口质量与合理性

PostIn是一款国产开源免费的接口管理工具,包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块,支持常见的HTTP协议、websocket协议。本周PostIn V1.1.0版本发布,新增接口评审、接口统计功能。 1、版本更新日志 新增 ➢ 接口评审&a…

【论文阅读】User Diverse Preference Modeling by Multimodal Attentive Metric Learning

User Diverse Preference Modeling by Multimodal Attentive Metric Learning 题目翻译:基于多模态注意度量学习的用户不同偏好建模 摘要 提出一个**多模态注意力度量学习(MAML, Multimodal Attentive Metric Learning)**方法,…

【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹: 【计算机网络】传输层UDP协议 🔖流水不争,争的是滔滔不息 一、TCP协议 UDP&…

文件服务端加密—minio配置https

1.安装openssl 建议双击安装包默认安装,安装完成之后配置环境变量 如下图则配置成功: 二、生成自签名CA证书及私钥 1、生成私钥 openssl genrsa -out private.key 20482、生成自签名证书 (1)编写openssl.conf文件,…

界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现自定义遥测?

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 .NET As…

多卡训练核心技术详解

多卡训练核心技术详解 多卡训练 主要围绕分布式环境初始化、模型并行化、数据分片和梯度同步展开。下面结合您的代码,详细解释这些核心部分: 并行执行命令 torchrun --nproc_per_node=5 TokenLossMulCard.py 1. 分布式环境初始化 def init_distributed():init_process_…

深度学习全面掌握指南

一、引言 深度学习是机器学习的一个分支,它通过构建多层神经网络来模拟人类大脑的信息处理方式,从而实现对复杂数据的自动特征提取和模式识别。近年来,深度学习在计算机视觉、自然语言处理、语音识别等领域取得了巨大的突破,引发…

magic-api配置Git插件教程

一、配置gitee.com 1,生成rsa密钥,在你的电脑右键使用管理员身份运行(命令提示符),执行下面命令 ssh-keygen -t rsa -b 2048 -m PEM一直按回车键,不需要输入内容 找到 你电脑中的~/.ssh/id_rsa.pub 文件…

【AI赋能,视界升级】智微智能S134 AI OPS,重构智慧大屏未来

智慧教室中,教师通过电子白板,4K高清课件、3D教学模型同步呈现,后排学生也能看清画面细节,课堂变得趣味十足;智能会议室里,会议内容、多人云会议多屏投放依旧畅通清晰,会议纪要自动生成Word/PPT…

外网访问可视化工具 Grafana (Linux版本)

Grafana 是一款强大的可视化监控指标的展示工具,可以将不同的数据源数据以图形化的方式展示,不仅通用而且非常美观。它支持多种数据源,如 prometheus 等,也可以通过插件和 API 进行扩展以满足各种需求。 本文将详细介绍如何在本地…

Kafka性能调优三剑客:深度解析buffer_memory、linger_ms和batch_size

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…

5分钟学会网络服务搭建,飞凌i.MX9352 + Linux 6.1实战示例

在“万物互联”的技术浪潮下,网络服务已成为连接物理世界与数字世界的核心纽带,它不仅赋予了终端设备“开口说话”的能力,更构建了智能设备的开发范式。 本文就将以飞凌嵌入式OK-MX9352-C开发板(搭载了在工业物联网领域广泛应用的…

网络安全-等级保护(等保) 3-2-2 GB/T 28449-2019 第7章 现场测评活动/第8章 报告编制活动

################################################################################ GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》是规定了等级测评过程,是纵向的流程,包括:四个基本测评活动:测评准备活动、方案编制活…

从Node.js到Go:如何从NestJS丝滑切换并爱上Sponge框架

引言 各位 NestJS 老司机们, 不得不说,用装饰器开发 API 简直像在键盘上跳华尔兹——Controller 转个圈,Get 踮个脚,Injectable 优雅谢幕,三下五除二就能搭出个像模像样的后端服务。TypeScript 的类型检查就像个贴心管…

海思 35XX MIPI读取YUV422

1.项目背景: 使用海思芯片,接收FPGA发送的MIPI数据,不需要ISP处理,YUV图像格式为YUV422。 2.移植MIPI驱动 修改IMX347的驱动远吗,将I2C读写的部分注释,其他的不用再做修改。 int imx347_slave_i2c_init(ot…

第1章 Redis 概述

一、Redis 简介 Redis,Remote Dictionary Server,远程字典服务,由意大利人Salvatore Sanfilippo(又名Antirez)开发,是一个使用ANSI C 语言编写、支持网络、 可基于内存亦可持久化的日志型、NoSQL 开源内存数据库,其提供多种语言的API&#xff61…

硬件工程师笔记——二极管Multisim电路仿真实验汇总

目录 1 二极管基础知识 1.1 工作原理 1.2 二极管的结构 1.3 PN结的形成 1.4 二极管的工作原理详解 正向偏置 反向偏置 multisim使用说明链接 2 二极管特性实验 2.1 二极管加正向电压 2.2 二极管加反向电压 2.3 二极管两端的电阻 2.4 交流电下二级管工作 2.5 二极…