1 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
只要只有工作人員發(fā)起連接,您就不必?fù)?dān)心 NAT。gRPC 支持任一方向(或兩者)的流式傳輸。這意味著您的所有需求都可以?xún)H使用調(diào)度程序上的一臺(tái)服務(wù)器來(lái)實(shí)現(xiàn);調(diào)度程序不需要連接回工作人員。
根據(jù)您的描述,您的服務(wù)可能如下所示:
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;
}
其中大部分是偏好問(wèn)題(oneof例如,您可以使用而不是枚舉),但希望從客戶(hù)端到服務(wù)器的單個(gè)連接足以滿(mǎn)足您的要求。
維護(hù)一組可用的工作人員非常簡(jiǎn)單:
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
}
}
}
基礎(chǔ)教程包括所有類(lèi)型流的示例,包括 Go 中的服務(wù)器和客戶(hù)端實(shí)現(xiàn)。
至于注冊(cè),這通常只是意味著創(chuàng)建某種憑證,供工作人員在與服務(wù)器通信時(shí)使用。這可能是一個(gè)隨機(jī)生成的令牌(服務(wù)器可以使用它來(lái)加載關(guān)聯(lián)的元數(shù)據(jù)),或者用戶(hù)名/密碼組合,或者 TLS 客戶(hù)端證書(shū),或類(lèi)似的。詳細(xì)信息將取決于您的基礎(chǔ)設(shè)施和設(shè)置工作人員時(shí)所需的工作流程。
- 1 回答
- 0 關(guān)注
- 99 瀏覽
添加回答
舉報(bào)