{"id":9862,"date":"2016-11-03T15:23:43","date_gmt":"2016-11-03T14:23:43","guid":{"rendered":"https:\/\/informatica.uniurb.it\/triennale\/?p=9862"},"modified":"2016-11-03T18:19:44","modified_gmt":"2016-11-03T17:19:44","slug":"quizzle-un-bot-a-larga-scala-per-europe-code-week","status":"publish","type":"post","link":"https:\/\/informatica.uniurb.it\/triennale\/quizzle-un-bot-a-larga-scala-per-europe-code-week\/","title":{"rendered":"Un bot a larga scala per Europe Code Week"},"content":{"rendered":"<p>Sono passati alcuni giorni dalla chiusura dello <a href=\"http:\/\/codeweek.eu\">Europe Code Week 2016<\/a>, che ha superato i risultati ottenuti dalle precedenti edizioni con un totale da record di oltre <a href=\"http:\/\/codeweek.it\/grazie-per-codeweek-2016\/\">20,000 eventi organizzati in pi\u00f9 di 50 paesi<\/a>.<\/p>\n<p>All&#8217;interno di <a href=\"http:\/\/codemooc.org\/mooc\/\">CodeMOOC<\/a>, un <strong>massive open online course<\/strong> (corso aperto online su larga scala) offerto dall&#8217;Universit\u00e0 di Urbino ed incentrato sul pensiero computazionale ed il <em>coding<\/em>, si \u00e8 pianificato per il <strong>20 ottobre<\/strong> lo svolgimento di un <strong>quiz di coding su larga scala<\/strong>. Utilizzando soltanto un client Telegram ed uno scanner di codici QR, i partecipanti hanno avuto la possibilit\u00e0 di partecipare al gioco e di sfidare oltre <strong>900 gruppi<\/strong> di varie localit\u00e0 d&#8217;Italia.<\/p>\n<p><!--more--><\/p>\n<figure id=\"attachment_9844\" aria-describedby=\"caption-attachment-9844\" style=\"width: 300px\" class=\"wp-caption alignright\"><a href=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-9844 size-medium\" src=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group-300x183.png\" alt=\"Telegram Quizzle channel\" width=\"300\" height=\"183\" srcset=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group-300x183.png 300w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group-210x128.png 210w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group-290x177.png 290w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group-450x275.png 450w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-group.png 985w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-9844\" class=\"wp-caption-text\">Canale Telegram.<\/figcaption><\/figure>\n<p>I partecipanti si potevano registrare ad un <a href=\"https:\/\/telegram.me\/quizzle\">canale Telegram<\/a>, sul quale sono state pubblicate le istruzioni del gioco poco prima dell&#8217;evento. All&#8217;inizio del gioco \u00e8 stato pubblicato il collegamento ad uno <a href=\"https:\/\/youtu.be\/BwD2Q8DySWg\">stream live su Youtube<\/a>, attraverso il quale venivano diffuse ulteriori istruzioni e le domande del quiz.<\/p>\n<p>Per ogni quiz assegnato durante il gioco, il bot Telegram pubblicava un <strong>collegamento speciale<\/strong> sul canale pubblico. Questo collegamento conduceva ad una conversazione privata tra partecipante e bot, sfruttando il cosiddetto <a href=\"https:\/\/core.telegram.org\/bots#deep-linking\"><em>deep linking<\/em> di Telegram<\/a>. Siccome ogni quiz del gioco era identificato da un particolare codice unico, il <em>deep link<\/em>, dopo aver condotto il partecipante alla conversazione privata, inviava anche un comando nascosto:<\/p>\n<pre>\/start IY4<\/pre>\n<p>(Dove il codice <em>IY4<\/em> identifica il 4\u00b0 quiz dell&#8217;evento.)<\/p>\n<p>I partecipanti potevano partecipare ai quiz anche scansionando direttamente un codice QR mostrato nello stream Youtube, che a sua volta conteneva il medesimo <em>deep link<\/em>.<\/p>\n<figure id=\"attachment_9845\" aria-describedby=\"caption-attachment-9845\" style=\"width: 300px\" class=\"wp-caption alignright\"><a href=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-9845\" src=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response-300x130.png\" alt=\"Response and results of a quiz question.\" width=\"300\" height=\"130\" srcset=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response-300x130.png 300w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response-210x91.png 210w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response-290x126.png 290w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response-450x196.png 450w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/telegram-response.png 819w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-9845\" class=\"wp-caption-text\">Risposta e risultati di uno dei quiz.<\/figcaption><\/figure>\n<p>Una volta attivato tramite il collegamento, il bot chiedeva all&#8217;utente di fornire la risposta al quiz.<br \/>\nAppena l&#8217;amministratore del quiz chiudeva la domanda (semplicemente scrivendo la risposta <em>corretta<\/em> al bot tramite una conversazione privata), il bot classificava tutte le risposte corrette ricevute in base al <em>timestamp<\/em> di ricezione e le <strong>rendeva pubbliche sul canale<\/strong>. Le prime 3 risposte corrette venivano premiate con l&#8217;assegnazione di alcune, inestimabili, medaglie emoji.\u00a0?<\/p>\n<h2>Gestione dei messaggi<\/h2>\n<p>Un totale di <strong>974 partecipanti<\/strong> (intesi come singoli utenti Telegram) hanno partecipato all&#8217;evento. Siccome ogni utente poteva registrarsi per conto di un gruppo di persone (rappresentandolo come capogruppo), il conteggio sale ad un totale di <strong>9689 persone<\/strong> di partecipanti. <strong>14 domande<\/strong> sono state poste durante il gioco, raccogliendo un totale di <strong>7004 risposte<\/strong> dai partecipanti, durante circa un&#8217;ora e mezza di gioco.<\/p>\n<p>In altre parole: un <em>sacco<\/em> di messaggi sono stati scambiati con il nostro bot nell&#8217;arco di pochissimo tempo.<\/p>\n<p>Telegram supporta <a href=\"https:\/\/core.telegram.org\/bots\/api#getting-updates\">due diverse modalit\u00e0 di ricezione<\/a> dei messaggi: <em>pull<\/em> e <em>push<\/em>.<\/p>\n<h3>Modalit\u00e0 Pull<\/h3>\n<p>In modalit\u00e0 Pull, il bot si collega periodicamente ad un end-point HTTP dei server Telegram e scarica tutti o parte dei messaggi in coda per la consegna. Il meccanismo di consegna pu\u00f2 essere personalizzato, ad esempio scaricando una sequenza di messaggi in un unico collegamento oppure utilizzando l&#8217;opzione di <em>long polling<\/em> per rendere bloccante la richiesta ed attendere che vi siano dati disponibili lato server.<\/p>\n<p>Sulla carta questa modalit\u00e0 assicura maggiore efficienza: le richieste sono controllate dal server che ospita il bot, possono essere gestite con pi\u00f9 facilit\u00e0 ed un gran numero di messaggi pu\u00f2 essere trasferito all&#8217;interno della stessa comunicazione HTTP.<\/p>\n<p>Tuttavia, operazioni <em>pull<\/em> sono, per natura, <strong>sincrone<\/strong>. Le API di Telegram non permettono pi\u00f9 di una richiesta concorrente (visto che, ovviamente, le singole richieste pull operano sequenzialmente sulla stessa coda di messaggi). Mentre trasferire un singolo grande <em>payload<\/em> di messaggi e processarli in un unico passo di decodifica JSON \u00e8 potenzialmente pi\u00f9 efficiente, quello che accade in effetti \u00e8 che in questa modalit\u00e0 il <strong>tempo medio di risposta aumenta<\/strong>. Inoltre, dopo la fase di scaricamento e di decodifica, il parallelismo \u00e8 interamente compito dello sviluppatore. La gestione dei messaggi su diversi processi o thread paralleli pu\u00f2 essere pi\u00f9 o meno difficile in base al proprio ambiente di programmazione: in Go si pu\u00f2 invocare una <em>goroutine<\/em> per ogni messaggio, mentre la stessa cosa pu\u00f2 essere fatta usando dei <em>task async<\/em> su .NET.<\/p>\n<h3>Modalit\u00e0 Push<\/h3>\n<p>Questa modalit\u00e0\u2014che per inciso \u00e8 l&#8217;unica modalit\u00e0 disponibile su diverse altre piattaforme di messaggistica\u2014baratta la fase di un singolo trasferimento dati molto efficiente per una moltitudine di operationi di gestione messaggi che avvengono in parallelo.<\/p>\n<p>Invece di aspettare che il bot contatti il server Telegram per ottenere nuovi messaggi, eventuali aggiornamenti sono inviati direttamente al server web del bot attraverso un end-point ad un URL definito dallo sviluppatore (Telegram richiede una connessione HTTPS, un dominio ed un certificato valido). Invece di doversi occupare dei dettagli implementativi della gestione parallela dei messaggi, questa modalit\u00e0 permette di <strong>sfruttare i punti di forza intrinseci di un server web<\/strong>: la gestione di un grande numero di connessioni in ingresso e la loro gestione efficiente.<\/p>\n<h2>Risultati<\/h2>\n<p>In base ai nostri log, ben <strong>7,414,458 messaggi<\/strong> sono stati inviati al nostro bot tramite Telegram, durante circa 80 minuti di gioco.<\/p>\n<a href=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-9843\" src=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-1024x481.png\" alt=\"An average of over 1500 messages per second were handled.\" width=\"1024\" height=\"481\" srcset=\"https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-1024x481.png 1024w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-300x141.png 300w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-210x99.png 210w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-290x136.png 290w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle-450x211.png 450w, https:\/\/informatica.uniurb.it\/triennale\/wp-content\/uploads\/post\/quizzle-scaling-a-bot-for-the-europe-code-week\/messages-per-minute-quizzle.png 1627w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>\n<p>In media il bot ha ricevuto oltre <strong>380 messaggi per minuti<\/strong>, con un picco di circa 1200. Guardando attentamente il grafico \u00e8 possibile intuire <em>quando<\/em> sono state poste le 14 domande del quiz.<\/p>\n<p>Inizialmente il nostro bot era stato configurato per operare in modalit\u00e0 <em>pull<\/em>, con una gestione sincrona dei messaggi in ingresso, visto che questa modalit\u00e0 permette di sviluppare e fare debug in maniera molto comoda. Tuttavia, appena l&#8217;evento ha avuto inizio, abbiamo subito scoperto che la coda dei messaggi in ingresso stava crescendo a dismisura e <strong>il nostro bot semplicemente non riusciva a tenere il passo dei giocatori<\/strong>.<br \/>\nSiamo riusciti a <strong>passare rapidamente alla modalit\u00e0 <em>push<\/em><\/strong>. Dopo un paio di minuti il bot \u00e8 riuscito a mettersi in paro con i messaggi, dopodich\u00e9 non si sono verificati altri problemi di responsivit\u00e0 nella comunicazione con i partecipanti.<\/p>\n<p>Il bot era installato su una macchina quad-core a 2.6 GHz, con 2 GB di RAM.<\/p>\n<p>Concludendo, la <strong>modalit\u00e0 <em>pull<\/em><\/strong> \u00e8 perfettamente <strong>adatta per lo sviluppo dei bot<\/strong>, visto che permette agli sviluppatori di controllare il flusso di messaggi in ingresso e di effettuare un attento debugging del codice. Tuttavia, probabilmente non vale la pena implementare un metodo efficiente (e corretto) di gestione dei messaggi tramite modalit\u00e0 <em>pull<\/em>. Come <a href=\"http:\/\/web.neurotiko.com\/bots\/2015\/08\/03\/bots-know-your-api\/\">gi\u00e0 suggerito da altri<\/a>, \u00e8 molto pi\u00f9 sensato <strong>affidarsi ad un server web per la gestione efficiente di richieste parallele<\/strong> invece di provare a reinventare la ruota.<\/p>\n<p>Pi\u00f9 generalmente\u2014e questo \u00e8 molto importante nel contesto della <a href=\"https:\/\/medium.com\/chris-messina\/2016-will-be-the-year-of-conversational-commerce-1586e85e3991#.uyci5eofc\">recente attenzione ai bot come rimpiazzo delle applicazioni mobili<\/a>\u2014l&#8217;utilizzo di un bot al posto di un sito web o altro ci ha dato un fondamentale vantaggio. La piattaforma di messagistica, Telegram in questo caso, funge da \u201cload balancer\u201d <em>estremamente<\/em> scalabile tra gli utenti ed il proprio servizio. La piattaforma gestisce la coda dei messaggi, l&#8217;invio, la consegna e la notifica degli utenti\u2014in sostanza Telegram offre una <strong>incredibile infrastruttura molto sofisticata ad un costo nullo<\/strong>. Questo permette agli sviluppatori di bot di concentrarsi sullo sviluppo del servizio invece di doversi occupare dei fondamenti.<\/p>\n<p>Questo evento dello Europe Code Week \u00e8 stato un&#8217;ottima opportunit\u00e0 per valutare gli effetti di un carico di lavoro inusuale su un bot (per quanto ci riguarda). Altri eventi di questa natura verranno organizzati in futuro e ci aspettiamo di poter <strong>valutare altri aspetti legati alle prestazioni ed alla scalabilit\u00e0<\/strong> in maggiore dettaglio.<\/p>\n<p>Il codice utilizzato durante l&#8217;evento \u00e8 <a href=\"https:\/\/github.com\/CodeMOOC\/QuizzleBot\">disponibile su Github<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sono passati alcuni giorni dalla chiusura dello Europe Code Week 2016, che ha superato i risultati ottenuti dalle precedenti edizioni con un totale da record di oltre 20,000 eventi organizzati in pi\u00f9 di 50 paesi. All&#8217;interno di CodeMOOC, un massive open online course (corso aperto online su larga scala) offerto dall&#8217;Universit\u00e0 di Urbino ed incentrato&hellip;<\/p>\n","protected":false},"author":43,"featured_media":7163,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[150],"tags":[1593,250,573,253],"post_series":[],"class_list":["post-9862","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lablog","tag-bot","tag-code-week","tag-codeweekeu-it","tag-europe-code-week","entry","has-media"],"acf":[],"_links":{"self":[{"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/posts\/9862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/users\/43"}],"replies":[{"embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/comments?post=9862"}],"version-history":[{"count":4,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/posts\/9862\/revisions"}],"predecessor-version":[{"id":9871,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/posts\/9862\/revisions\/9871"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/media\/7163"}],"wp:attachment":[{"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/media?parent=9862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/categories?post=9862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/tags?post=9862"},{"taxonomy":"post_series","embeddable":true,"href":"https:\/\/informatica.uniurb.it\/triennale\/wp-json\/wp\/v2\/post_series?post=9862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}