我还没有尝试过使用Datomic Ions来这样做,但经过研究,我非常确信这不可能直接实现(开箱即用)。
Ions,像App Engine一样,是'弹性'系统 - 它们会根据负载的变动启动/停止节点,而websockets是状态性的,即相同的服务器需要持续运行,因为要维护与websocket客户端的连接。
理论上,Datomic将始终至少运行两个节点(在生产配置中),所以你可能会认为它们可以在其中一个节点上支持websockets服务器,但我认为即使在这里,你也无法保证,因为节点可能会在任何时候失败和旋转。
我认为处理这个问题的方法是启动自己的运行WebSocket服务器的一个EC2实例,并让客户端连接到该实例。WebSocket服务器可以对Ions进行调用,但我怀疑你可能想推送一些实时数据(否则为什么要使用WebSocket),因此可以这样做:有一个事务函数会将信息写入消息队列(例如Amazon Simple Queue Service),WebSocket服务器可以监听队列中的消息,并将其推送到客户端。
请记住,将工作内容限制在事务函数内,尽可能少,否则你的Datomic事务吞吐量可能会严重受到影响。所以
- 只把真正需要写入消息队列的内容,而不是每个被事务处理的datom
- 使用跟随着你发布消息数量的亚马逊简单队列服务之类的产品进行扩展。不要直接调用你的WebSocket服务器
你还可以在Datomic论坛上提出这个问题,那里有一些很会回答问题的人。