最近,我一直在尝试围绕 Akka 和基于 actor 的系统的概念展开思考。虽然我现在对 Akka 基础知识有了很好的理解,但在集群和远程 Actor 方面,我仍然在一些事情上苦苦挣扎。
我将尝试使用Play Framework 2.0 附带的 WebSocket 聊天示例来说明这个问题:有一个角色持有 WebSocket,并保留了当前连接用户的列表。演员基本上在技术上和逻辑上都代表了聊天室。只要在单个服务器上运行一个聊天室,它就可以很好地工作。
现在我试图理解当我们谈论在服务器集群上运行的许多动态聊天室(可以随时打开/关闭新房间)时,如何扩展这个示例(添加或删除单个节点)根据当前需求)。在这种情况下,用户 A 可以连接到服务器 1,而用户 B 连接到服务器 2。两者可能在同一个聊天室中交谈。在每台服务器上,仍然会有一个参与者(对于每个聊天室?),它持有 WebSocket 实例以接收和发布事件(消息)给正确的用户。但从逻辑上讲,服务器 1 或服务器 2 上应该只有一个聊天室参与者保存当前连接的用户(或类似任务)的列表。
您将如何实现这一点,最好是在“纯 akka”中并且不添加像 ZeroMQ 或 RabbitMQ 这样的额外消息传递系统?
到目前为止,这是我想出的,请让我知道这是否有意义:
- 用户 A 连接到服务器 1,并且分配了一个持有他的 WebSocket 的演员。
- 参与者检查(使用路由器?EventBus?其他东西?)活动聊天室的“聊天室参与者”是否存在于任何连接的集群节点上。因为它不是,它会以某种方式请求创建一个新的聊天室参与者,并将向/从这个参与者发送和接收未来的聊天消息。
- 用户 B 在服务器 2 上连接,并且也为他的 WebSocket 分配了一个演员。
- 它还检查请求的聊天室的参与者是否存在于某处,并在服务器 1 上找到它。
- 服务器 1 上的聊天室参与者现在充当给定聊天室的中心,向所有“连接”的聊天成员参与者发送消息并分发传入的参与者。
如果服务器 2 出现故障,则必须以某种方式在服务器 2 上重新创建/移动聊天室参与者,尽管这不是我现在主要关心的问题。我最想知道的是,演员的这种动态发现如何传播到各种基本独立的机器上,可以使用 Akka 的工具集来完成。
我已经查看 Akka 的文档很长一段时间了,所以也许我在这里遗漏了明显的东西。如果是这样,请赐教:-)