Tencent Serverless Cloud Function Custom Runtime permite dezvoltatorilor să scrie funcții fără server în orice limbaj de programare.

În acest articol, argumentăm funcțiile fără server în Rust și WebAssembly și demonstrăm utilizarea lor în învățarea și vizualizarea automată.

Veți învăța cum să creați o funcție simplă pentru învățarea automată și să implementați un site web fără server în jurul său, gratuit (cu excepția cazului în care un milion de oameni îl folosesc!).

În primul rând, ce este Tencent?

Tencent este cea mai mare companie de internet din afara SUA, cu peste un miliard de utilizatori activi zilnic. Brațul său de cloud computing, Norul Tencent, este clasat printre primii 5 furnizori de cloud din lume după cota de piață.

Dacă doriți să ajungeți pe piața mondială cu serviciile dvs. cloud, Tencent Cloud ar trebui să fie aproape de partea de sus a listei dvs.

Tencent Cloud este, de asemenea, un inovator de frunte în computere fără server, cu oferte puternice variind de la funcțiile de funcționare ca serviciu (FaaS), declanșatoare, conectori și instrumente pentru dezvoltatori.

Tencent Serverless Cloud Functions (SCF) acceptă deja peste 10 limbaje de programare și cadre de execuție. Dar recent lansat SCF Custom Runtime a făcut un alt pas înainte. SCF poate suporta acum funcții scrise în orice limbaj de programare.

În acest articol, voi prezenta cum să rulați funcțiile WebAssembly, scrise în Rust, în SCF.

Ce vom aborda în acest articol

Mai întâi vom trece peste conceptele de bază. Apoi, vom examina un exemplu complet, dar simplu, Hello World, pentru a implementa prima funcție fără server WebAssembly.

În cele din urmă, vom face ceva util cu o mașină care câștigă ca serviciu (MLaaS), care ia date și returnează modelul adaptat și vizualizarea în format SVG.

Iată aplicația finală veți crea până la sfârșitul acestui tutorial. Este complet „fără server” și implică costuri atunci când oamenii îl folosesc.

UI HTML și JavaScript pot fi găzduite pe orice computer, inclusiv laptopul dvs. și în funcția backend pentru a efectua învățarea automată și desenarea SVG este pe Tencent Cloud Serverless.

De ce WebAssembly și Rust

Funcțiile tradiționale fără server se bazează pe cadre grele. Dezvoltatorii trebuie să scrie funcții în cadrul de aplicație specific, cum ar fi JavaScript în Node.js sau Python Boto și așa mai departe.

Tencent Cloud SCF Custom Runtime rupe această matriță și permite dezvoltatorilor să scrie funcții fără server în orice limbă.

Pentru a demonstra acest punct, acesta oferă exemple pentru a Funcție bazată pe scripturi Bash, A Funcție TypeScript bazată pe Deno, și a Funcție binară nativă bazată pe rugină. Aceasta ne permite să creăm și să implementăm funcții fără server bazate pe WebAssembly pe Tencent Cloud.

De ce vrem să facem asta? Aici sunt unele motive.

  • WebAssembly este conceput pentru performanță. Funcțiile WebAssembly ar putea fi de 10 ori mai rapide decât programele comparabile scrise în JavaScript sau Python.
  • Funcțiile WebAssembly sunt portabile. Deși este posibil să rulați binare native pe SCF Custom Runtime, aceste binare trebuie compilate în mediul exact al sistemului de operare pentru Custom Runtime. În prezent este CentOS 7.6 pe procesoare X86 și se poate schimba ulterior. Funcțiile WebAssembly sunt portabile și foarte ușor de implementat și gestionat așa cum vom vedea.
  • Funcțiile WebAssembly sunt sigure. Se știe că, chiar și cu Docker, aplicațiile binare native ar putea încălca containerul. Deoarece aplicația dvs. depinde probabil de multe biblioteci terțe, riscul pentru codul necinstit în dependențele dvs. este real. WebAssembly, cu model de securitate bazat pe capacități, oferă o protecție mai bună în timp de rulare pentru codul dvs.
  • În timp ce WebAssembly este agnostic pentru limbajele de programare, Rust, AssemblyScript (un subset de TypeScript), C / C ++ și Go sunt printre cele mai bune limbaje pentru scrierea funcțiilor WebAssembly. În special, Rust este un limbaj de programare popular și în creștere rapidă, cu o comunitate pasionată. Ne permite să scriem funcții extrem de eficiente, dar sigure pentru memorie.

