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