Rails ActionCable 的 background broadcast 实现原理是什么?

femto · April 06, 2023 · Last by piecehealth replied at April 06, 2023 · 334 hits

ActionCable 的 background broadcast 实现原理是什么?如果是 rails server, 那么通过 websocket 传回数据到前端,然后前端更新是很正常的, 但是他能在 background process(比如 sidekiq 的 worker) 里头做 broadcast, 前端也能更新,这是什么原理?

而且泛化一下,一般前端只跟一个 rails server process 的 websocket 相连吧? 如果从另一个 rails server process 调用 broadcast,前端也能更新, 这又是什么原理?

ActionCable 一般通过有 pubsub 功能的组件实现 broadcast,比如 redis https://redis.io/docs/manual/pubsub/

每一个 rails web 进程都保存自己 websocket 连接以及这些连接都订阅了哪些 channel(actioncable 里的 channel)。 同时 web 进程也 subscribe 了 redis actioncable 的 channel(redis 的 channel,跟 actioncable 的 channel 不是一个东西)。

worker 里面调用 broadcast,实际是向 redis 的 actioncable channel 发一条信息,向“xx channel 广播 yy message”。 web 进程收到“xx channel 广播 yy message”,检查自己进程里有没有连接订阅过 xx channel,如果有的话就发送"yy message”。

You need to Sign in before reply, if you don't have an account, please Sign up first.