În cele din urmă, programarea și implementarea funcțiilor WebAssembly pe Tencent Cloud este de fapt destul de ușoară. Puteți face în ea o oră. Să începem.

Condiții prealabile

Mai întâi, înscrieți-vă pentru un Cont Tencent Cloud. Pentru majoritatea proiectelor personale și de dezvoltare, probabil că puteți rămâne în cadrul acestuia nivel gratuit de serviciu.

Apoi, pe computerul de dezvoltare local sau pe containerul Docker, asigurați-vă că aveți Rust și ssvmup toolchain instalat. Lanțul de instrumente ssvmup compilează și optimizează programele Rust în cod bytec WebAssembly.

Folosiți următoarele comenzi simple pentru a le instala pe ambele. Sau vă puteți referi la acest ghid.

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
... ...
$ curl https://raw.githubusercontent.com/second-state/ssvmup/master/installer/init.sh -sSf | sh

Funcția WebAssembly este executată în VM al doilea stat – A VM de înaltă performanță WebAssembly optimizat pentru cazuri de utilizare și aplicații de pe partea de server.

Salut Lume

Pentru a începe cu prima funcție Rust și WebAssembly pe Tencent Cloud, vă încurajăm să clonați sau bifurcați acest depozit de șabloane pe Github și folosiți-l ca bază pentru propria aplicație.

Funcția Rugină în main.rs este funcția fără server pe care o vom implementa în SCF. După cum puteți vedea din codul sursă, acesta citește intrarea funcției din STDIN, și apoi utilizați println! macro pentru a trimite rezultate către STDOUT.

use std::io::{self, Read};
use serde::Deserialize;

fn main() {    
    let mut buffer = String::new();    
    io::stdin().read_to_string(&mut buffer).expect("Error reading from STDIN");    
    let obj: FaasInput = serde_json::from_str(&buffer).unwrap();    
    let key1 = &(obj.key1);    
    let key2 = &(obj.key2);    
    println!("Hello! {}, {}", key1, key2);
}

#[derive(Deserialize, Debug)]
struct FaasInput {    
    key1: String,    
    key2: String
}

Rugina main() funcția folosește serde bibliotecă pentru a analiza un șir JSON de la STDIN.

JSON arată ca următorul. Motivul pentru care scriem funcția în acest fel se datorează faptului că acesta este șablonul JSON încorporat din lumea bună, folosit de SCF pentru a testa funcțiile implementate.

{  
    "key1": "test value 1",  
    "key2": "test value 2"
}

Funcția extrage fișierul key1 și key2 valorează și transmite următorul mesaj de salut către STDOUT.

Hello! test value 1, test value 2

Dar, cum se traduce o solicitare web către această funcție STDIN? Și cum răspunde funcția STDOUT să fie tradus într-un răspuns HTTP?

Acest lucru este realizat de infrastructura SCF Custom Runtime și de bootstrap program în șablonul nostru.

După cum puteți vedea, bootstrap program este pur și simplu un program bash shell care sondează continuu SCF pentru cererile primite. Se traduce cererea primită în STDIN și apelează funcția WebAssembly prin SSVM. Apoi este nevoie de STDOUT de ieșire și îl trimite înapoi în SCF ca răspuns al funcției.

Nu trebuie să modificați programul de bootstrap dacă utilizați șablonul nostru.

Acum, puteți construi funcția Rust în codul bytec WebAssembly cu ssvmup și apoi împachetați un fișier zip pentru implementare pe Runtime personalizat Tencent Cloud SCF.

$ ssvmup build

Urmați instrucțiunile și capturile de ecran pentru a implementa și testa testul hello.zip fișier de sus. Acum ați implementat cu succes o funcție fără server WebAssembly!

În continuare, să creăm un serviciu web util dintr-o funcție Rust.

Învățarea automată ca serviciu

Pentru acest exemplu, am ales o sarcină de învățare automată computerizată intensivă pentru a demonstra performanța unei funcții Rust WebAssembly.

Funcția fără server ia un șir de intrare de numere delimitate prin virgulă care reprezintă un set de puncte pe un plan 2-D. Formatul de date de intrare este x1,y1,x2,y2,....

Funcția analizează datele și calculează doi vectori proprii care indică direcțiile celei mai variate în date.

Vectorii proprii oferă oamenilor de știință de date indicii cu privire la factorii care stau la baza variației datelor. Aceasta se numește Analiza componentelor principale (PCA).

Funcția noastră creează un grafic SVG cu punctele de date de intrare, precum și vectorii proprii trasați pe acesta. Se afișează graficul SVG în text XML.

