2024 State of Clojure 调查问卷! 中分享您的想法。

欢迎!请参阅 关于页面 获取更多关于该功能的信息。

+2
Libs

我们正在尝试设置 Clojure 服务器来处理 websockets,但我们正在使用 AWS 上的 datomic 的 ion 基础设施,这使得这并不容易。我想知道是否有人尝试过,或者有任何指导?

5 答案

+1 投票

被选中
 
最佳答案

我没有尝试过用 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论坛,那里有一些人能回答那里的问题。

我想尝试查找我阅读的关于如何在App Engine上执行此操作的文章,当然,第一个链接显示App Engine现在支持它(处于测试阶段)

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

AWS API网关通过Lambda支持WebSocket,所以也许可以使用ions设置它。我还没有亲自尝试,但仍有希望。

+1 投票

这取决于您的用例,但如果你只是保持
用来自服务器的实时信息来维持一个页面的活跃

你可以使用服务器发送事件和正常的HTTP请求来获取消息
将消息发送回服务器

如果服务器崩溃,客户端将优雅地重新连接到下一个组件

0

你没有说发生了什么...是否有js错误?爆炸了?开始播放Toby Keith了吗?我还没有连接到一个WebSocket,但我使用了

我点击提交过早了。顺便说一句,尝试datomic论坛也可能是个好主意。
0

这是一个老帖子了,但这是我在搜索“ions + websockets”时出现的唯一帖子,所以为了回答类似问题的其他人的利益,我在这里发了一个链接。

在Datomic论坛中有很好的答案

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

...