我没有尝试过用Datomic Ions来做这件事,但是调查了在Google App Engine上做这个的可能性,我相当确信这是不可能的(直接使用)。
Ions类似于App Engine,是“弹性”系统 - 它们会在负载变化时启动/停止节点,而websockets是状态性的,即同一个服务器需要持续运行,因为它维护着与websockets客户端的连接。
理论上,Datomic将始终至少有两个节点持续运行(在产品配置中),所以你可能会争辩说它们可以支持一个节点上的websockets服务器,但我想即使在这种情况下也没有保证,因为节点可能会在任何时候失败和循环。
处理这个问题,我的想法是启动一个运行websocket服务器自己的EC2实例,并让客户端连接到该实例。websocket服务器可以对Ions发起调用,但我怀疑您想要推送一些实时数据(否则为什么要使用websocket),因此这样做:拥有一个事务函数,将信息写入消息队列(例如Amazon Simple Queue Service),websocket服务器可以在该队列上监听消息,并将其推送给客户端。
请记住,将事务函数内部的工作量保持到最低,否则您的Datomic事务吞吐量可能会严重受影响。所以
- 只将真正需要写入消息队列的内容,而不是每个已交易的数据项
- 使用类似于Amazon Simple Queue Service这样的工具,它可以与您发布的消息数量一起伸缩。不要直接使用websocket服务器进行调用
您还可以在Datomic论坛上提出这个问题,那里有一些人擅长回答问题。