我没有使用 Datomic Ions 尝试过,但是研究过在 Google App Engine 上进行此操作的可能性,我相当确定这是不可能的(原装版)。
Ions,就像 App Engine,是“弹性”系统 - 当负载变化时,它们会启动/停止节点,而 WebSockets 是有状态的,即相同的服务器需要持续运行,因为它保持着 WebSockets 客户端的连接。
理论上,Datomic 将始终至少运行两个节点(在生产配置中),所以你可能会认为它们可以在其中一个节点上支持 WebSockets 服务器,但我认为即使在那里,你也没有保证,因为节点可能在任何时候失败并重新启动。
处理这个问题,我的想法是先启动一个运行websocket服务器的EC2实例,并让客户端连接到那个实例。websocket服务器可以向Ions发出调用,但我怀疑你可能想推送一些实时数据(否则为什么要使用websocket),这样做的办法是有一个事务函数,它将信息写入消息队列(例如,Amazon Simple Queue Service),websocket服务器可以监听这个队列上的消息,并将其推送给客户端。
请记住,将一个事务函数内的作业量保持在最小,否则可能会严重影响到Datomic的事务吞吐量。所以
- 只将真正需要的信息写入消息队列,而不是每个事务的datom
- 使用类似Amazon Simple Queue Service的解决方案,它会随着发布的消息数量自动扩展。不要直接通过websocket服务器进行调用
你还可以在Datomic论坛上提出这个问题,那里有一些很棒的人回答问题。