我没有使用Datomic Ions尝试过,但研究了在Google App Engine上完成这一点的可能性,我相当确信这是无法直接实现的。
Ions,就像App Engine一样,是“弹性”系统 - 它会根据负载的变化启动/停止节点,而WebSockets是状态性服务,这意味着同一个服务器必须持续运行,因为它与WebSockets客户端保持连接。
从理论上讲,Datomic总会在生产配置中保持至少2个节点在不断运行,所以你可能会说它们中可能支持一个WebSockets服务器,但我认为即使在这里,你也没有保证,因为节点可能会在任何时候失败并重新启动。
处理这个问题的方式,我认为是启动一个运行WebSocket服务器的EC2实例,然后让客户端连接到该实例。WebSocket服务器可以调用Ions,但我觉得你可能想推送一些实时数据(否则为什么要用WebSocket),因此可以采取的做法是有一个事务函数将信息写入消息队列(例如Amazon Simple Queue Service),而WebSocket服务器可以监听该队列上的消息,并将其推送到客户端。
请记住,将事务函数内的作业量保持在最低限度,否则Datomic上的事务吞吐量可能会受到严重影响。所以
- 只将真正需要写入的消息队列中的内容, 不要将所有正在交易的datom都写入
- 使用类似Amazon Simple Queue Service的东西,它可以根据你发布消息的数量进行扩展。不要直接调用你的WebSocket服务器
您也可以在Datomic论坛上询问这个问题,那里有一些人在回答问题。