高密度部署,基于动态库的尝试,rust动态调库

news2024/9/24 3:21:47

目录

    • 前言
    • faas特点
    • 方案
    • 思考
    • 实践
      • 制作动态库
      • 调用动态库
    • 尾语

前言

 最近在搞faas平台,也试了各大云厂商的产品,效果都不是很理想。和我心目中的faas想去甚远。
 和小伙伴们吹完牛逼,心有所感,写下这篇文章,时间跨度较长,故事的结局可以直接看尾语。

faas特点

 faas最突出的特点只有两个,方便快捷低成本

 方便快捷是开发者使用faas最大的原因。faas平台能够提供全套的底层服务,包括日志,流量,监控,测试集成,各种触发方式,各种语言支持,云编辑器,开发框架等等。作为开发者,理想的faas状态是,写好了业务代码发个版就用。

 低成本是对开发者和平台供应商是双向的。使用faas的开发者一般都不会开发非常复杂的东西,换而言之就是要省成本,省钱。用的时候花钱,不用的时候0成本。对于平台提供商而言,每一个提供出来的函数服务都要足够省成本,资源利用率要足够合理。faas是可以按照请求收费的,如果成本不够低,平台商就要赔出裤衩子。最理想的状态下,faas可以将实例缩成0,不消耗任何资源。

方案

 基于物理机或k8s,这种很好理解。将每个函数做成一个pod跑起来就行。阿里云用的就是这种方法。将函数放到ECS里执行。不好的地方是代价高昂,而且冷启动巨慢,根据官方的数据,最快启动也要在300ms以上。所以实际生产上不可能将实例缩成0

 基于KVM虚拟化技术,已知AWS用的这种方法,其底层框架就是rust写的Firecracker。个人感觉这种还不如docker。如果docker是按秒启动,它就得按照分钟启动。不过隔离性到是很好,技术也很成熟。

 基于wasm(WebAssembly),这种是底层有个Wasm Runtime,它能够将各种语言编好的特定二进制包运行起来,启动速度在毫秒级。这种方式还不太成熟,就算是其中最优秀的的wasmtime(bytecodealliance的作品)框架,也仅仅支持少数语言。据说字节有用这种方法,"强如死月"就在字节搞这种东西,在火山引擎上感受了一把,嗯~ 好像闻不对味。

思考

 如果说wasm还不成熟,那为啥不用动态库的方法那,动态库发展折磨多年,技术早就成熟的一匹,各种稀奇古怪的语言都支持。而且可以把动态库做成热加载模式。类似wasm,让函数和服务分离,在需要的时候再加载进来。
我们整体构想如下。
在这里插入图片描述

  • 事件:一次对函数的调用称之为事件,可以是http请求,mq消息,定时器等等。各种Faas几乎都是事件驱动,是一种很好的抽象和设计。
  • xxx trigger 产生事件的各种触发器。
  • Function Manager: 用来管理各种语言编写的动态库。
  • Fuction Pool:函数运行池,里面运行多个DLL Runtime,并根据策略进行调度。图上只画了三个动态库运行时,实际生产中会复杂的多,比如会先对资源分组,再将DLL Runtime运行在对应的分组中。faas毕竟也是平台级产品,这里也需要提供多租户的支持。
  • DLL Runtime:动态库运行时,负责加载和执行动态库。当DLL Runtime被启动时,是不加载任何动态库的。当事件被路由过来时,再从Function Manager中加载动态库。并且根据一定策略,比如三分钟内没有事件过来,就会将对应动态库从运行时中卸载。真正做到了0资源消耗,不占有cpu 内存 网络。。。
    • 思考:有的时候我们用faas不光需要运行一段逻辑,也需要外部文件,比如配置文件,各种库文件。所以这里考虑,将动态库和其他所需文件直接通过文件挂载到DLL Runtime的目录中,比如通过NFS,Ceph,或者各种云厂商的云存储。而Function Manager只用来处理动态库的管理逻辑。
  • Event SLE 事件分发器:会将得到的事件路由到对应的DLL Runtime中。
  • 资源监视器:负责监控DLL Runtime的资源使用情况,并根据策略增加或者减少DLL Runtime。比如设置CPU 60%使用率,当检测CPU使用率高于60后,会启动新的DLL Runtime到Function Pool中。

