问题标签 [cowboy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - 我应该把我的静态文本文件放在哪里才能成为 OTPy?
我正在用cowboy构建一个服务器,并且我有一些我想要服务的静态 HTML 页面。是否有一个 OTP 友好的地方可以放置这种东西?有没有一种既定的方法来告诉钢筋在哪里寻找这种东西?
erlang - 如何使用 Cowboy 通过 websocket 异步发送数据?
我有一个Cowboy websocket 服务器,我想注册一个gen_event处理程序,通过 websocket 发送一些东西。我还需要能够使用websocket_handle/3
. 我在cowboy_http_websocket_handler.erl中没有看到任何明显的内容,并且没有导出cowboy_http_websocket:websocket_send/3。我是否错过了通过打开的套接字发送内容的简单方法?
ssl - SSL 响应被分成两个回调
我正在开发一个客户端-服务器应用程序,并负责添加对在 websockets 上运行的支持。我在服务器端使用 Cowboy,并且一直在使用 Erlang websocket 客户端进行测试。
事情应该是这样的:
- 客户端打开套接字连接并开始 http 握手
- 服务器完成http握手
- 客户端向服务器发送消息,服务器发送回复
- 客户端处理回复
- 重复 3 & 4
客户端模块实现
当数据出现时,它由底层传输(gen_tcp 或 ssl)调用。
当我将客户端和服务器配置为使用gen_tcp
. 当我改为使用ssl
时,websocket 握手完成,但在第 4 步中,我得到一个回调handle_info
,它只包含从服务器返回的数据的第一个字节。随后的回调将包含响应的其余部分。
我真的对这种行为感到困惑,因为交换了 gen_tcp 的相同代码可以正常工作,而且我们还有另外两个使用ssl
(但不是 websockets 或牛仔)构建的传输,它们同样没有表现出这种行为。
谁能建议可能导致数据以这种方式拆分的原因?如果不需要,我宁愿不必为此编写处理程序。
更新:只是为了好玩,我修改了客户端,以便它等待两个回调发生,并在尝试解析之前连接来自这两个回调的数据。这解决了问题,但仍然让我感到困惑。
不过,我确实注意到了几件事:
- 第一组两个回调总是包含一个字节
- 该字节始终为 130 (0x82)
不知道这是否相关。
erlang - Erlang 中的错误报告
我采用了牛仔示例代码并将其破坏。
默认请求处理程序的代码如下所示:
它直截了当,但我想制作返回文件,所以我将其更改为:
try-catch 应该处理可能没有文件的事实,但事实并非如此。这是为什么?
当我尝试获取一个不存在的文件时,我在控制台中收到一个很大的错误报告,谁能告诉我为什么?
erlang - 如何从 Cowboy 获取 http 参数?
我正在使用牛仔(https://github.com/extend/cowboy)作为一项宁静的网络服务,我需要从“http://localhost:8080/?a=1&b=2&c=32”获取参数
html - 在 Erlang Cowboy 中提供 html 文件,但它显示为文本
我正在尝试使用 Erlang Cowboy 提供动态生成的 html 页面,但它在 Firefox 14.0.1 中以文本形式出现。
这是从浏览器页面源复制的 doctype 和初始标题标签:
如果我不使用 doctype,它会按预期显示。
Bootstrap Scaffolding (http://twitter.github.com/bootstrap/scaffolding.html) 需要 html 文档类型。
我不确定这是否是我的 html 或 Cowboy 配置的问题。
这是 _app.erl 中 Dispatch 的相关部分:
有人可以告诉我我的方式错误吗?
非常感谢,
LRP
erlang - 如何在 Cowboy-server 中手动关闭 websocket-connection?
如何在 Cowboy-server 中手动(从服务器端)关闭 websocket 连接?我会在init/3的回调模块中检查登录名/密码,并用一些返回码踢“错误”的用户。做这个的最好方式是什么?
erlang - 与处理 websocket 连接的牛仔进程链接(cowboy,erlang)
我正在开发一个同时使用牛仔和 sockjs 的 erlang 应用程序,我想知道是否可以与处理 websocket 连接的牛仔进程链接?
现在,带有 gen_server 行为的进程与每个 websocet 连接相关联。这样的进程将 Conn 实例存储在 init 中,当客户端关闭连接时,该进程将从 websocket 处理程序中终止,如果 gen_server 进程终止,则从 gen_server 的 terminate() 调用 Conn:close 来进行清理。它有效,但我不喜欢这个解决方案,因为在某些情况下,即使启用了 trap_exit,也不会调用终止函数,所以如果可以进行链接,它会是更好、更简单的解决方案。
erlang - 在许多牛仔示例中,一对一主管的目的是什么
在 Cowboy github 上提供的示例中,以及我在网上找到的其他一些示例中,有一个一对一的主管似乎什么都不做。我什至相信我看到了一个带有以下评论的示例,“就像真正的主管什么都不做一样”。
这么多牛仔示例中的主管模块的目的是什么?
从 echo_get 示例:
http - Web 服务器对高客户端轮询率的容忍度:Cowboy 与 Yaws Web 服务器
我一直在构建一个实时通知系统。它是 Web 应用程序的一部分,但必须在事件发生时立即查看。长时间轮询不是一种选择,因为当没有可用事件时,Web 服务器保持连接会很昂贵,所以我不得不进行短期轮询。
每个客户端每隔 2 秒访问一次 Web 服务器(这是一个相当高的速率)。当事件可用时,它们将作为 JSON 发送到 JavaScript 客户端。现在,这需要一个服务器设置来处理大量的短期连接。我已经使用 Yaws Web 服务器实现了一个这样的系统。然而,因为 Yaws 启动了许多其他服务,感觉很重,当连接超过 30,000 时,连接开始被拒绝或中止(可能是因为我在 Yaws 运行的同一个 Erlang VM 中运行一些 ETS 表[分离这些可能需要rpc:call/4
,我担心这会增加延迟])。我知道有一些特定于操作系统的调整要做,而且已经完成了。
如果集群多个 Yaws 实例很容易,这将不是问题。在 Yaws 中,我使用了一些 appmod,并且我正在以 REST 的方式做事。我在想 Cowboy Web 服务器可能会在这里增强一些东西。我以前没有用过 Cowboy,但我用过 Misultin。看看 Cowboy,它是一个成熟的 OTP 应用程序,它似乎很容易集群,而且是轻量级的,可能会增加整个系统可以处理的客户端数量。存储在 Mnesia 上,我可以轻松地分配它以添加更多节点(可能通过复制),因此每个 Mnesia 实例前面都有一个 Cowboy 实例。
我的问题是:
我的猜测是否正确,如果我从 Yaws 切换到 Cowboy,我可能会显着提高性能?
Yaws 有一个干净的 API via
Appmods
和#arg{}
记录。Cowboy 是否有这两种东西的等价物(请说明)?可以
Cowboy
处理文件上传吗?如果是这样,您认为在频繁上传文件的情况下使用哪个服务器(Yaws 或 Cowboy)会更好?说明如何使用 Cowboy 完成文件上传。可以在同一台机器上运行多个 Yaws 实例。你认为为每台服务器(物理机)创建多个 Yaws 实例并将客户端负载分布在这些实例上会有所帮助吗?我需要知道什么?
当我设置
yaws.conf
参数max_connections = nolimit
时,如何在 Cowboy 中指定相同的参数?
现在,我关注了Cowboy 作者的采访,他讨论了 Cowboy 比 Yaws 更轻量级的原因。他说
最大的区别是使用二进制文件而不是列表。通用受体池是另一个。我可以列出很多其他的小差异,但我认为这些并不是最有趣的。
那是因为 Cowboy 使用了侦听器池库Ranch,它以某种方式最终具有处理更多连接的更高能力,以及使用二进制文件而不是列表。
同一采访中的另一句话:
由于我们每个连接使用一个进程而不是两个进程,并且我们使用二进制文件而不是列表,因此在没有用户干预的情况下,我们最终使用的内存比其他项目少得多。牛仔也很懒惰,除非需要,它不会做任何事情。所以在用户开始调用函数之前,我们没有太多内存。
我想知道 yaws 是如何处理这种情况的。不知何故,我的问题域需要轻量级的 HTTP 处理。与 Mochiweb、Misultin 或 Cowboy 相比,Yaws 确实会导致更多的内存消耗。我最担心的是,Yaws 拥有最好/最干净的 API,它使我们能够访问#arg{}
包含我们需要的所有内容作为 Erlang 记录,这样我们就可以自己将它们取出,而不是其他具有许多用于在外部提取内容的函数的 API。甚至文档:Yaws 文档也非常好且简单明了。也许我需要查看更多的 Cowboy 代码来处理文件上传和简单GET
请求POST
处理等问题。
否则,我之前提出的问题仍然是紧迫的问题。Yaws 相当不错,但对于这种快速、轻量级、短命、高率的民意调查情况似乎有点过头了,你怎么看?