Puyu computadora chaymanta microservicio arquitectura usqaylla wiñayninpa contextonpi, aswan necesidad kan quypaq atiyta dinamicamente ruwanapaq código imaymana programakuna simikunapaq huk garantia seguridad, escalabilidad chaymanta hatun ruway. Kay qillqasqa huk llamk'aymanta willan mayqinchus sapanchasqa pachapi código ruwayta ruwan, chaymanta kunan pacha WEB IDE kaqpaq akllasqa arquitectónico solucionpa allinninkunamanta riman. Chay sistemaqa ruwasqa kachkan
Detalladamente willasaqku imayna sistemapa componentes principales nisqakuna ruwasqa kasqankuta, imayna hukniray solucionkunamanta chaymanta imarayku kay tecnologiakuna akllayqa hatun ruwayta chaymanta seguridadta aypayta saqin.
Proyectoqa microservicio arquitectura kamachiypi ruwasqa kachkan, chaymanta ruwanakuna sapanchasqa yanapakuykunaman rakiyta atikunki. Sapa componente huk ancha especializasqa ruwanamanta ruwasqa, chaymanta flexibilidad, escalabilidad chaymanta sistemapa pantay tolerancia kaqninta qhawan.
Hatun componentekuna:
Go nisqap allinninkuna:
Ruway chaymanta escalabilidad: Go huk hatun ruway utqayllayuq, mayqinchus aswanta ancha chaniyuq achka yupay paralelo mañakuykunata llamk'achinapaq.
Yanapakuy concurrencia kaqpi ruwasqa: Gorutinakuna chaymanta canalkuna mecanismokuna componentekunapura asíncrono interacción ruwayta saqin mana complejo multithreading ruwanakunayuq.
gRPC nisqap allinninkuna:
Tupanachiy: Mana REST API hinachu, gRPC aswan allin chaymanta atikuq willayta qun serviciokunapura, mayqinchus ancha kuskalla sistemakunapaq ancha chaniyuq.
¿Imaraykutaq Redis?
Alto ruway: Redis achka llamkanakunata sapa segundo kaqpi ruwayta atin, chaymanta llamkanapaq chaymanta ruway filakunapaq allin ruwan.
Pub/Sub chaymanta Lista Yanapakuy: Filakuna chaymanta suscripción mecanismokuna ruwaypa sasan ruwayqa mana sasachu ruwan serviciokunapura asíncrona tinkiykuna ruwayta.
Huk willakuy corredorkunawan tupachiy: Mana RabbitMQ utaq Kafka hinachu, Redis aswan pisi ruwayta mañan chaymanta chiqa pacha llamkanakunapaq suficiente ruwayta qun.
Dockerpa ruwaynin:
Pachamama sapanchasqa: Docker waqaychanakuna huk hunt'asqa sapanchasqa muyuriqpi codigo purichiyta saqin, chaymanta ruway harkayta yapan chaymanta hatun llamkanawan ch'aqway riesgota pisiyachin.
Kamachiy atiy chaymanta sapanchasqa: Docker llamk'achiyta kikin pachata qun codigo huñunapaq chaymanta ruwanapaq, quq llamkanamanta mana qhawaspa.
Tupanachiy: Chiqamanta qutupi codigo purichiyqa huk harkasqa riesgota ruwanman chaymanta dependencia ch'aqwaykunaman apayta atin, Dockertaq kay sasachakuykunata allichayta saqin.
Kay proyectoqa microservicio nisqa ruwaytam llamkan, chaymi achka hatun ventajakunayuq:
Kunan pacha WEB IDEkuna karu codigo ruwanapaq ruwachkaspa, imaymana arquitectura allichaykuna sapa kuti tupachisqa kanku. Iskay ruwaykunata qhawarisun:
A ruway: Microservicio ruway (gRPC + Redis + Docker) .
Kaqninkuna:
Kay ruwayqa utqaylla chaymanta atikuq inter-servicio willayta qun, hatun sapanchasqa codigo ruwaymanta, chaymanta flexible escalamiento kaqmanta contenedorización kaqrayku. Kunan pacha WEB IDE kaqpaq allinmi, maypi kutichiy chaymanta waqaychasqa ancha chaniyuq.
Enfoque B: Arquitectura Monolítica Tradicional (HTTP REST + Ejecución Centralizada) nisqa.
Kaqninkuna:
Monolítico allichaykuna, sapa kuti web IDEkuna ñawpaq layakunapi llamk'achisqa, HTTP REST kaqpi chaymanta chawpichasqa codigo ruwaypi sayasqa kanku. Kayhina sistemakuna escala sasachakuykunawan, yapasqa latencia kaqwan, chaymanta sasachakuykunawan tinkinku hukpa códigonta ruwachkaspa harkayta qhawaypi.
Qhaway: Kunan pacha WEB IDE wiñachiypi, HTTP REST chaymanta chawpichasqa ruway ruwayqa huk microserviciokuna arquitecturapa allinninkunamanta aswan pisi, mana necesario flexibilidad chaymanta escalabilidadta qunchu.
Chay graficoqa sut’itan rikuchin microserviciokuna arquitectura (Enfoque A) aswan pisi latenciata, aswan hatun rendimientota, aswan allin seguridadta hinallataq escalabilidadta qon chay solucion monolíticawan tupachisqa (Enfoque B).
Huknin llalliq elementokuna sistema waqaychasqa chaymanta takyasqa kaqmanta Docker llamk'achiynin. Solucionniykupi, llapa yanapakuykuna sapaq waqaychanakunapi churasqa kanku, chaymanta qhawan:
Uraypi huk huch'uychasqa laya hatun t'aqakuna codigo kaqmanta kachkan chaymanta imayna llamkana rikuchin:
Llamkana huk pachantinpi registro llamk'achin, maypi sapa simi kikin kallpaqniyuq. Kayqa musuq simikunapaq yanapakuyta mana sasachakuspa yapayta atikunki, phawaq interfazta ruwanapaq chaymanta qillqanapaq suficiente:
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") }
Musuq simita qillqanapaq rikch'anachiy:
func init() { languages.Register("python", NewGenericRunner("python")) languages.Register("javascript", NewGenericRunner("javascript")) }
Chayhina, huk mañakuyta chaskispa, sistemaqa kayhinata waqyan:
runner, err := languages.GetRunner(req.Language)
hinaspa tupaqnin kallpaqta chaskikun chay codigo ruwananpaq.
Sapa user codigo mañakuypaq, sapaq Docker waqaychana ruwasqa. Kayqa phawaq ñankuna ukhupi ruwakun (ahinataq, Phawaqpi). Waqaychasqata purichinapaq hatun lógica RunInDockerStreaming ruwaypi kachkan:
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") } }
Kay llamk'ayqa docker purichiy kamachiyta paqarichimun, maypichus:
Chayhina, kallpaqpa Run métodota waqyaspaqa, kayhinam ruwakun:
Codigo ruwaypa hatun lógicanpa pisiyachisqa rakin (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 } }
Kay pisilla ejemplopiqa:
Kay llave t'aqakuna rikuchinku imayna llamkana mast'ariyta yanapan (musuq simikuna mana sasa yapay) chaymanta sapanchasqa kayta qun sapa mañakuypaq sapaq Docker waqaychana ruwaspa. Kay ruwayqa plataformapa waqaychasqa kayninta, takyasqa kayninta chaymanta escalabilidad nisqatapas allinchan, chaymi aswanta kunan pacha WEB IDE nisqapaq ancha chaniyuq.
Kay qillqasqa huk plataformamanta riman karu codigo ruwanapaq ruwasqa huk microservicio arquitectura kaqpi gRPC + Redis + Docker pila kaqwan. Kay ruwayqa atikunmi:
Huk tupanachiy t'aqwiyqa rikuchin microservicio arquitectura aswanta ruwan ñawpaq monolítico solucionkunamanta llapa llave métricas kaqpi. Kay ruwaypa allinninkuna chiqap willakuykunawan takyachisqa, chaymi huk munay allichayta ruwan hatun ruwayniyuq chaymanta pantaykunata tolerante sistemakuna ruwanapaq.
Qillqaq: Oleksii Bondar sutiyuq runa
P’unchaw: 2025–02–07