亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

沒有端口轉發的調度程序-工作集群

沒有端口轉發的調度程序-工作集群

Go
開滿天機 2023-03-07 16:54:11
TLDR 我想重新創建https://github.com/KorayGocmen/scheduler-worker-grpc而無需對工作人員進行端口轉發。我正在嘗試建立一個有競爭力的編程評判服務器來評估提交的內容,作為我學校的一個項目,我在那里教孩子們編程。因為評估的計算量很大,所以我希望有多個工作節點。調度程序將接收提交并將它們分發給工作節點。為了便于工人部署(因為它會經常變化),我希望工人能夠訂閱調度程序,從而成為一名工人并接受工作。worker 可能與調度程序不在同一個網絡上 + worker 駐留在 VM 中(也許稍后會移植到 docker 但目前存在問題)。調度器應該能夠知道 worker 的資源使用情況,向 worker 發送不同類型的作業并接收結果流。我目前正在考慮使用 grpc 來解決我對工作人員和調度程序之間通信的要求。我可以創建多個調度程序服務方法,例如:注冊工人,接收工作流流作業結果,什么也收不到定期流工作狀態,什么也沒有收到但是我更喜歡以下但idk是否可能:調度器 GRPC api:注冊一個工作人員(使工作人員 GRPC api 可用于調度程序)工人 GRPC api:開始工作(返回工作狀態流)取消工作???獲取資源使用情況如果連接丟失,worker 應該自動注銷。所以我的問題是...是否可以創建一個 grpc worker api,如果該 worker 在沒有端口轉發的情況下位于 NAT 后面,則可以將其注冊到調度程序以供以后使用?其他可能不必要的信息:更糟糕的是,我有多種完全不同類型的工作(流式傳輸交互式控制臺,針對準備好的測試用例執行代碼)。我可能只是為不同的工作創建不同的工人。有時作業涉及在本地文件系統(最多 500 MB)上有大文件,這些文件通常保存在調度程序附近,因此我想將作業發送給已經從調度程序下載特定文件的工作人員。否則將大文件下載到其中一名工人身上。在工作人員上同時擁有所有文件將占用超過 20 GB,因此我想避免它。一個 worker 可以同時運行多個作業(最多 16 個)。我正在寫系統。
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

只要只有工作人員發起連接,您就不必擔心 NAT。gRPC 支持任一方向(或兩者)的流式傳輸。這意味著您的所有需求都可以僅使用調度程序上的一臺服務器來實現;調度程序不需要連接回工作人員。


根據您的描述,您的服務可能如下所示:


syntax = "proto3";


import "google/protobuf/empty.proto";


service Scheduler {

    rpc GetJobs(GetJobsRequest) returns (stream GetJobsResponse) {}

    rpc ReportWorkerStatus(stream ReportWorkerStatusRequest) returns (google.protobuf.Empty) {}

    rpc ReportJobStatus(stream JobStatus) returns (stream JobAction) {}

}


enum JobType {

    JOB_TYPE_UNSPECIFIED = 0;

    JOB_TYPE_CONSOLE = 1;

    JOB_TYPE_EXEC = 2;

}


message GetJobsRequest {

    // List of job types this worker is willing to accept.

    repeated JobType types = 1;

}


message GetJobsResponse {

    string jobId = 0;

    JobType type = 1;


    string fileName = 2;

    bytes fileContent = 3;

    // etc.

}


message ReportWorkerStatusRequest {

    float cpuLoad = 0;

    uint64 availableDiskSpace = 1;

    uint64 availableMemory = 2;

    // etc.


    // List of filenames or file hashes, or whatever else you need to precisely

    // report the presence of files.

    repeated string haveFiles = 2;

}


其中大部分是偏好問題(oneof例如,您可以使用而不是枚舉),但希望從客戶端到服務器的單個連接足以滿足您的要求。


維護一組可用的工作人員非常簡單:


func (s *Server) GetJobs(req *pb.GetJobRequest, stream pb.Scheduler_GetJobsServer) error {

    ctx := stream.Context()


    s.scheduler.AddWorker(req)

    defer s.scheduler.RemoveWorker(req)


    for {

        job, err := s.scheduler.GetJob(ctx, req)

        switch {

        case ctx.Err() != nil: // client disconnected

            return nil

        case err != nil:

            return err

        }


        if err := stream.Send(job); err != nil {

            return err

        }

    }

}

基礎教程包括所有類型流的示例,包括 Go 中的服務器和客戶端實現。


至于注冊,這通常只是意味著創建某種憑證,供工作人員在與服務器通信時使用。這可能是一個隨機生成的令牌(服務器可以使用它來加載關聯的元數據),或者用戶名/密碼組合,或者 TLS 客戶端證書,或類似的。詳細信息將取決于您的基礎設施和設置工作人員時所需的工作流程。


查看完整回答
反對 回復 2023-03-07
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號