# AWS Websocket https://aws.amazon.com/blogs/compute/from-poll-to-push-transform-apis-using-amazon-api-gateway-rest-apis-and-websockets/ ## problemi con client Ruby ## EventMachine https://www.generacodice.com/en/articolo/718927/why-is-eventmachine-s-defer-slower-than-a-ruby-thread https://www.rubydoc.info/gems/eventmachine-eventmachine/EventMachine.defer :::info #defer serve per integrare operazioni bloccanti nel flusso di controllo di EventMachine. Chiama #defer con uno o due blocchi, come mostrato di seguito (il secondo blocco è opzionale): ```ruby operazione = proc { \# esegue qui un'operazione di lunga durata, come una query al database. "result" # come al solito, l'ultima espressione valutata nel blocco sarà il valore di ritorno. } callback = proc {|risultato| \#fa qualcosa con il risultato qui, come ad esempio rimandarlo ad un client di rete. } ``` EventMachine.defer( operazione, callback ) L'azione di #defer è quella di prendere il blocco specificato nel primo parametro (l'"operazione") e programmarlo per **l'esecuzione asincrona su un pool di thread interno mantenuto da EventMachine**. Quando l'operazione completa, passerà il risultato calcolato dal blocco (se esiste) al reattore EventMachine. **Quindi, EventMachine chiama il blocco specificato nel secondo parametro di #defer (il "callback"), come parte del suo normale ciclo sincrono di gestione degli eventi.** Il risultato calcolato dal blocco operativo viene passato come parametro alla callback. Potete omettere il parametro callback se non avete bisogno di eseguire alcun codice dopo il completamento dell'operazione. ::: :::warning Nota attentamente che il codice della tua operazione differita sarà eseguito *su un thread separato dall'elaborazione principale di EventMachine e da tutti gli altri thread di Ruby che possono esistere nel tuo programma. Inoltre, più operazioni differite possono essere eseguite contemporaneamente! Pertanto, sei responsabile di assicurare che il codice della tua operazione sia threadsafe*. [Non scrivete un'operazione differita che si bloccherà per sempre. Se è così, l'implementazione corrente non rileverà il problema e il thread non verrà mai restituito al pool. EventMachine limita il numero di thread nel suo pool, quindi se lo fate abbastanza volte, le vostre successive operazioni differite non avranno la possibilità di essere eseguite. [Potremmo inserire un timer per rilevare questo problema]. - OSSERVATE che #next_tick intacca questo meccanismo, quindi non fate alcun cambiamento qui senza sincronizzarlo lì. ::: https://stackoverflow.com/questions/20074518/better-use-em-next-tick-or-em-defer-for-long-running-calculation-with-eventmachi ## threading Ruby https://www.slideshare.net/autonomous/ruby-concurrency-and-eventmachine https://www.rubydoc.info/github/eventmachine/eventmachine/EventMachine#run-class_method https://www.codeotaku.com/journal/2018-06/improving-ruby-concurrency/index https://www.codeotaku.com/journal/2018-06/asynchronous-ruby/index https://socketry.github.io/async/ https://www.slideshare.net/autonomous/ruby-concurrency-and-eventmachine ## websocket client Ruby https://socketry.github.io/async-websocket/ (non usato) ## WebSocket Client (browser) javascript https://cheatcode.co/tutorials/how-to-set-up-a-websocket-client-with-javascript ## AWS https://medium.com/serverless-transformation/asynchronous-client-interaction-in-aws-serverless-polling-websocket-server-sent-events-or-acf10167cc67 ## Architettura AWS ## webSocket + apiGateway per avvio asincrono della lambda per long-process ```mermaid sequenceDiagram browser client->>websocket: "action":"start-process" websocket-->>browser client: "starterConnectionId":"I0J8Rcj1joECIpw=" browser client->>apiGateway: GET /totals-per-project/2015/01/I17VmcMcjoECHSw=/project apiGateway->>lamdba timesheet report rounded:"async call" apiGateway->>browser client: long_process_started loop Every minute lamdba timesheet report rounded-->> websocket:"progress %" websocket-->>browser client:"progress %" end lamdba timesheet report rounded-->>websocket:"action":"done","ref":"reportUrl","data":[...] websocket-->>browser client:"action":"done","ref":"reportUrl","data":[...] ``` ## Lambda Integration https://medium.com/@lakshmanLD/lambda-proxy-vs-lambda-integration-in-aws-api-gateway-3a9397af0e6d ``` ```