【问题标题】: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 清理它们的侦听器列表。

需要进行大量优化,这对容错没有任何帮助,但这些都是单独的帖子。

哈克快乐!!

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多