{"id":92595,"date":"2020-08-29T07:42:06","date_gmt":"2020-08-29T05:42:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej"},"modified":"2020-08-29T07:42:06","modified_gmt":"2020-08-29T05:42:06","slug":"razrabotat-videoplatformu-za-90-dnej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","title":{"rendered":"Sviluppare una piattaforma video in 90 giorni","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Questa primavera ci siamo trovati in condizioni molto divertenti. A causa della pandemia, \u00e8 diventato chiaro che le nostre conferenze estive dovevano essere spostate online. E per svolgerle online in modo efficace, le soluzioni software gi\u00e0 pronte non erano adatte, era necessario scriverne una nostra. E avevamo tre mesi per farlo.<\/p>\n<p><\/p>\n<p>\u00c8 evidente che sono stati tre mesi entusiasmanti. Ma dall'esterno non \u00e8 del tutto chiaro: cosa rappresenta effettivamente una piattaforma per conferenze online? Di quali componenti \u00e8 composta? Cos\u00ec, all'ultima delle conferenze estive DevOops, ho interrogato coloro che si occupavano di questo compito:<\/p>\n<p><\/p>\n<ul>\n<li>Nikolay Molchanov \u2014 direttore tecnico di JUG Ru Group; <\/li>\n<li>Vladimir Krasilshchik \u2014 programmatore Java pragmatico, specializzato nel backend (avete potuto vedere le sue relazioni alle nostre conferenze Java);<\/li>\n<li>Artyom Nikonov \u2014 responsabile di tutto il nostro streaming video.<\/li>\n<\/ul>\n<p><\/p>\n<p>A proposito, alle conferenze autunnali e invernali utilizzeremo una versione migliorata della stessa piattaforma \u2014 quindi molti utenti di Habr si troveranno ad utilizzarla.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/3d9f65911fa12310efff215a4ba0f2bc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"obschaya-kartina\">Panoramica generale<\/h1>\n<p><\/p>\n<p>\u2014 Com'era composta la squadra?<\/p>\n<p><\/p>\n<p><b>Nikolay Molchanov:<\/b> Abbiamo un analista, un designer, un tester, tre frontend developer e un backend developer. E, naturalmente, abbiamo un professionista a T!<\/p>\n<p><\/p>\n<p>\u2014 Com'\u00e8 stato il processo in generale?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Fino a met\u00e0 marzo non avevamo niente pronto per l'online. E il 15 marzo \u00e8 iniziato tutto il movimento online. Abbiamo creato alcuni repository, pianificato, discusso l'architettura di base e abbiamo completato tutto in tre mesi. <\/p>\n<p><\/p>\n<p>Ci\u00f2 ha certamente seguito le classiche fasi di pianificazione, architettura, scelta delle funzionalit\u00e0, voto su queste funzionalit\u00e0, politiche di queste funzionalit\u00e0, loro design, sviluppo e test. Alla fine, il 6 giugno abbiamo lanciato tutto in produzione su <noindex><a rel=\"nofollow\" href=\"https:\/\/techtrain.ru\/\">TechTrain<\/a><\/noindex>. Per tutto c'erano 90 giorni.<\/p>\n<p><\/p>\n<p>\u2014 Siamo riusciti a rispettare ci\u00f2 a cui ci eravamo impegnati?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Se ora stiamo partecipando alla conferenza DevOops online, significa che ce l'abbiamo fatta. Personalmente mi sono impegnato nella cosa principale: porter\u00f2 ai clienti uno strumento che permetter\u00e0 di tenere la conferenza online. <\/p>\n<p><\/p>\n<p>Il compito era questo: dateci uno strumento con cui possiamo trasmettere i nostri eventi agli acquirenti dei biglietti.<\/p>\n<p><\/p>\n<p>Tutta la pianificazione \u00e8 stata suddivisa in diverse fasi, e tutte le funzionalit\u00e0 (circa 30 globali) sono state divise in 4 categorie:<\/p>\n<p><\/p>\n<ul>\n<li>che faremo sicuramente (non possiamo vivere senza di essi), <\/li>\n<li>che faremo in un secondo momento, <\/li>\n<li>che non faremo mai, <\/li>\n<li>e che non faremo mai, mai. <\/li>\n<\/ul>\n<p><\/p>\n<p>Abbiamo realizzato tutte le funzionalit\u00e0 delle prime due categorie. <\/p>\n<p><\/p>\n<p>\u2014 So che in totale sono state aperte 600 attivit\u00e0 in JIRA. In tre mesi avete sviluppato 13 microservizi e sospetto che non siano scritti solo in Java. Avete utilizzato tecnologie diverse, con due cluster Kubernetes attivi in tre zone di disponibilit\u00e0 e 5 stream RTMP su Amazon.<\/p>\n<p><\/p>\n<p>Adesso esaminiamo ogni componente del sistema singolarmente.<\/p>\n<p><\/p>\n<h1 id=\"striming\">Streaming<\/h1>\n<p><\/p>\n<p>\u2014 Iniziamo con il momento in cui abbiamo gi\u00e0 un'immagine video, e viene inviata a qualche servizio. Artem, raccontaci come avviene questo streaming.<\/p>\n<p><\/p>\n<p><b>Artem Nikonov:<\/b> Lo schema generale \u00e8 il seguente: immagine dalla telecamera -&gt; la nostra regia -&gt; server RTMP locale -&gt; Amazon -&gt; lettore video. Maggiori dettagli <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/505138\/\">ne abbiamo scritto<\/a><\/noindex> su Habr a giugno.<\/p>\n<p><\/p>\n<p>In generale, ci sono due vie principali per ottenere questo: o utilizzare hardware o optare per soluzioni software. Noi abbiamo scelto la soluzione software, perch\u00e9 \u00e8 pi\u00f9 semplice nel caso di relatori remoti. Non sempre \u00e8 possibile portare l'hardware a un relatore in un altro paese, ma installare il software per il relatore sembra pi\u00f9 semplice e affidabile. <\/p>\n<p><\/p>\n<p>Dal punto di vista dell'hardware, abbiamo a disposizione un certo numero di telecamere (nelle nostre studio e da relatori remoti) e un certo numero di console in studio, che a volte devono essere riparate durante la trasmissione, proprio sotto il tavolo.<\/p>\n<p><\/p>\n<p>I segnali provenienti da questi dispositivi arrivano ai computer tramite schede di acquisizione, input\/output e schede audio. Qui i segnali vengono miscelati e uniti in layout:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/6657d95080f2263d4ea17b85d57d5919.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Esempio di layout per 4 relatori<\/i><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/ac3565b1b5a0f8356e20821b95037c2d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Esempio di layout per 4 relatori<\/i><\/p>\n<p><\/p>\n<p>Successivamente, la trasmissione continua \u00e8 garantita da tre computer: c'\u00e8 una macchina principale e un paio di macchine che lavorano a turno. Il primo computer gestisce il primo intervento, il secondo gestisce la pausa, il primo il successivo intervento, il secondo la pausa successiva e cos\u00ec via. La macchina principale mescola il primo con il secondo.<\/p>\n<p><\/p>\n<p>In questo modo si crea un certo triangolo: in caso di caduta di uno di questi nodi, possiamo continuare a fornire contenuti ai clienti rapidamente e senza perdita di qualit\u00e0. Abbiamo gi\u00e0 vissuto una situazione simile. Nella prima settimana delle conferenze, abbiamo riparato un server, accendendolo e spegnendolo. Sembra che le persone siano soddisfatte della nostra resilienza. <\/p>\n<p><\/p>\n<p>Successivamente, i flussi dai computer arrivano a un server locale, che ha due compiti: instradare i flussi RTMP e registrare un backup. In questo modo, abbiamo diversi punti di registrazione. Poi, i flussi video vengono inviati a una parte del nostro sistema costruita sui servizi SaaS di Amazon. Utilizziamo <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/medialive\/\">MediaLive<\/a><\/noindex>, S3, CloudFront. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> E cosa succede prima che il video arrivi agli spettatori? Deve essere tagliato in qualche modo?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Comprimiamo il video dalla nostra parte e lo inviamo a MediaLive. L\u00ec avviamo i transcoder. Questi ricodificano il video in tempo reale in diverse risoluzioni, in modo che le persone possano vederli sui telefoni, con una connessione internet scadente in campagna, e cos\u00ec via. Poi questi stream vengono suddivisi in <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Chunk_(information)\">chunk<\/a><\/noindex>, questo \u00e8 come funziona il protocollo <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP_Live_Streaming\">HLS<\/a><\/noindex>. Al frontend restituiamo una playlist che contiene riferimenti a questi chunk.<\/p>\n<p><\/p>\n<p>\u2014 Utilizziamo la risoluzione 1080p?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> In larghezza abbiamo come il video 1080p \u2014 1920 pixel, mentre in altezza \u00e8 leggermente inferiore, l'immagine \u00e8 pi\u00f9 allungata \u2014 ci sono delle ragioni per questo.<\/p>\n<p><\/p>\n<h1 id=\"pleer\">Player<\/h1>\n<p><\/p>\n<p>\u2014 Artem ha descritto come i video entrano nei flussi, come vengono distribuiti in diverse playlist per diverse risoluzioni degli schermi, frammentati in chunk e arrivano al player. Kolja, ora raccontaci che cos'\u00e8 questo player, come consuma il flusso, perch\u00e9 HLS?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Abbiamo un player che tutti i partecipanti alla conferenza monitorano. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/dae747f03795382deb0977d54dfa7561.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In sostanza, \u00e8 un wrapper su una libreria <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/video-dev\/hls.js\">hls.js<\/a><\/noindex>, su cui sono scritti molti altri player. Ma avevamo bisogno di una funzionalit\u00e0 molto specifica: il riavvolgimento e la marcatura del punto in cui si trova una persona, quale presentazione sta guardando. Servivano anche layout personalizzati, loghi e tutto il resto che si integrava con noi. Cos\u00ec abbiamo deciso di scrivere la nostra libreria (un wrapper su HLS) e integrarla nel sito. <\/p>\n<p><\/p>\n<p>Questa \u00e8 la funzionalit\u00e0 fondamentale, quindi \u00e8 stata implementata praticamente per prima. E poi attorno a questo tutto il resto \u00e8 gi\u00e0 emerso. <\/p>\n<p><\/p>\n<p>Di fatto, il player ottiene dalla backend un playlist con i link ai chunk, correlati con il tempo e la qualit\u00e0, scarica i necessari e li mostra all'utente, realizzando nel frattempo una certa \"magia\".<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/e20335b062f38ccf05af41a4324ff4fb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Esempio di timeline<\/i><\/p>\n<p><\/p>\n<p>\u2014 All'interno del player \u00e8 integrato un pulsante per visualizzare la timeline di tutte le presentazioni...<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> S\u00ec, abbiamo subito affrontato il problema della navigazione dell'utente. A met\u00e0 aprile abbiamo deciso di non trasmettere ciascuna delle nostre conferenze su un sito separato, ma di unire tutto su uno solo. Cos\u00ec gli utenti con biglietto Full Pass possono facilmente passare tra diverse conferenze: sia in diretta che le registrazioni passate. <\/p>\n<p><\/p>\n<p>Per rendere pi\u00f9 semplice per gli utenti muoversi nel live stream e passare tra i track, abbiamo deciso di aggiungere un pulsante \"Tutta la diretta\" e delle schede orizzontali per passare tra i track e le presentazioni. Ci sono controlli da tastiera.<\/p>\n<p><\/p>\n<p>\u2014 Ci sono state delle difficolt\u00e0 tecniche con questo?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Ci sono state con la barra di scorrimento, sulla quale sono segnati i punti di inizio delle diverse presentazioni. <\/p>\n<p><\/p>\n<p>\u2014 Alla fine avete implementato questi marcatori sulla barra di scorrimento prima che YouTube realizzasse qualcosa di simile?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> All'inizio era in beta. Sembra che sia una funzionalit\u00e0 abbastanza complessa, poich\u00e9 l'hanno testata parzialmente sugli utenti nell'ultimo anno. E ora \u00e8 arrivata alla vendita. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Ma in realt\u00e0 l'abbiamo portata alla vendita pi\u00f9 velocemente. A dire la verit\u00e0, dietro questa semplice funzionalit\u00e0 c'\u00e8 una grande quantit\u00e0 di backend, frontend e calcoli e logiche all'interno del lettore.<\/p>\n<p><\/p>\n<h1 id=\"frontend\">Frontend<\/h1>\n<p><\/p>\n<p>\u2014 Vediamo come arriva al frontend il contenuto che mostriamo (la scheda della presentazione, gli speaker, il sito, il programma)?<\/p>\n<p><\/p>\n<p><b>Vladimir Krasil\u2019shchik:<\/b> Abbiamo diversi sistemi IT interni. C'\u00e8 un sistema in cui sono registrate tutte le presentazioni e tutti gli speaker. C'\u00e8 un processo attraverso il quale il relatore partecipa alla conferenza. Lo speaker invia una richiesta, il sistema la acquisisce, e poi c'\u00e8 un certo pipeline che crea la presentazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/309559ba100f9b5e2195c7720b82f62d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Cos\u00ec lo speaker vede la pipeline<\/i><\/p>\n<p><\/p>\n<p>Questo sistema \u00e8 una nostra sviluppo interno. <\/p>\n<p><\/p>\n<p>Dai report separati, dobbiamo costruire un programma. Come noto, questa \u00e8 una questione NP-difficile, ma riusciamo a risolverla in qualche modo. A tal fine, avviamo un altro componente che forma il programma e lo carica in un servizio cloud esterno, Contentful. L\u00ec tutto appare come una tabella, in cui ci sono i giorni della conferenza, all'interno dei giorni ci sono fasce orarie, e nelle fasce orarie ci sono relazioni, pause o attivit\u00e0 degli sponsor. Quindi il contenuto che vediamo \u00e8 archiviato in un servizio esterno. L'obiettivo \u00e8 portarlo sul sito. <\/p>\n<p><\/p>\n<p>A prima vista, il sito sembra essere semplicemente una pagina con un lettore, e non c'\u00e8 nulla di complicato in questo. A meno che non sia cos\u00ec. Il backend che sta dietro questa pagina accede a Contentful, estrae il programma, forma alcuni oggetti e invia il tutto al frontend. Utilizzando una connessione WebSocket, ogni cliente della nostra piattaforma riceve aggiornamenti sul programma dal backend al frontend. <\/p>\n<p><\/p>\n<p>Casi reali: un relatore ha cambiato lavoro proprio durante la conferenza. \u00c8 necessario aggiornare il banner con il nome della nuova azienda. Come avviene tutto questo dal backend? Attraverso il websocket, viene inviato un aggiornamento a tutti i client, e poi il frontend si occupa di rinfrescare il timeline. Tutto ci\u00f2 avviene senza soluzione di continuit\u00e0. La combinazione del servizio cloud con alcuni dei nostri componenti ci consente di generare tutto questo contenuto e fornirlo al frontend. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> \u00c8 importante sottolineare che il nostro sito non \u00e8 un'applicazione SPA classica. \u00c8 sia un sito web ben impaginato e renderizzato, sia una SPA. In realt\u00e0, Google vede questo sito come HTML renderizzato. Questo \u00e8 utile per la SEO e per la consegna dei contenuti all'utente. Non deve aspettare il caricamento di 1,5 megabyte di JavaScript per vedere la pagina; vede subito la pagina gi\u00e0 renderizzata, e tu lo percepisci ogni volta che cambi relatore. Tutto si realizza in mezzo secondo, poich\u00e9 il contenuto \u00e8 gi\u00e0 pronto e collocato nel posto giusto.<\/p>\n<p><\/p>\n<p>\u2014 Riassumiamo quanto detto finora elencando le tecnologie. Tema ha spiegato che abbiamo 5 stream di Amazon, dove consegniamo video e audio. Qui utilizziamo script bash, con i quali lanciamo e configuriamo...<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Questo avviene tramite l'API AWS, ci sono anche molti altri servizi tecnici secondari. Abbiamo diviso i nostri compiti in modo tale che io mi occupi della consegna su <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/cloudfront\/\">CloudFront<\/a><\/noindex>, mentre gli sviluppatori front-end e back-end lo prelevano da l\u00ec. Abbiamo una serie di wrapper per semplificare la distribuzione dei contenuti che realizziamo poi in 4K, ecc. Dato che le scadenze erano molto ristrette, abbiamo praticamente fatto tutto basandoci su AWS.<\/p>\n<p><\/p>\n<p>\u2014 Tutto questo finisce nel lettore, utilizzando il backend del sistema. Abbiamo nel nostro lettore TypeScript, React, Next.JS. E nel backend abbiamo diversi servizi scritti in C#, Java, Spring Boot e Node.js. Tutto questo viene distribuito utilizzando Kubernetes, sfruttando l'infrastruttura di Yandex.Cloud.<\/p>\n<p><\/p>\n<p>Voglio anche notare che quando ho dovuto familiarizzare con la piattaforma, \u00e8 stato tutto abbastanza semplice: tutti i repository si trovano su GitLab, tutto \u00e8 ben nominato, ci sono test scritti, e c'\u00e8 documentazione. Quindi, anche in modalit\u00e0 di emergenza, ci si \u00e8 preoccupati di queste cose.<\/p>\n<p><\/p>\n<h1 id=\"biznes-ogranicheniya-i-analitika\">Vincoli aziendali e analisi<\/h1>\n<p><\/p>\n<p>\u2014 Ci siamo concentrati sui requisiti aziendali per 10.000 utenti. \u00c8 il momento di parlare delle limitazioni aziendali che abbiamo avuto. Dovevamo garantire un alto carico di lavoro e rispettare la legge sulla protezione dei dati personali. E cos'altro?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Inizialmente, ci siamo basati sui requisiti video. La cosa principale \u00e8 stata l'archiviazione distribuita dei video nel mondo per una rapida consegna al cliente. Tra le altre, la risoluzione 1080p, oltre alla funzione di riavvolgimento che molti altri non avevano in modalit\u00e0 live. Successivamente, abbiamo aggiunto la possibilit\u00e0 di attivare la velocit\u00e0 2x, che consente di 'recuperare' il live e guardare la conferenza in tempo reale. Inoltre, abbiamo implementato funzioni di marcatura della timeline. Inoltre, dovevamo essere resiliente e supportare un carico di 10.000 connessioni. Dal punto di vista del backend, ci\u00f2 significa circa 10.000 connessioni moltiplicate per 8 richieste per ogni aggiornamento della pagina. E questo equivale a 80.000 RPS\/sec. Abbastanza.<\/p>\n<p><\/p>\n<p>\u2014 C'erano anche requisiti per una 'mostra virtuale' con stand online dei partner?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> S\u00ec, doveva essere fatto in modo abbastanza veloce e universale. Avevamo fino a 10 aziende partner per ogni conferenza, e le pagine di tutte dovevano essere elaborate in una o due settimane. Tuttavia, il contenuto variava leggermente per formato. Ma \u00e8 stato realizzato un certo generatore di modelli che assemblava queste pagine al volo, praticamente senza ulteriore intervento da parte dello sviluppo. <\/p>\n<p><\/p>\n<p>\u2014 C'erano anche requisiti per l'analisi delle visualizzazioni in tempo reale e per le statistiche. So che utilizziamo Prometheus per questo, ma potresti raccontare di pi\u00f9: quali requisiti soddisfiamo per l'analisi e come viene realizzato?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Inizialmente abbiamo requisiti di marketing per la raccolta per il test A\/B e per la raccolta di informazioni per capire come fornire correttamente al cliente il miglior contenuto in futuro. Ci sono anche requisiti per un certo tipo di analisi sulle attivit\u00e0 dei partner e l'analisi che vedi (contatore di visite). Tutte le informazioni vengono raccolte in tempo reale. <\/p>\n<p><\/p>\n<p>Possiamo fornire queste informazioni in forma aggregata anche agli speaker: quante persone ti hanno visto in un determinato momento. Allo stesso tempo, per rispettare la legge 152 FZ, il pannello personale e i dati personali non vengono tracciati in alcun modo. <\/p>\n<p><\/p>\n<p>Sulla piattaforma ci sono gi\u00e0 strumenti di marketing e le nostre metriche per misurare l'attivit\u00e0 degli utenti in tempo reale (chi ha guardato quale secondo della presentazione), per costruire grafici sulla partecipazione alle presentazioni. Sulla base di questi dati vengono effettuate ricerche che permetteranno di rendere le prossime conferenze migliori. <\/p>\n<p><\/p>\n<h1 id=\"frod\">Frode<\/h1>\n<p><\/p>\n<p>\u2014 Abbiamo meccanismi anti-frode?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> A causa dei rigidi vincoli temporali dal punto di vista commerciale, non era inizialmente previsto bloccare subito le connessioni superflue. Se due utenti accedevano con lo stesso account, potevano guardare il contenuto. Ma sappiamo quante visualizzazioni contemporanee ci sono state da un unico account. E abbiamo bloccato alcuni trasgressori particolarmente gravi. <\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Bisogna dare atto che uno degli utenti bloccati ha capito perch\u00e9 \u00e8 successo. \u00c8 venuto, si \u00e8 scusato e ha promesso di comprare un biglietto.<\/p>\n<p><\/p>\n<p>\u2014 Per far s\u00ec che tutto ci\u00f2 avvenga, \u00e8 necessario tracciare completamente ogni utente dall'ingresso all'uscita, sapendo sempre cosa stanno facendo. Come funziona questo sistema?<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Vorrei parlare dell'analitica e della statistica che analizziamo successivamente per il successo della presentazione o che possiamo fornire poi ai partner. Tutti i clienti sono connessi tramite una connessione WebSocket a un certo cluster di backend. Qui c'\u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/\">Hazelcast<\/a><\/noindex>. Ogni cliente invia in ogni momento cosa sta facendo e quale video sta guardando. Successivamente, queste informazioni vengono aggregate rapidamente tramite job Hazelcast e restituite a tutti coloro che stanno guardando questi video. Possiamo vedere nell'angolo quanti utenti sono attualmente con noi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/fa08d10412cbdab418914183f25efa3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Queste informazioni vengono anche memorizzate in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/\">Mongo<\/a><\/noindex> e inviate al nostro lago dati, che ci aiuta a costruire grafici pi\u00f9 interessanti. La domanda arriva: quanti utenti unici hanno visto questa presentazione? Andiamo a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/\">Postgres<\/a><\/noindex>, dove ci sono i ping di tutte le persone che sono arrivate tramite l'id di questa presentazione. Abbiamo raccolto, aggregato gli unici e ora possiamo capire.<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Tuttavia, riceviamo anche dati in tempo reale da Prometheus. \u00c8 configurato per monitorare tutti i servizi di Kubernetes, compreso lo stesso Kubernetes. Raccoglie tutto e, con Grafana, possiamo costruire qualsiasi grafico in tempo reale.<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Da un lato, scarichiamo questi dati per un ulteriore trattamento di tipo OLAP. D'altra parte, l'applicazione scarica tutto su Prometheus, Grafana e i grafici si allineano perfettamente! <\/p>\n<p><\/p>\n<p>\u00c8 proprio il caso in cui i grafici si allineano.<\/p>\n<p><\/p>\n<h1 id=\"dinamicheskie-izmeneniya\">Modifiche dinamiche<\/h1>\n<p><\/p>\n<p>Raccontateci come vengono effettuate le modifiche dinamiche: se la relazione viene annullata 6 minuti prima dell'inizio, quale sequenza di azioni segue? Quale pipeline si attiva?<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> La pipeline \u00e8 piuttosto condizionale. Ci sono diverse possibilit\u00e0. La prima \u00e8 che il programma di pianificazione abbia preso piede e modificato il programma. Il programma modificato viene caricato in Contentful. Dopodich\u00e9, il backend rileva che ci sono cambiamenti riguardanti quella conferenza in Contentful, riprende e ricompone. Tutto viene assemblato e inviato tramite websocket. <\/p>\n<p><\/p>\n<p>La seconda possibilit\u00e0 \u00e8 quando tutto accade a un ritmo frenetico: l'editor modifica manualmente in Contentful le informazioni (link a Telegram, presentazione del relatore, ecc.) e scatta la stessa logica di prima. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Tutto avviene senza ricaricare la pagina. Tutte le modifiche avvengono in modo completamente fluido per il cliente. Lo stesso vale per il cambio delle relazioni. Quando arriva il momento, cambia la relazione e l'interfaccia. <\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Lo stesso vale per i punti temporali di inizio delle relazioni nella timeline. All'inizio non c'\u00e8 nulla. Ma se si passa il mouse sulla barra rossa, a un certo punto, grazie al regista della trasmissione, appariranno i punti. Il regista imposta il corretto inizio della trasmissione, il backend cattura questa modifica, calcola l'orario di inizio e fine delle relazioni dell'intero track in base al programma della conferenza e lo invia ai nostri clienti, il player disegna i punti. Ora l'utente pu\u00f2 navigare agevolmente verso l'inizio e la fine della relazione. Questo era un duro requisito aziendale, molto comodo e utile. Non perdi tempo a cercare il reale orario di inizio della relazione. E quando faremo l'anteprima, sar\u00e0 davvero fantastico.<\/p>\n<p><\/p>\n<h1 id=\"deployment\">Deployment<\/h1>\n<p><\/p>\n<p>\u2014 Vorrei chiedere del deployment. Kolya e il team hanno perso molto tempo all'inizio per configurare tutta l'infrastruttura in cui si svolge tutto. Racconta, di cosa \u00e8 composto tutto questo?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Inizialmente avevamo la necessit\u00e0 di astrarre il prodotto il pi\u00f9 possibile da qualsiasi fornitore. Non era molto adatto venire in AWS per creare script Terraform specifici per AWS, o specifici per Yandex, o Azure, ecc. Dovevamo trovare una soluzione alternativa. <\/p>\n<p><\/p>\n<p>Nelle prime tre settimane abbiamo costantemente cercato il modo migliore per procedere. Alla fine, siamo giunti alla conclusione che Kubernetes \u00e8 la nostra soluzione principale, poich\u00e9 consente di creare servizi scalabili automaticamente, distribuzioni automatiche e di ottenere praticamente tutti i servizi pronti all'uso. Naturalmente, era necessario formare tutti i servizi per lavorare con Kubernetes e Docker, e anche il team doveva imparare. <\/p>\n<p><\/p>\n<p>Abbiamo due cluster: uno di test e uno di produzione. Sono assolutamente identici dal punto di vista dell'hardware e delle configurazioni. Implementiamo l'infrastruttura come codice. Tutti i servizi vengono distribuiti automaticamente in tre ambienti da rami feature, da rami master e da rami di test, utilizzando GitLab. \u00c8 tutto massimamente integrato in GitLab e con Elastic e Prometheus. <\/p>\n<p><\/p>\n<p>Possiamo rilasciare rapidamente le modifiche in qualsiasi ambiente (10 minuti per il backend, 5 minuti per il frontend) con tutti i test, integrazioni e l'esecuzione di test funzionali e test di integrazione sull'ambiente, e possiamo anche eseguire test di carico sull'ambiente di test, che sono simili a ci\u00f2 che vogliamo ottenere in produzione. <\/p>\n<p><\/p>\n<h1 id=\"pro-testy\">Sui test<\/h1>\n<p><\/p>\n<p>\u2014 Testate quasi tutto, \u00e8 difficile credere a quanto avete scritto. Potete raccontare come sono i test del backend: quanto \u00e8 coperto, quali test ci sono?<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Sono stati scritti due tipi di test. I primi sono test di componenti. Testano il livello di avvio dell'intera applicazione Spring e del database in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.testcontainers.org\/\">Testcontainers<\/a><\/noindex>. Questo serve a verificare i casi d'uso aziendali pi\u00f9 elevati. Non testiamo le funzioni. Testiamo solo alcune cose importanti. Ad esempio, nel test viene simulato il processo di login dell'utente, richiesta da parte di quell'utente dei biglietti, dove pu\u00f2 andare, richiesta di accesso per visualizzare lo streaming. Sono scenari utente molto chiari. <\/p>\n<p><\/p>\n<p>Un approccio simile \u00e8 stato implementato nei cosiddetti test di integrazione, che vengono realmente eseguiti nell'ambiente. In effetti, quando un nuovo deployment viene effettuato in produzione, anche scenari di base reali vengono eseguiti in produzione. Lo stesso login, la richiesta di biglietti, la richiesta di accesso a CloudFront, il controllo che lo stream si colleghi effettivamente con le mie autorizzazioni, e la verifica dell'interfaccia del regista. <\/p>\n<p><\/p>\n<p>Attualmente ho circa 70 test componenti e circa 40 test di integrazione. La copertura \u00e8 molto vicina al 95%. Questo vale per i test componenti, mentre per quelli di integrazione \u00e8 un po' meno, poich\u00e9 non \u00e8 necessario avere cos\u00ec tanti. Considerando che nel progetto ci sono varie generazioni di codice, \u00e8 un risultato molto buono. Non c'era altro modo per fare ci\u00f2 che abbiamo realizzato in tre mesi. Infatti, se avessimo testato manualmente, inviando le funzionalit\u00e0 alla nostra tester, che avrebbe trovato bug e restituito per le riparazioni, questo round trip di debug del codice sarebbe stato molto lungo, e non saremmo riusciti a rimanere nei tempi.<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> In linea di massima, per eseguire un regressione su tutta la piattaforma in seguito a una modifica di qualche funzione, \u00e8 necessario passare due giorni a cliccare ovunque. <\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Quindi \u00e8 un grande successo che, quando stimo una caratteristica, dico che ho bisogno di 4 giorni per due semplici maniglie e 1 websocket, Kolya lo approva. \u00c8 gi\u00e0 abituato al fatto che in questi 4 giorni sono inclusi 2 tipi di test, e poi, probabilmente, funzioner\u00e0. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Anch'io ho scritto 140 test: componenti + funzionali, che fanno la stessa cosa. Tutti gli stessi scenari vengono testati sia in produzione, che nei test e in sviluppo. Recentemente, abbiamo anche introdotto test funzionali di base per l'interfaccia utente. In questo modo copriamo le funzionalit\u00e0 di base pi\u00f9 critiche che potrebbero rompersi. <\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Certo, vale la pena parlare dei test di carico. Era necessario verificare la piattaforma sotto un carico simile a quello reale, per capire cosa sta succedendo con Rabbit, cosa sta succedendo con le JVM, quanta memoria \u00e8 realmente necessaria. <\/p>\n<p><\/p>\n<p>\u2014 Non so esattamente se stiamo testando qualcosa lato streaming, ma ricordo che c'erano stati problemi con i transcoder quando organizziamo i meetup. Abbiamo testato gli streaming?<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Abbiamo testato iterativamente. Organizzando meet-up. Nel processo di organizzazione dei meet-up ci sono stati circa 2300 ticket JIRA. Queste erano solo cose di routine che le persone facevano per organizzare i meet-up. Abbiamo preso parti della piattaforma su una pagina separata per i meet-up, curata da Kirill Tolkachev (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/tolkkv\/\" class=\"user_link\">tolkkv<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>A essere onesti, non ci sono stati grossi problemi. Solo un paio di volte abbiamo riscontrato bug nella cache su CloudFront, risolti abbastanza rapidamente \u2014 abbiamo semplicemente riconfigurato le politiche. C'erano molti pi\u00f9 bug legati alle persone, ai sistemi di streaming sulla piattaforma. <\/p>\n<p><\/p>\n<p>Durante le conferenze, ho dovuto scrivere ulteriori esportatori per coprire pi\u00f9 apparecchiature e servizi. A volte ho dovuto creare le mie soluzioni solo per le metriche. Il mondo dell'hardware AV (audio-video) non \u00e8 molto roseo: hai qualche \"API\" dell'apparecchiatura che non puoi influenzare affatto. E non \u00e8 affatto sicuro che tu riesca ad ottenere le informazioni di cui hai bisogno. I fornitori di hardware sono davvero lenti e praticamente impossibili da convincere. In totale pi\u00f9 di 100 dispositivi, forniscono ci\u00f2 di cui non hai bisogno e tu scrivi esportatori strani e ridondanti, grazie ai quali puoi comunque debuggare il sistema.<\/p>\n<p><\/p>\n<h1 id=\"oborudovanie\">Attrezzature<\/h1>\n<p><\/p>\n<p>\u2014 Ricordo che, prima dell'inizio delle conferenze, abbiamo parzialmente acquistato ulteriore attrezzatura.<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Abbiamo acquistato computer, laptop, blocchi di alimentazione. Al momento possiamo vivere senza elettricit\u00e0 per 40 minuti. A giugno a San Pietroburgo ci sono state forti tempeste \u2014 quindi abbiamo avuto un'interruzione del genere. Inoltre, abbiamo diversi provider che arriva con connessioni ottiche da vari punti. Questo significa realmente 40 minuti di downtime per l'edificio, durante i quali avremo luce, audio, telecamere, ecc.<\/p>\n<p><\/p>\n<p>\u2014 Con internet abbiamo una storia simile. Nell'ufficio dove si trovano i nostri studi, abbiamo esteso una robusta rete tra i piani.<\/p>\n<p><\/p>\n<p><b>Artyom:<\/b> Abbiamo 20 Gbps di fibra ottica tra i piani. Pi\u00f9 avanti nei piani ci sono alcune linee in fibra, ma non sono tutte, e non ci sono canali gigabit \u2014 utilizziamo queste linee per trasmettere video tra le sessioni della conferenza. \u00c8 davvero molto comodo lavorare con la nostra infrastruttura, specialmente perch\u00e9 di solito \u00e8 raro poter gestire offline le conferenze negli spazi. <\/p>\n<p><\/p>\n<p>\u2014 Anche prima di lavorare con JUG Ru Group, ho visto come le attrezzature venissero assemblate in una notte per le conferenze offline, dove c'\u00e8 un grande schermo con tutte le metriche che costruite in Grafana. Ora c'\u00e8 anche un'area di comando, dove si trova il team di sviluppo che durante la conferenza risolve alcuni bug e sviluppa nuove funzionalit\u00e0. In aggiunta, c'\u00e8 un sistema di monitoraggio che viene visualizzato su un grande schermo. Artem, Kolya e gli altri ragazzi sono l\u00ec per assicurarsi che tutto funzioni bene e senza intoppi.<\/p>\n<p><\/p>\n<h1 id=\"kuryozy-i-problemy\">Curiosit\u00e0 e problemi<\/h1>\n<p><\/p>\n<p>\u2014 Hai descritto molto bene il nostro servizio di streaming con Amazon, la presenza di un player web, il supporto per vari linguaggi di programmazione, la resilienza del sistema e altri requisiti aziendali, incluso un'area clienti disponibile sia per aziende che per privati. Possiamo anche integrare con altri tramite OAuth 2.0, gestire sistemi antifrode e il blocco degli utenti. Possiamo implementare modifiche dinamicamente, grazie a una buona programmazione, e tutto questo viene rigorosamente testato.<\/p>\n<p><\/p>\n<p>Sono curioso di sapere quali curiosit\u00e0 ci sono state durante il lancio di qualcosa. Ci sono state situazioni stravaganti mentre sviluppavate il backend e il frontend, dove vi sembrava di combattere con qualcosa di assurdo e non sapevate come affrontarlo?<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Mi sembra che sia successo solo negli ultimi tre mesi. Ogni giorno. Come potete vedere, ho perso tutti i capelli. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sviluppare una piattaforma video in 90 giorni\" src=\"\/wp-content\/uploads\/2020\/08\/6ff16a1abd6ec5fb445d8d3888d990e7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vladimir Krasil'shchik dopo 3 mesi, quando tutto sembrava un caos e nessuno sapeva come gestirlo.<\/i><\/p>\n<p><\/p>\n<p>Ogni giorno c'era qualcosa di simile, un momento in cui ti ritrovi a strapparti i capelli oppure realizzi che non c'\u00e8 nessun altro e solo tu puoi farlo. Il nostro primo grande evento \u00e8 stato il TechTrain. Il 6 giugno, alle 2 del mattino, non avevamo ancora distribuito l'ambiente di produzione, lo stava facendo Kolja. E non funzionava il pannello personale, come server di autorizzazione tramite OAuth 2.0. Lo abbiamo trasformato in un provider OAuth 2.0 per connettere la piattaforma. Avevo gi\u00e0 lavorato per circa 18 ore di fila, fissando il computer senza vedere nulla, non capivo perch\u00e9 non funzionasse. Kolja controllava il mio codice da remoto, cercando un bug nella configurazione di Spring, lo ha trovato, e il pannello personale ha iniziato a funzionare, anche in produzione. <\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> E un'ora prima del TechTrain il rilascio \u00e8 avvenuto. <\/p>\n<p><\/p>\n<p>Qui si sono allineate molte stelle. Siamo stati fortunati, perch\u00e9 abbiamo creato un super team, e tutti erano motivati dall'idea di fare qualcosa online. In questi tre mesi, ci ha spinti il fatto che stavamo \"facendo YouTube\". Non mi permetteva di strappare i capelli, dicevo a tutti che ce l'avremmo fatta, perch\u00e9 in realt\u00e0 tutto era gi\u00e0 stato pianificato. <\/p>\n<p><\/p>\n<h1 id=\"pro-proizvoditelnost\">Riguardo alle prestazioni<\/h1>\n<p><\/p>\n<p>\u2014 Puoi dirci qual \u00e8 stato il numero massimo di persone sul sito in un singolo evento? Ci sono stati problemi di prestazioni?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Non ci sono stati problemi di prestazioni, come abbiamo gi\u00e0 detto. Il numero massimo di persone che sono state su una singola presentazione \u00e8 stato di 1300, durante Heisenbug.<\/p>\n<p><\/p>\n<p>\u2014 Ci sono stati problemi con la visualizzazione locale? E c'\u00e8 la possibilit\u00e0 di avere una descrizione tecnica con diagrammi su come \u00e8 tutto configurato?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Scriveremo un articolo su questo pi\u00f9 avanti.<\/p>\n<p><\/p>\n<p>Localmente possiamo persino fare il debug delle streaming. Una volta iniziate le conferenze, \u00e8 diventato ancora pi\u00f9 semplice, grazie agli streaming di produzione che possiamo seguire continuamente.<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Da quello che capisco, gli sviluppatori frontend lavoravano localmente con i mock, e poi, poich\u00e9 il tempo di distribuzione nella dev sul frontend \u00e8 breve (5 minuti), non ci sono problemi a controllare i certificati. <\/p>\n<p><\/p>\n<p>\u2014 Tutto viene testato, debuggato, anche localmente. Quindi scriveremo un articolo con tutte le caratteristiche tecniche, mostreremo e spiegheremo tutto con diagrammi.<\/p>\n<p><\/p>\n<p><b>Vladimir:<\/b> Sarete in grado di prendere e ripetere. <\/p>\n<p><\/p>\n<p>\u2014 In 3 mesi.<\/p>\n<p><\/p>\n<h1 id=\"itog\">Risultato<\/h1>\n<p><\/p>\n<p>\u2014 Tutto ci\u00f2 che \u00e8 stato descritto suona fantastico considerando che \u00e8 stato fatto da un piccolo team in tre mesi.<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Una grande squadra non riuscirebbe a farlo. Ma un piccolo gruppo di persone che comunica in modo stretto e positivo tra di loro e riesce a prendere accordi potrebbe. Non hanno conflitti, l'architettura \u00e8 stata concepita in due giorni, finalizzata e non \u00e8 praticamente cambiata. C'\u00e8 una facilitazione molto rigorosa delle richieste aziendali in termini di accumulo di richieste di funzionalit\u00e0 e cambiamenti. <\/p>\n<p><\/p>\n<p>\u2014 Quali sono emerse nel vostro elenco di compiti futuri dopo le conferenze estive gi\u00e0 svolte?<\/p>\n<p><\/p>\n<p><b>Nikolay:<\/b> Ad esempio, i sottotitoli. Strisce che scorrono nei video, pop-up in alcuni punti del video a seconda dei contenuti mostrati. Ad esempio, se un relatore desidera porre una domanda al pubblico, appare sullo schermo un sondaggio che, in base ai risultati, ritorna al relatore stesso. Qualche forma di attivit\u00e0 sociale come like, cuori, valutazioni della presentazione durante la stessa presentazione, in modo da poter fornire feedback al momento, senza dover ritornare poi ai moduli di feedback. Questa era l'idea iniziale.<\/p>\n<p><\/p>\n<p>Inoltre, l'aggiunta di tutta la piattaforma, ad eccezione dello streaming e delle conferenze, include anche lo stato post-conferenza. Questi sono playlist (comprese quelle create dagli utenti), contenuti di altre conferenze gi\u00e0 svolte, integrati e contrassegnati, disponibili per l'utente, e visibili sul nostro sito.<noindex><a rel=\"nofollow\" href=\"https:\/\/live.jugru.org\/?utm_source=habr&amp;utm_medium=516688\">live.jugru.org<\/a><\/noindex>). <\/p>\n<p><\/p>\n<p>\u2014 Ragazzi, grazie mille per le risposte!<\/p>\n<p>Se tra i lettori ci sono quelli che hanno partecipato alle nostre conferenze estive, condividete le vostre impressioni sul lettore e sulla trasmissione. Cosa \u00e8 stato comodo, cosa ha infastidito e cosa vorreste vedere in futuro?<\/p>\n<p><\/p>\n<p>Se la piattaforma vi ha interessato e volete vederla \"all'opera\", la utilizzeremo nuovamente alle nostre <noindex><a rel=\"nofollow\" href=\"https:\/\/live.jugru.org\/?utm_source=habr&amp;utm_medium=516688\">conferenze autunno-invernali<\/a><\/noindex>. Ce ne sono diverse, quindi \u00e8 quasi sicuro che ce ne sia una adatta a voi.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/516688\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92595","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430 90 \u0434\u043d\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-29T05:42:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-29T05:42:06+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sviluppare una piattaforma video in 90 giorni | ProHoster","description":"Questa primavera ci siamo trovati in situazioni molto divertenti. A causa della pandemia, \u00e8 diventato chiaro che le nostre conferenze estive dovevano essere trasferite online. E per farle in modo efficace, le soluzioni software pronte non erano adatte; dovevamo scrivere il nostro. E avevamo tre mesi per farlo. \u00c8 chiaro che sono stati tre mesi entusiasmanti. Ma da fuori non","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430 90 \u0434\u043d\u0435\u0439 | ProHoster","og:description":"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0435\u0442\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u043d\u043b\u0430\u0439\u043d. \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. \u0418 \u043d\u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430. \u041d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/razrabotat-videoplatformu-za-90-dnej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-29T05:42:06+00:00","article:modified_time":"2020-08-29T05:42:06+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92595","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:02","updated":"2022-09-30 11:38:11"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=92595"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92595\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/92596"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=92595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=92595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=92595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}