实践

关说不练假把式,下面来动手实操一下。

制作动态库

用任何语言制作一个标准C接口的动态库。
当然也可以用我这个现成的。
https://github.com/woshihaoren4/wd_passport/tree/main/cdylib
这个库是用rust写的,用来做鉴权和认证用的。特点是证书内敛,且定期自动升级。可以把公钥分发出去做分布式验证。
主要封了两个标准C的接口一个是签名,一个是验证。用c语言写大概就是这种

int sign(char* data,long timestamp,char * sign) // 用于签名 并将签名串写到入参sign中

int verify(cahr * data, char * sign,long timestamp) //验证 返回0表示成功 其他则失败

我本人用的mac所以,使用.dylib结尾的文件。其他系统所需动态库 需要跨平台编译,我这里质变仪了.so的。并附上该包跨平台编译方法。

//查看rust支持的平台
rustc --print target-list

//下载平台支持库,这里加一个linux的musl编译支持
rustup target add x86_64-unknown-linux-musl

//因为上面用的musl编译,所以需要安装musl
brew install FiloSottile/musl-cross/musl-cross

//在项目的cargo.toml文件中,设置编译目标 参考:https://doc.rust-lang.org/reference/linkage.html?highlight=crate-type#linkage
//staticlib:静态库 cdylib:c标准动态库
[lib]
name = "lib_name"
crate-type = ["staticlib", "cdylib"]

//编译
cargo build --target x86_64-unknown-linux-musl

//如果报错 找不到musl-gcc 则执行如下命令
ln -s /usr/local/bin/x86_64-linux-musl-gcc /usr/local/bin/musl-gcc

调用动态库

这里使用libloading库动态加载动态库
将上面编译好的库放到下面的代码中执行。
完整代码

use std::ffi::{c_longlong, CString};
use std::os::raw::{c_char, c_int};

fn main() {
    let start = std::time::Instant::now();
    let result = call_dynamic().expect("运行出错");
    let use_time = start.elapsed();
    println!("success :{} 总用时:{}毫秒", result, use_time.as_millis());
}

fn call_dynamic() -> Result<u32, Box<dyn std::error::Error>> {
    unsafe {
        let start = std::time::Instant::now();
        let lib = libloading::Library::new("./src/libwd_passport.dylib")?;
        let sign_func: libloading::Symbol<
            unsafe extern "C" fn(
                data: *const c_char,
                timestamp: c_longlong,
                sign: *const c_char,
            ) -> c_int,
        > = lib.get(b"sign")?;
        let verify_func: libloading::Symbol<
            unsafe extern "C" fn(
                data: *const c_char,
                sign: *const c_char,
                timestamp: c_longlong,
            ) -> c_int,
        > = lib.get(b"verify")?;
        let use_time = start.elapsed();
        println!("启动用时:{}微秒", use_time.as_micros());

        let start = std::time::Instant::now();
        let data = CString::from_vec_unchecked(Vec::from("hello world"));
        let sign = CString::from_vec_unchecked(vec![1; 128]);
        let result = sign_func(data.as_ptr(), 1866248975, sign.as_ptr());
        assert_eq!(result,0,"签名失败");
        let use_time = start.elapsed();
        println!("签名用时:{}微秒", use_time.as_micros());

        let start = std::time::Instant::now();
        let result = verify_func(data.as_ptr(), sign.as_ptr(), 1866248975);
        assert_eq!(result,0,"验签失败");
        let use_time = start.elapsed();
        println!("验证用时:{}微秒", use_time.as_micros());

        return Ok(0);
    }
}

运行结果:
在这里插入图片描述
这里可以看到,启动时间在亚毫秒级。因为代码中是从文件中加载,文件加载和读取是需要花费一定时间的,当多次运行测试代码后,会发现启动时间小于毫秒,因为系统会缓存文件。
签名用时较久是因为第一次会初始化一些配置。如果将代码中的单次签名改成多次,会发现签名用时大概在2毫秒左右。动态库用的是rsa sha256算法。

尾语

