将订阅者建模为Akka actor的正确方法

时间:2014-03-21 21:14:52

标签: scala websocket redis playframework-2.0 akka

我打算重新设计现有系统以使用Akka,Play和Websockets。

我目前的系统基于Jetty和Websockets。

我发布了一个快速的消息流,发布到Redis频道。在我的Web应用程序层中,我使用Jedis订阅者订阅这些消息,然后将这些消息推送到Websocket,然后将其显示在浏览器上。

我想让转变两个主要原因 - a)由于使用Actors而具有更好和更简单的容错能力 b)使用不同的角色连接到多个流的能力

在我目前的设计中,我有一位主管,为每个新频道创建一个新的儿童演员。然后,儿童演员订阅Redis频道。我的问题是什么是将消息(从Redis频道收到)推送到Play Websocket的最佳方式?

1 个答案:

答案 0 :(得分:1)

我将从基于三层Actors的解决方案开始。从Redis feed到Websockets:

  • ChannelDispatcherActor
  • ChannelActor
  • WebsocketActor

ChannelDispatcherActor 是一个单例,它从Redis供稿中接收Publish(Channel,Content)流,并使用lazy-create语义维护Channel to ChannelActor的私有映射。它接受消息

  • 订阅(Channel,WebsocketActor) - 查找Channel的ChannelActor,必要时创建,转发到ChannelActor
  • 取消订阅(频道,WebsocketActor) - 同样 - 查找&向前
  • 发布(频道,内容) - 相同 - 查找&向前

ChannelActor 是每通道一个,并维护一组监听其频道的WebsocketActors。它接受消息

  • 订阅(Channel,WebsocketActor) - 将WebsocketActor添加到侦听器,也将context.watch(actorref)添加到
  • 取消订阅(Channel,WebsocketActor) - 从侦听器中删除
  • 已终止(WebsocketActor) - 从侦听器中删除
  • 发布() - 发送给每个听众

WebsocketActor 是one-per-websocket,维护一个websocket订阅的频道列表,并将从ChannelActors收到的流量发布到其websocket。要管理频道,它会发送ChannelDispatcherActor订阅/取消订阅。当websocket关闭时,它会自行终止,WebsocketActors会通过watch()es清理它们的监听器列表。

要做的很多优化,这对容错没有任何作用,但这些是单独的帖子。

快乐的徒步旅行!!