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