go-siris / siris

DEPRECATED: The community driven fork of Iris. The fastest web framework for Golang!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Websockets over Redis

kamilgregorczyk opened this issue · comments

Hi, some time ago I reported new issue in the iris repo but it got closed and my comment was deleted:/ then I found this repo and I think it has the same problem as iris has.

WebSockets should use some kind of a backend like Redis or RabbitMQ (or any other pubsub mechanism).

Why?

You see, let's imagine we have three clients:

CLIENT 1 <--->  |  INSTANCE 1 
CLIENT 2 <--->  |  INSTANCE 1

CLIENT 3 <--->  |  INSTANCE 2

Client 1 and 2 is connected to the 1st replica of our go app, and the 3rd one is connected to the 2nd instance of our go app.

If Client 1 calls some endpoint on instance 1 which then results in a published message (which should be received by everyone) over websockets then it will be delivered to only client 1 and client 2, the 3rd one won't receive it.

There's a good pattern (used in django's channels package) which uses some pubsub mechanism:

CLIENT 1 <--->  |  INSTANCE 1 | <--> REDIS
CLIENT 2 <--->  |  INSTANCE 1 | <--> REDIS

CLIENT 3 <--->  |  INSTANCE 2 | <--> REDIS

In that way when client 1 publishes a message, it is published not into websocket channel but to redis, then it gets received by every instance that listens on messages and is then forwarded from that channel to websockets.