Mumamiriro ezvinhu ekukurumidza kusimudzira kwegore komputa uye microservice architecture, pane kuwedzera kuri kuda kupa kugona kuita zvine simba kodhi yemitauro yakasiyana-siyana yepurogiramu ine vimbiso yekuchengetedza, scalability uye kushanda kwepamusoro. Ichi chinyorwa chinotsanangura purojekiti inoshandisa kodhi kuuraya munzvimbo yakasarudzika, uye inokurukura zvakanakira sarudzo yakasarudzwa yekuvaka yemazuva ano WEB IDE. Iyo system inovakwa pamusoro
Tichatsanangura zvakadzama kuti zvikamu zvikuru zvehurongwa zvakagadziriswa sei, zvakasiyana sei kubva kune dzimwe nzira dzekugadzirisa uye nei kusarudzwa kweiyi tekinoroji kuchibvumira kuwana kuita kwepamusoro uye kuchengetedzeka.
Iyo purojekiti yakavakirwa pamusimboti weiyo microservice architecture, iyo inokutendera iwe kugovera mashandiro kuita akazvimirira masevhisi. Chimwe nechimwe chikamu chine mutoro webasa rakasarudzika, iro rinovimbisa kuchinjika, scalability, uye kukanganisa kushivirira kwehurongwa.
Main components:
Zvakanakira Go:
Kuita uye scalability: Enda ine kukurumidza kuuraya kukuru, iyo inonyanya kukosha pakubata nhamba yakakura yezvikumbiro zvakafanana.
Yakavakirwa-mukati concurrency tsigiro: Iyo nzira dzegoroutines uye chiteshi inobvumira kuita asynchronous kupindirana pakati pezvikamu pasina yakaoma multithreading mapatani.
Zvakanakira zve gRPC:
Kuenzanisa: Kusiyana neREST API, gRPC inopa kutaurirana kwakanaka uye kwakavimbika pakati pemasevhisi, izvo zvakakosha kune zvakanyanya kuwirirana masisitimu.
Sei Redis?
Kuita kwepamusoro: Redis inogona kubata huwandu hukuru hwekushanda pasekondi, izvo zvinoita kuti ive yakanakira basa uye mhedzisiro mitsetse.
Pub/Sub uye Rondedzero Rutsigiro: Iko kureruka kwekushandisa mitsetse uye nzira dzekunyorera kunoita kuti zvive nyore kuronga asynchronous kupindirana pakati pemasevhisi.
Kuenzanisa nemamwe mabroker meseji: Kusiyana neRabbitMQ kana Kafka, Redis inoda kushomeka kurongeka uye inopa kuita kwakakwana kune chaiyo-nguva masisitimu.
Basa reDocker:
Kusarudzika kwezvakatipoteredza: Docker midziyo inobvumidza iwe kuti umhanye kodhi munzvimbo yakasarudzika, iyo inowedzera kuchengetedzwa kwekuuraya uye inoderedza njodzi yekukonana neiyo huru system.
Manageability uye kuenderana: Kushandisa Docker kunopa iyo yakafanana nharaunda yekunyora nekuita kodhi, zvisinei neiyo host system.
Kuenzanisa: Kumhanya kodhi yakananga pamugamuchiri kunogona kuunza njodzi yekuchengetedza uye kutungamirira kumakakatanwa ekutsamira, nepo Docker inobvumidza iwe kugadzirisa aya matambudziko.
Iyi purojekiti inoshandisa microservice nzira, ine akati wandei akakosha mabhenefiti:
Paunenge uchivaka emazuva ano WEB IDE ekuita kure kure kodhi, akasiyana ezvivakwa mhinduro anowanzo kuenzaniswa. Ngatitarisei nzira mbiri:
Nzira A: Microservice architecture (gRPC + Redis + Docker)
Features:
Iyi nzira inopa nekukurumidza uye yakavimbika kutaurirana kwepakati-sevhisi, kuparadzaniswa kwakanyanya kwekodhi kuuraya, uye kuchinjika kuyera nekuda kwekuiswa kwemidziyo. Yakakwana kune azvino WEB IDE, uko kupindura uye kuchengetedzeka kwakakosha.
Nzira B: Traditional Monolithic Architecture (HTTP REST + Centralized Execution)
Features:
Monolithic mhinduro, dzinowanzo shandiswa mumavhezheni ekutanga ewebhu IDE, dzakavakirwa paHTTP REST uye yepakati kodhi kuuraya. Masisitimu akadai anotarisana nenyaya dzekuyera, kuwedzera latency, uye kuomerwa kwekuchengetedza chengetedzo paunenge uchiita kodhi yemumwe munhu.
Ongorora: Mumamiriro ezvinhu emazuva ano eWEB IDE kusimudzira, iyo HTTP REST uye yepakati kuuraya nzira yakaderera kune zvakanakira ye microservices architecture, sezvo isingape inodiwa kuchinjika uye scalability.
Girafu inoratidza zvakajeka kuti iyo microservices architecture (Nzira A) inopa yakaderera latency, yakakwirira throughput, chengetedzo iri nani uye scalability zvichienzaniswa neiyo monolithic mhinduro (Nzira B).
Chimwe chezvinhu zvakakosha zvekuchengetedza system uye kugadzikana ndiko kushandiswa kweDocker. Mumhinduro yedu, masevhisi ese anoiswa mumidziyo yakasiyana, ayo anovimbisa:
Pazasi pane minified vhezheni yezvikamu zvikuru zvekodhi inoratidza maitiro ehurongwa:
Iyo sisitimu inoshandisa registry yepasirese, uko mutauro wega wega une mumhanyi wayo. Izvi zvinokutendera kuti uwedzere nyore tsigiro yemitauro mitsva, zvakakwana kushandisa iyo inomhanya interface uye kuinyoresa:
package languages import ( "errors" "sync" ) var ( registry = make(map[string]Runner) registryMu sync.RWMutex ) type Runner interface { Validate(projectDir string) error Compile(ctx context.Context, projectDir string) (<-chan string, error) Run(ctx context.Context, projectDir string) (<-chan string, error) } func Register(language string, runner Runner) { registryMu.Lock() defer registryMu.Unlock() registry[language] = runner } func GetRunner(language string) (Runner, error) { registryMu.RLock() defer registryMu.RUnlock() if runner, exists := registry[language]; exists { return runner, nil } return nil, errors.New("unsupported language") }
Muenzaniso wekunyoresa mutauro mutsva:
func init() { languages.Register("python", NewGenericRunner("python")) languages.Register("javascript", NewGenericRunner("javascript")) }
Saka, kana uchigamuchira chikumbiro, iyo system inodaidza:
runner, err := languages.GetRunner(req.Language)
uye inogamuchira mumhanyi anoenderana kuti aite iyo kodhi.
Kune yega yega mushandisi kodhi chikumbiro, yakaparadzana Docker mudziyo unogadzirwa. Izvi zvinoitwa mukati memumhanyi nzira (semuenzaniso, muRun). Iyo huru pfungwa yekumhanyisa mudziyo iri muRunInDockerStreaming basa:
package compiler import ( "bufio" "fmt" "io" "log" "os/exec" "time" ) func RunInDockerStreaming(image, dir, cmdStr string, logCh chan < -string) error { timeout: = 50 * time.Second cmd: = exec.Command("docker", "run", "--memory=256m", "--cpus=0.5", "--network=none", "-v", fmt.Sprintf("%s:/app", dir), "-w", "/app", image, "sh", "-c", cmdStr) cmd.Stdin = nil stdoutPipe, err: = cmd.StdoutPipe() if err != nil { return fmt.Errorf("error getting stdout: %v", err) } stderrPipe, err: = cmd.StderrPipe() if err != nil { return fmt.Errorf("error getting stderr: %v", err) } if err: = cmd.Start();err != nil { return fmt.Errorf("Error starting command: %v", err) } // Reading logs from the container go func() { reader: = bufio.NewReader(io.MultiReader(stdoutPipe, stderrPipe)) for { line, isPrefix, err: = reader.ReadLine() if err != nil { if err != io.EOF { logCh < -fmt.Sprintf("[Error reading logs: %v]", err) } break } msg: = string(line) for isPrefix { more, morePrefix, err: = reader.ReadLine() if err != nil { break } msg += string(more) isPrefix = morePrefix } logCh < -msg } close(logCh) }() doneCh: = make(chan error, 1) go func() { doneCh < -cmd.Wait() }() select { case err: = < -doneCh: return err case <-time.After(timeout): if cmd.Process != nil { cmd.Process.Kill() } return fmt.Errorf("Execution timed out") } }
Iri basa rinogadzira iyo docker run command, uko:
Saka, pakudaidza iyo Run nzira yemumhanyi, zvinotevera zvinoitika:
Yakaderedzwa chidimbu cheiyo huru logic yekodhi kuuraya (executor.ExecuteCode):
func ExecuteCode(ctx context.Context, req CodeRequest, logCh chan string) CodeResponse { // Create a temporary directory and write files projectDir, err: = util.CreateTempProjectDir() if err != nil { return CodeResponse { "", fmt.Sprintf("Error: %v", err) } } defer os.RemoveAll(projectDir) for fileName, content: = range req.Files { util.WriteFileRecursive(filepath.Join(projectDir, fileName), [] byte(content)) } // Get a runner for the selected language runner, err: = languages.GetRunner(req.Language) if err != nil { return CodeResponse { "", err.Error() } } if err: = runner.Validate(projectDir); err != nil { return CodeResponse { "", fmt.Sprintf("Validation error: %v", err) } } // Compile (if needed) and run code in Docker container compileCh, _: = runner.Compile(ctx, projectDir) for msg: = range compileCh { logCh < -"[Compilation]: " + msg } runCh, _: = runner.Run(ctx, projectDir) var output string for msg: = range runCh { logCh < -"[Run]: " + msg output += msg + "\n" } return CodeResponse { Output: output } }
Mumuenzaniso uyu mudiki:
Izvi zvimedu zvakakosha zvinoratidza kuti sisitimu inotsigira sei kuwedzera (kuwedzera nyore kwemitauro mitsva) uye inopa kuzviparadzanisa nekugadzira yakaparadzana Docker mudziyo wechikumbiro chega chega. Iyi nzira inovandudza kuchengetedzwa, kugadzikana uye scalability yepuratifomu, iyo inonyanya kukosha kune yemazuva ano WEB IDE.
Ichi chinyorwa chinokurukura chikuva chekure kure kodhi kuuraya yakavakirwa pane microservice architecture uchishandisa gRPC + Redis + Docker stack. Iyi nzira inokubvumira kuti:
Ongororo yekuenzanisa inoratidza kuti iyo microservice architecture inodarika echinyakare monolithic mhinduro mune ese akakosha metrics. Zvakanakira nzira iyi inosimbiswa ne data chaiyo, iyo inoita kuti ive mhinduro inoyevedza yekugadzira yakakwirira-yekuita uye inoshivirira masisitimu.
Munyori: Oleksii Bondar
Date: 2025–02–07