---
# System prepended metadata

title: AWS Websocket

---

# 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

```


```