【问题标题】:Correct way to model a subscriber as an Akka actor将订阅者建模为 Akka 演员的正确方法
【发布时间】:2014-03-21 21:14:52
【问题描述】:
我计划重新设计一个现有系统以使用 Akka、Play 和 Websockets。
我当前的系统基于 Jetty 和 Websockets。
我有快速发布到 Redis 频道的消息流。在我的 Web 应用程序层中,我使用 Jedis 订阅者订阅这些消息,然后将这些消息推送到 Websocket,然后显示在浏览器上。
我想让两个班次成为两个主要原因 -
a) 由于使用了 Actors,容错性更好、更简单
b) 使用不同参与者连接到多个流的能力
在我当前的设计中,我有一个主管,可以为每个新频道创建一个新的子 Actor。然后,子 Actor 订阅 Redis 频道。我的问题是将消息(从 Redis 通道接收)推送到 Play Websocket 的最佳方式是什么?
【问题讨论】:
标签:
scala
websocket
redis
playframework-2.0
akka
【解决方案1】:
我将从基于三层 Actor 的解决方案开始。从 Redis 提要到 Websockets:
- ChannelDispatcherActor
- ChannelActor
- WebsocketActor
ChannelDispatcherActor 是一个单例,它从 Redis 提要接收 Publish(Channel, Content) 流,并使用惰性创建语义维护 Channel 到 ChannelActor 的私有映射。它接受消息
- Subscribe(Channel, WebsocketActor) - 为 Channel 查找 ChannelActor,必要时创建,转发给 ChannelActor
- 取消订阅(Channel, WebsocketActor) - 相同 - 查找和转发
- 发布(频道、内容) - 相同 - 查找和转发
ChannelActor 是一个通道,并维护一组 WebsocketActor 监听其通道。它接受消息
- Subscribe(Channel, WebsocketActor) - 将 WebsocketActor 添加到侦听器,还有 context.watch(actorref)
- Unsubscribe(Channel, WebsocketActor) - 从监听器中移除
- 已终止(WebsocketActor) - 从侦听器中删除
- Publish() - 发送给每个监听器
WebsocketActor 是每个 websocket 一个,并维护一个 websocket 订阅的 Channels 列表,并将它从 ChannelActors 接收到的流量发布到它的 websocket。为了管理频道,它发送 ChannelDispatcherActor 订阅/取消订阅。当 websocket 关闭时它会自行终止,然后 WebsocketActors 通过 watch()es 清理它们的侦听器列表。
需要进行大量优化,这对容错没有任何帮助,但这些都是单独的帖子。
哈克快乐!!