我还没有尝试使用 Datomic Ions 进行此操作,但我已经研究了在 Google App Engine 上进行此操作的可能性,我相当确定这是不可能的(原配)。
Ions,就像 App Engine,是“弹性”系统 - 它们将在负载变化时启动/停止节点,而 websockets 是有状态的,即相同的服务器需要持续运行,因为它维护着与 websockets 客户端(们)的连接。
理论上,Datomic 将始终保持至少两个节点持续运行(在生产配置中),因此您可能会认为其中之一可以支持 websockets 服务器,但我想说即使在这种情况下,您也没有保证,因为节点可能会在任意时刻失败并重新启动。
处理这种情况的方法是,启动自己的EC2实例运行websocket服务器,并让客户端连接到该服务器。websocket服务器可以向Ions发起调用,但您可能想要推送实时数据(否则为什么要使用websocket),因此这样做的方式是有一个事务函数,将信息写入消息队列(例如亚马逊简单队列服务),websocket服务器可以监听该队列上的消息,并将其推送到客户端。
请记住将事务函数内部的工作量保持在最低,否则Datomic的事务吞吐量可能会受到严重影响。所以
- 只将您真正需要的东西写入消息队列,而不是每个被事务处理的数据块
- 使用类似亚马逊简单队列服务的东西,它会随着发布的消息数量一起扩展。不要直接对你的websocket服务器进行调用
您也可以在这个Datomic论坛上提出这个问题,那里有一些人很好地回答了相关问题。