Pentru a începe cu acest exemplu, ar trebui clonați sau furnizați acest depozit. Proiectul se află în tencentcloud / ssvm / pca pliant. De asemenea, puteți copia conținutul fișierului Cargo.toml și src /*la șablonul dvs. hello world.

Dacă faceți acest lucru din urmă, asigurați-vă că modificați fișierul Cargo.toml pentru a indica dosarul corect de cod sursă pentru biblioteca noastră Rust machine learning.

Nu voi intra în detaliile codului sursă Rust pentru generarea PCA sau SVG în acest tutorial, deoarece acestea implică o cantitate echitabilă de cod de calcul. Dacă sunteți interesat, puteți consulta mai multe resurse la sfârșitul acestui articol.

Poti urmați același proces ca în exemplul hello world. Utilizați ssvmup pentru a construi un pca.zip împachetează-l și implementează-l pe Tencent Cloud SCF Custom Runtime.

Apoi, dorim să asociem funcția implementată cu un gateway API web, astfel încât să poată fi invocat dintr-o cerere web HTTP sau HTTPS. Faceți acest lucru din fila Trigger Management din consola web pentru SCF. Consultați instrucțiunile și capturile de ecran aici.

Consola API transformă o cerere HTTP într-o intrare JSON pentru funcția fără server. De exemplu, aici este o cerere HTTP POST către adresa URL a gateway-ului API. Punem puncte de date delimitate prin virgulă din iris.csv fișier în corpul POST.

$ curl -d @iris.csv -X POST https://service-m9pxktbc-1302315972.hk.apigw.tencentcs.com/release/PCASVG

Gateway-ul API trece următorul JSON către funcția Rust STDIN. Corpul POST este acum atributul corpului din JSON.

{
  "body": "3.5,0.2,3,0.2,...",
  "headerParameters": {},
  "headers": {
    "accept": "/",
    "content-length": "11",
    "content-type": "application/x-www-form-urlencoded",
    "host": "service-aj0plx8u-1302315972.hk.apigw.tencentcs.com",
    "user-agent": "curl/7.54.0",
    "x-anonymous-consumer": "true",
    "x-api-requestid": "e3123014742e7dd79f0652968bf1f62e",
    "x-b3-traceid": "e3123014742e7dd79f0652968bf1f62e",
    "x-qualifier": "$DEFAULT"
  },
  "httpMethod": "POST",
  "path": "/my_hk",
  "pathParameters": {},
  "queryString": {},
  "queryStringParameters": {},
  "requestContext": {
    "httpMethod": "ANY",
    "identity": {},
    "path": "/my_hk",
    "serviceId": "service-aj0plx8u",
    "sourceIp": "136.49.211.114",
    "stage": "release"
  }
}

Funcția Rugină analizează datele din corp, efectuează PCA și generează graficul SVG. Acesta imprimă conținutul SVG pe STDOUT, care este preluat de API Gateway și trimis înapoi ca răspuns HTTP.

Pentru a utiliza această adresă URL a gateway-ului API în solicitările AJAX, trebuie să configurați și gateway-ul Tencent Cloud pentru a accepta cererile web CORS. Consultați acest ghid despre cum să o faci.

Exemplul HTML JavaScript de mai jos arată cum să utilizați această funcție fără server într-o pagină web.

Prinde datele CSV din textarea câmp cu ID csv_data, face o cerere AJAX HTTP POST către funcția fără server și apoi pune valoarea returnată, care este un grafic SVG, într-un element HTML cu ID svg_img. Vedeți demo-ul live aici.

$.ajax({
  method: "POST",
  url: "https://service-m9pxktbc-1302315972.hk.apigw.tencentcs.com/release/PCASVG",
  data: $('#csv_data').val(),
  dataType: "text"
}).done(function(data) {
  $('#svg_img').html(data);
})
Cum se utilizeaza Rust WebAssembly pentru a efectua invatarea
Aplicația web fără server în acțiune.

Pasii urmatori

Tencent SCF Custom Runtime este un mediu foarte puternic fără server. Oferă un mediu Linux generic pentru orice funcție de aplicație pe care doriți să o scrieți, precum și interfețe web standard pentru a interacționa cu funcția de intrare și ieșire. Cu siguranță merită încercat.

După cum sa discutat în articol, credem că Rust și WebAssembly oferă un stivă de înaltă performanță, sigură, portabilă și rezistentă la viitor pentru funcții fără server. Rust și WebAssembly cu SCF Custom Runtime este viitorul!

Resurse

Aboneaza-te la newsletter-ul nostru și rămâneți în legătură. Codificare fericită!