AssemblyLift v0.2 미리보기: RPC 기반 입출력 모듈

나는 내가 지난번에 갱신할 수 있었던 AssemblyLift 이래로 이미 긴 1분이 되었다고 생각한다.현실 생활은 매우 바쁘다. 여름의 무더위는 나로 하여금 행동이 느리게 한다. 나는 마침내 휴가를 갔다.
그럼에도 불구하고 여가 시간에 나는 Assembly Lift의 다음 중대한 수정의 핵심 작업을 완성하려고 노력했다.이것은 내가 예상한 것과 계획의 거의 두 배이지만, 나는 이것이 추가적인 노력을 기울일 가치가 있다고 생각한다.
나는 플러그인 시스템을 쓰는 데 한 달이 걸렸지만, 그 결과 플러그인이 상당히 취약하고 메모리 보안에 문제가 있다는 것을 증명했다.그래서 저는 한 달 동안 Cap'n Proto RPC를 바탕으로 해결 방안을 다시 개발했습니다. 지금까지 그 해결 방안은 보답을 받은 것 같습니다.

우리 도대체 무슨 소리 하는 거야?


AssemblyLift는 제가 계속 개발하고 있는 프레임워크입니다. 이것은 AWS Lambda 등 서비스에 실행되는 서버 없는 클라우드 응용 프로그램을 구축하기 위해 코드와 도구를 제공합니다.Assembly Lift 응용 프로그램은 Rust로 작성되었습니다. (클라이언트 언어가 더 있습니다!)WebAssembly(WASM)로 컴파일됩니다.
서버 없는 기능을 WebAssembly 형식으로 실행하면 다음과 같은 이점이 있습니다.
  • WebAssembly 모듈은 본질적으로 격리되어 있다.메모리 공간에서 실행되며, 기본적으로 플러그인을 열거나 하위 파일 시스템에 접근할 수 없습니다.
  • 그들은 보통 자바스크립트나 파이썬으로 작성된 대응 프로그램보다 빠르다. 이 두 언어는 모두 람다의 상용 언어이다.
  • 메모리 사용량과 배치 패키지의 크기에 있어 무게는 훨씬 가볍다.
  • 다양한 언어를 WebAssembly로 컴파일하여 개발자에게 유니버설 운행 시 환경에서의 선택을 제공한다.
  • 그 자체로 말하자면, 첫 번째는 문제일 수도 있다. 우리는 언젠가 외부 세계와 소통해야 할 수도 있다.다행히도 WebAssembly는 실현자가 모듈 코드에 자신의 시스템 ABI를 제공할 수 있도록 허용한다.Assembly Lift는 자체 ABI를 제공하여 AWS Lambda 등에서 우리 모듈을 운행하는 데 도움이 됩니다.
    AssemblyLift는 모듈에 하위 API(예: POSIX 소켓)를 제공하려는 대신 WASM 모듈이 액세스할 수 있는 플러그인 모듈을 등록하는 표준 인터페이스를 제공합니다.네트워크 또는 스토리지 액세스가 필요한 작업은 이러한 플러그인 모듈에서 수행되며 WASM 모듈은 실행 시 호스트를 통해 플러그인 모듈과 통신합니다.
    Assembly Lift 프레임워크에서 이 플러그인 모듈은 IOMOd라고 불린다.시스템의 설계와 실현에 대한 영감 Haskell's approach to IO🙂.
    Assembly Lift의 v0.1 시리즈에서 IOMod 부분은 대체적으로 존재하지만 (현재 유일한) DynamoDB 모듈은 호스트 바이너리 파일의 나머지 부분으로 정적으로 컴파일된다(기본적으로 개념으로 증명된다).내 목표는 IOMOD를 패키지로 나누어 주는 것이다. 이것은 실행할 때 모든 함수에 따라 불러올 수 있어야 한다는 것을 의미한다.

    깔끔하다!그렇다면 이 모든 것은 어떻게 작동합니까?얘가 뭘 닮았어요?


    비교적 높은 차원에서 그것은 보기에 약간 아래 그림과 같다.나는 최선을 다해 이해하고 견지한다C4 model.

    분명히 우리는 세부 사항을 실현하는 것을 소홀히 했지만 기본 사상은 사실상 매우 간단하다.좀 더 깊이 있게 하기 위해서, 우리는 Assembly Lift 예시를 보고, 간단한 네트워크 호출을 어떻게 하는지 이해합시다🙂.
    extern crate asml_awslambda;
    
    use direct_executor;
    use asml_core::GuestCore;
    use asml_awslambda::{*, AwsLambdaClient, LambdaContext};
    
    use asml_iomod_dynamodb::{structs, list_tables};
    
    handler!(context: LambdaContext, async {
        let input: structs::ListTablesInput = Default::default();
        let response = list_tables(input).await; // this is our IOmod call
    
        AwsLambdaClient::success(format!("Got response {:?}", response));
    });
    
    위의 예제에서는 DynamoDB IOMod 호출ListTables을 사용합니다.이 방법은 list_tables 에 의해 실현되고 단일input 파라미터를 받아들인다.
    모든 IOMod 호출은 이런 구조(즉 output_struct = call(input_struct)가 있고 호출은 항상 비동기적이다.list_tables IOMod "고객 섀시"– WASM과 호환되는 고객 인터페이스를 IO 모듈에 제공하는 녹슨 섀시입니다.
    호출list_tables 시 게스트는 Assembly Lift ABI를 호출하여 호출을 나타냅니다.AssemblyLift가 실행될 때 IOMod 호스트 프로세스의 RPC를 통해 순서대로 위치를 정하고 이 방법을 호출합니다.

    패키지 및 배포


    현재 구현에서 IOMOD는 Assembly Lift 응용 프로그램에서 모든 서비스에 대해 정의됩니다.AWS Lambda에 배치할 때, 모든 서비스는 Lambda 층에서 지원되며, 이 층은 서비스 기능에 필요한 모든 IOMod 바이너리 파일을 포함한다.AssemblyLift가 실행될 때 시작할 때 환경에 계층화된 모든 바이너리 파일이 생성됩니다.

    언제 준비 됐어요?


    나의 목표는 10월 초이다. 그때 나는 모든 것을 정리하고 더 많은 테스트를 할 것이다.IOMod의 내용도 내가 v0.2를 위해 계획한 모든 내용을 포함하지 않는다.x. 하지만 다른 모든 내용을 다음 주요 버전으로 옮길 수 있습니다.기대해 봅시다--기대해 주세요!😊
    2020년 11월 8일 업데이트: IOMOD는 현재 v0.2에서 제공됩니다.승강기를 조립하는 x선

    좋은 웹페이지 즐겨찾기