Esimweni sokuthuthuka okusheshayo kwe-cloud computing kanye ne-microservice architecture, kunesidingo esandayo sokuhlinzeka ngamakhono okusebenzisa ikhodi yezilimi ezihlukahlukene zokuhlela ngesiqinisekiso sokuphepha, ukuqina nokusebenza okuphezulu. Lesi sihloko sichaza iphrojekthi esebenzisa ukusetshenziswa kwekhodi endaweni engayodwa, futhi ixoxa ngezinzuzo zesixazululo sezakhiwo esikhethiwe se-WEB IDE yesimanje. Isistimu yakhelwe phezu kwayo
Sizochaza ngokuningiliziwe ukuthi izingxenye eziyinhloko zesistimu zakhiwe kanjani, ukuthi zihluke kanjani kwezinye izixazululo nokuthi kungani ukukhethwa kwalobu buchwepheshe kuvumela ukufeza ukusebenza okuphezulu nokuphepha.
Iphrojekthi yakhelwe kumgomo we-microservice architecture, okuvumela ukuthi uhlukanise ukusebenza kumasevisi azimele. Ingxenye ngayinye inesibopho somsebenzi okhethekile kakhulu, oqinisekisa ukuguquguquka, ukulinganisa, nokubekezelela amaphutha kwesistimu.
Izingxenye eziyinhloko:
Izinzuzo ze-Go:
Ukusebenza nokulinganisa: I-Go inesivinini esikhulu sokwenza, esibaluleke kakhulu ekuphatheni inombolo enkulu yezicelo ezifanayo.
Ukusekelwa okwakhelwe ngaphakathi kwe-concurrency: Izinqubo zama-goroutines namashaneli zivumela ukusebenzisa ukusebenzisana okuvumelanayo phakathi kwezingxenye ngaphandle kwamaphethini okufunda amaningi ayinkimbinkimbi.
Izinzuzo ze-gRPC:
Ukuqhathanisa: Ngokungafani ne-REST API, i-gRPC inikeza ukuxhumana okusebenza kahle nokuthembekile phakathi kwezinsizakalo, okubalulekile ezinhlelweni ezihambisana kakhulu.
Kungani Redis?
Ukusebenza okuphezulu: I-Redis ingakwazi ukuphatha inani elikhulu lemisebenzi ngomzuzwana, okuyenza ilungele umsebenzi nemigqa yemiphumela.
I-Pub/Sub and List Support: Ubulula bokusebenzisa imigqa nezindlela zokubhalisa kwenza kube lula ukuhlela ukusebenzisana okuvumelanayo phakathi kwezinsizakalo.
Ukuqhathaniswa nabanye abadayisi bemilayezo: Ngokungafani ne-RabbitMQ noma i-Kafka, i-Redis idinga ukulungiselelwa okuncane futhi inikeza ukusebenza okwanele kumasistimu esikhathi sangempela.
Indima kaDocker:
Ukuhlukaniswa kwemvelo: Iziqukathi ze-Docker zikuvumela ukuthi usebenzise ikhodi endaweni engayodwa, okwandisa ukuphepha kokubulawa futhi kunciphisa ubungozi bokungqubuzana nohlelo oluyinhloko.
Ukuphatha nokungaguquguquki: Ukusebenzisa i-Docker kunikeza indawo efanayo yokuhlanganisa nokusebenzisa ikhodi, kungakhathalekile ukuthi iluphi uhlelo lomsingathi.
Ukuqhathanisa: Ikhodi egijima ngqo kumsingathi ingaba sengozini yezokuphepha futhi iholele ezingxabanweni zokuncika, kuyilapho i-Docker ikuvumela ukuthi uxazulule lezi zinkinga.
Le phrojekthi isebenzisa indlela ye-microservice, enezinzuzo eziningi ezibalulekile:
Lapho kwakhiwa ama-WEB IDE esimanje okwenziwa kwekhodi ekude, izixazululo ezihlukahlukene zezakhiwo zivame ukuqhathaniswa. Ake sicabangele izindlela ezimbili:
Indlela A: I-Microservice architecture (gRPC + Redis + Docker)
Izici:
Le ndlela ihlinzeka ngokuxhumana okusheshayo nokuthembekile kwezinsizakusebenza, ukuhlukaniswa okuphezulu kokwenziwa kwekhodi, kanye nokukala okuguquguqukayo ngenxa yokufakwa kweziqukathi. Ilungele ama-WEB IDE esimanje, lapho ukuphendula nokuphepha kubalulekile.
Indlela B: I-Traditional Monolithic Architecture (HTTP REST + Centralised Execution)
Izici:
Izixazululo ze-Monolithic, ezivame ukusetshenziswa ezinguqulweni zangaphambili zama-IDE ewebhu, zisekelwe ku-HTTP REST kanye nokwenziwa kwekhodi okumaphakathi. Amasistimu anjalo abhekana nezinkinga zokukala, ukubambezeleka okwandisiwe, nobunzima ekuqinisekiseni ukuphepha lapho kusetshenziswa ikhodi yomunye umuntu.
Yazi: Esimeni samanje sokuthuthukiswa kwe-WEB IDE, i-HTTP REST kanye nendlela yokwenza emaphakathi ingaphansi kwezinzuzo zezakhiwo ze-microservices, njengoba inganikezi ukuguquguquka okudingekayo kanye nokulinganisa.
Igrafu ibonisa ngokucacile ukuthi i-microservices architecture (I-Approach A) inikeza ukubambezeleka okuphansi, ukuphuma okuphakeme, ukuvikeleka okungcono nokuqina uma kuqhathaniswa nesixazululo se-monolithic (I-Approach B).
Enye yezinto ezibalulekile zokuvikela nokuqina kwesistimu ukusetshenziswa kwe-Docker. Esixazululweni sethu, zonke izinsizakalo zisatshalaliswa ezitsheni ezihlukene, eziqinisekisa:
Ngezansi inguqulo emincane yezigaba eziyinhloko zekhodi ebonisa ukuthi isistimu:
Uhlelo lusebenzisa ukubhaliswa komhlaba wonke, lapho ulimi ngalunye lunomgijimi walo. Lokhu kukuvumela ukuthi ungeze kalula ukusekelwa kwezilimi ezintsha, kwanele ukusebenzisa isixhumi esibonakalayo sokugijima bese usibhalisa:
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") }
Isibonelo sokubhalisa ulimi olusha:
func init() { languages.Register("python", NewGenericRunner("python")) languages.Register("javascript", NewGenericRunner("javascript")) }
Ngakho-ke, lapho uthola isicelo, uhlelo lubiza:
runner, err := languages.GetRunner(req.Language)
futhi ithola umgijimi ohambisanayo ukuze akhiphe ikhodi.
Ngesicelo ngasinye sekhodi yomsebenzisi, kwakhiwa isitsha se-Docker esihlukile. Lokhu kwenziwa ngaphakathi kwezindlela zokugijima (isibonelo, ku-Run). I-logic eyinhloko yokusebenzisa isiqukathi ikumsebenzi we-RunInDockerStreaming:
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") } }
Lo msebenzi ukhiqiza umyalo we-docker run, lapho:
Ngakho-ke, lapho ubiza indlela ye-Run yomgijimi, okulandelayo kwenzeka:
Isiqephu esincishisiwe se-logic eyinhloko yokusebenzisa ikhodi (i-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 } }
Kulesi sibonelo esincane:
Lezi zingcezu ezibalulekile zibonisa ukuthi isistimu isekela kanjani ukwandiswa (ukwengezwa okulula kwezilimi ezintsha) futhi ihlinzeka ngokuhlukaniswa ngokwakha isitsha se-Docker esihlukile sesicelo ngasinye. Le ndlela ithuthukisa ukuvikeleka, ukuzinza nokuqina kwenkundla, okubaluleke kakhulu kuma-WEB IDE esimanje.
Lesi sihloko sidingida inkundla yokwenza ikhodi ekude eyakhelwe ekwakhiweni kwe-microservice kusetshenziswa isitaki se-gRPC + Redis + Docker. Le ndlela ikuvumela ukuthi:
Ukuhlaziywa okuqhathanisayo kubonisa ukuthi i-microservice architecture idlula kakhulu izixazululo zendabuko ze-monolithic kuwo wonke amamethrikhi angukhiye. Izinzuzo zale ndlela ziqinisekiswa idatha yangempela, okwenza kube yisixazululo esikhangayo sokudala izinhlelo zokusebenza eziphezulu nezingabekezeleli amaphutha.
Umbhali: Oleksii Bondar
Idethi: 2025–02–07