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

femto · 2023年04月06日 · 最后由 piecehealth 回复于 2023年04月06日 · 359 次阅读

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”。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号