高密度部署一直是faas比较头疼的事,动态库方法固然能够极大降低资源成本,但是会让开发变得即为复杂。
领导评估这个方案直接就是不通过,理由是开发周期过长,不能快速上线。
最终方案还是用k8s,套个壳就叫faas了。嗯~ 这很具有z国特色。

截止到我写下这篇博文23年2月份,项目开发了6个月了。实际上两个月的时候我们就开发完了,三个月的时候上线了第一版。截止目前,项目组辞掉了外包,遣散了其他部门借调的人(包括我),只留下大猫两三只继续开发。

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

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

相关文章

「AI人工智能」Node.js如何接入OpenAI开发

文章目录前言一、创建OpenAI账号二、安装axios 库三、导入 axios 库四、调用 OpenAI API五、测试 OpenAI API前言 本文主要介绍如何将 Node.js 应用程序与 OpenAI 集成&#xff0c;可以使用 OpenAI API。 一、创建OpenAI账号 创建一个 OpenAI 帐户并注册 API 密钥。你可以在 …

Linux系统一键检测和加固脚本

主要是为了Linux系统的安全&#xff0c;通过脚本对Linux系统进行一键检测和一键加固。 Check_Script #包含2个文件 CentOS_Check_Script.sh README.txt 操作说明 #执行CentOS-Check_Script.sh脚本文件进行检查,命令格式如下 sudo sh CentOS_Check_Script.sh | tee check_da…

Spring Boot 2.x系列【28】应用篇之JAVA执行服务器操作命令

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本2.7.0 文章目录前言本地服务器远程服务器前言 在某些实际开发场景中&#xff0c;我们需要调用JAVA程序去执行一些服务器操作命令&#xff0c;比如&#xff1a; 获取服务器的CPU…

牛逼的不停服定位线上问题-arthas

​ Hello&#xff0c;大家好我是你们可爱的小花。 前言 你是不是为了生产环境问题&#xff0c;无法定位、无法中断、无法解决 项目无故异常&#xff0c;日志无报错、报错不够明确 测试环境无法复现、生产环境问题偶发 但重启项目后问题消失&#xff0c;无法给领导一个答复而苦…

ChatGPT冷观察:没有大模型的土壤,开不出ChatBot的花

文|智能相对论作者|叶远风谁在跟风&#xff0c;谁又有真本事能做出中国版的对标产品来&#xff1f;这恐怕是ChatGPT这股热潮以来&#xff0c;关心中国AI发展的业界人士最想问的问题。或者说&#xff0c;在中国人工智能不落后于全世界的当下&#xff0c;业界也在普遍渴望一个真正…

AWS Directory Service

Hello大家好&#xff0c;我们接下来讨论AWS Directory Service&#xff0c;AWS目录服务的内容。 什么是微软活动目录&#xff08;AD&#xff09; 在认证考试中有很多的考点是关于微软AD部分的&#xff0c;也就是微软活动目录以及AWS活动目录服务—AWS Directory Service的内容…

PowerShell Install Mysql 8

MySQL介绍 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 mysql download Mysql Serverdownload创建一键安装Mysql 8自动化脚本 Expand-Archive #解压文件Start-P…

【我有一个梦想:帮你实现你的梦想】

很多人都曾有过这样的经历&#xff0c;某天突然对某个东西产生了兴趣&#xff0c;于是兴致勃勃的开始在网上各种搜&#xff0c;各种查&#xff0c;去各大论坛到处看到处问&#xff0c;在网上搜集很多免费的电子书&#xff0c;看了很多视频&#xff0c;最后忙活了一阵子&#xf…

若依框架如何新增自定义主题风格

若依框架新增主题风格1.实现结果2.实现步骤2.1Settings目录下2.2 variables.scss2.3 sidebar.scss2.4 Logo.vue2.5 Siderbar目录下的index.vue1.实现结果 2.实现步骤 需要改动的文件目录&#xff1a; 2.1Settings目录下 <div class"setting-drawer-block-checbox-it…

DBeaver:开源、跨平台、强大的数据库管理工具

文章目录一、简介1.DBeaver 是什么2.DBeaver 的功能3.DBeaver 的优点二、安装与配置1.系统要求2.下载与安装3.连接数据库三、总结一、简介 1.DBeaver 是什么 DBeaver 是一个流行的开源数据库客户端&#xff0c;它可以用于连接和管理多种不同类型的数据库系统&#xff0c;包括…

