我计划重新设计一个现有的系统,使用akka,play和websockets。
我现在的系统是基于防波堤和websockets的。
我有一个发布到redis频道的快速消息流。在我的web应用程序层,我使用jedis订阅服务器订阅这些消息,然后将这些消息推送到websocket,然后在浏览器上显示。
我想换班两个主要原因-
a)由于使用了actors,因此容错性更好、更简单
b)使用不同的参与者连接到多个流的能力
在我目前的设计中,我有一个主管,为每个新频道创建一个新的儿童演员。然后,子参与者订阅redis通道。我的问题是,将消息(从redis频道接收)推送到play websocket的最佳方式是什么?
最佳答案
我将从基于三层参与者的解决方案开始。从redis feed到websockets:
信道调度器
沟道因子
WebSocketActor网站
channeldispatcheractor是一个单例,它从redis提要接收发布流(channel,content),并使用惰性创建语义维护channel到channelactor的私有映射。它接受消息
subscribe(channel,websocketactor)-查找channelactor以查找channelactor,必要时创建,转发到channelactor
取消订阅(频道,WebSocketActor)-相同-查找并转发
发布(频道、内容)-相同-查找和转发
channelactor是每个通道一个,它维护一组websocketactor来监听其通道。它接受消息
subscribe(channel,websocketactor)-将websocketactor添加到侦听器,也添加到context.watch(actorref)
取消订阅(频道,WebSocketActor)-从侦听器中删除
终止(WebSocketActor)-从侦听器中移除
publish()-发送到每个传入侦听器
websocketactor是每个websocket一个,它维护一个websocket订阅的频道列表,并将从channelactors接收的流量发布到其websocket。要管理频道,它会发送channeldispatcheractor subscribe/unsubscribes。当websocket关闭时,它终止自身,websocketactors通过watch()es清理它们的侦听器列表。
需要进行很多优化,这对容错没有任何帮助,但这些都是单独的帖子。
快乐的哈金!!
关于scala - 将订阅者建模为Akka actor的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22569664/