Clojure 2024现状调查中分享您的想法!

欢迎!请参阅关于页面获取更多关于这是如何运作的信息。

+2

我们正在尝试设置Clojure服务器来处理WebSockets,但我们正在使用AWS上的datomic的ion基础设施,这使得事情变得并不简单。我想知道是否有人尝试过,或者有任何提示?

5 个回答

+1

已被选中
 
最佳答案

我没有使用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论坛上询问这个问题,那里有一些人在回答问题。

我想尝试寻找我阅读过的关于如何在App Engine上实现这一点的文章,当然,第一个出现的链接显示了App Engine现在支持它(处于BETA版本)

https://cloud.google.com/blog/products/application-development/introducing-websockets-support-for-app-engine-flexible-environment
+3

AWS API网关通过Lambdas支持WebSocket。也许可以与Ions一起设置。我还没有亲自尝试,但是有希望。

+1

这取决于您的用例,但如果您只需保持
页面保持活跃,显示来自服务器的实时信息

您可以仅通过服务器推送事件和普通HTTP请求来完成
用于将消息发送回服务器

如果服务器对您进行了循环,客户端将优雅地重新连接到下一个盒子

0
... by

你没有说明发生了什么...是出现了js错误?是爆发了?是开始播放toby keith的音乐了吗?我还没有用WebSocket连接,但我使用过

... by
我太早点击提交了。顺便说一句,最好试试datomic论坛。
0
... by

这个帖子已经很老了,但这是我搜索Ions + websockets时出现的唯一一个帖子,所以我为有此问题的人发布了此链接。

Datomic论坛中有一个非常好的答案

https://forum.datomic.com/t/websockets-from-ions/1255

...