什么是STAR原则?

文章目录&#x1f4cb;前言&#x1f525;省流版&#x1f3af;什么是STAR原则&#x1f3af;进行过程&#x1f4cb;前言 对于大部分还在学习阶段的学生们来说&#xff0c;可能并不了解这个原则的含义&#xff0c;这里的star并不是指英文单词星星。这个原则我也是前段时间才认识到…

CS224W课程学习笔记(二):网络图的特征说明和指标实战

引言 在第二三节课中&#xff0c;主要研究的是四个关键网络属性以表征图形&#xff1a;度分布&#xff0c;路径长度&#xff0c;聚类系数和连接组件 。 这些定义主要是针对无向图的&#xff0c;而由于上一节中已经介绍了度分布&#xff0c;以及相应公式和例题&#xff0c;关于…

刚性电路板的特点及与柔性电路板的区别

打开市场上的任何一个电子产品&#xff0c;会发现里面都有一块或多块电路板。电路板是电子产品运行的核心&#xff0c;之前沐渥小编已经给大家介绍了柔性电路板&#xff0c;下面给大家介绍刚性电路板的基础知识。 刚性电路板俗称硬板&#xff0c;是由不容易变形的刚性基材制成的…

MASA Stack 1.0 发布会 —— 社区问题解答

MASA Stack 1.0 圆桌讨论 Q1&#xff1a; 全职开源的团队&#xff0c;你们的收入是什么&#xff1f; 1.首先感谢我们的金主朗诗德公司&#xff0c;朗诗德是一家大型的净水器研发、生产、销售的公司&#xff0c;我们的产品也在朗诗德公司进行了大量的落地验证&#xff0c;再次…

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

一、基本数据类型 1.数字 由于Kotlin支持类型推断&#xff0c;所以在使用时若超出Int的范围则会被认定为其它类型&#xff1b;若需要显式指定Long型值&#xff0c;则需要在值后添加L后缀。 2.浮点数 3.比较两个数&#xff08; 和 &#xff09; Kotlin 中没有基础数据类型&a…

C语言(输出scanf()函数)

一.概念带入 scanf()把输入的字符串转换成整数&#xff0c;浮点数&#xff0c;字符或字符串。而printf()正好与其相反&#xff0c;把整数&#xff0c;浮点数&#xff0c;字符和字符串转换成显示在屏幕上的文本。所以scanf&#xff08;&#xff09;在使用上面会和printf有很多一…

实验十四、共源放大电路的频率响应

一、题目 利用 Multisim 从下列两个方面研究图1所示电路的频率响应。图1共源放大电路图1\,\,共源放大电路图1共源放大电路&#xff08;1&#xff09;为改善低频特性&#xff0c;应增大三个耦合电容中的哪一个最有效。 &#xff08;2&#xff09;场效应管的漏极静态电流对上限频…

审批流、工作流、业务流

是业务流、工作流、审批流 业务流&#xff1a;即业务流程&#xff0c;指为了完成某项业务而进行的各种工作的有序组合 工作流&#xff1a;即工作流程&#xff0c;指为了完成某项工作而进行的各种动作的有序组合 审批流&#xff1a;即审批流程&#xff0c;是对某项工作的审批活动…

记录一次服务器被攻击的经历

突然收到阿里云发过来的异常登陆的信息&#xff1a; 于是&#xff0c;急忙打开电脑查看对应的ECS服务器的记录&#xff1a; 发现服务器的cpu占用率异常飙升&#xff0c;所以可以大概断定服务器已经被非法入侵了。 通过自己的账号登陆后&#xff0c;发现sshd服务有异常的链接存…

TensorRT的命令行程序

TensorRT的命令行程序 文章目录TensorRT的命令行程序A.3.1. trtexecA.3.1.1. Benchmarking NetworkA.3.1.2. Serialized Engine GenerationA.3.1.3. trtexecA.3.1.4. 常用的命令行标志点击此处加入NVIDIA开发者计划 A.3.1. trtexec 示例目录中包含一个名为trtexec的命令行包装…