我没有尝试过使用 Datomic Ions 进行这项操作,但研究了在 Google App Engine 上进行此操作的可能性,我相当确定无法直接完成。
和 App Engine 一样,Ions 是“弹性的”系统 - 它们会在负载变化时启动/停止节点,而 Websocket 是有状态的,也就是说,需要不断运行相同的服务器以便保持与 WebSocket 客户端的连接。
在理论上,Datomic总会在生产配置中始终运行至少2个节点(常开模式),因此你可以认为他们可以在其中一个节点上支持websocket服务器,但我认为即使如此,也无法保证,因为节点可能随时会失败并重新启动。
我认为处理这个问题的方式是启动自己的EC2实例来运行websocket服务器,并让客户端连接到该服务器。websocket服务器可以对Ions进行调用,但我怀疑你可能想推送一些实时数据(否则为什么会使用websocket),所以要这样做,你可以有一个事务函数将信息写入消息队列(例如Amazon Simple Queue Service),websocket服务器可以监听该队列上的消息,并将消息推送到客户端。
请记住将事务函数内部的工作量保持到最小,否则你的Datomic事务吞吐量可能会受到严重影响。因此
- 只有将真正需要的内容写入消息队列,而不是每个被事务处理的datom
- 使用类似于Amazon Simple Queue Service的东西,它会随着发布的消息数量进行扩展。不要直接对websocket服务器进行调用
你还可以在此Datomic论坛上提出这个问题,那里有一些人正在回答相关问题。