gpt4 book ai didi

ruby - 使用 EM-HTTP : unable to create new socket: Too many open files 使用队列

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:56 24 4
gpt4 key购买 nike

我有一个使用 amqp gem 从 RabbitMQ 队列消费消息的 ruby​​ 进程,像这样:

require "bundler/setup"
require "amqp"
require 'eventmachine'
require 'em-http'


AMQP.start(:host => $AMQP_URL) do |connection|
@channel ||= AMQP::Channel.new(connection)
@queue ||= @channel.queue("results")

puts " [*] Waiting for messages. "

@queue.subscribe do |body|
http = EventMachine::HttpRequest.new(URL).post :body => body

http.callback {
# do something
}

http.errback {
$LOG.error "[errorback] -> #{http.error}"
}
end
end

现在 URL 很慢,队列中有太多消息 ( > 30K ),我在日志中得到了这个错误:

**[errorback] -> unable to create new socket: Too many open files** 

任何帮助将不胜感激,因为我一直在尝试找出解决方法,但没有任何结果。

提前致谢

最佳答案

您消费消息的速度太快了。由于您基本上一次获取所有未传递的消息(即 RabbitMQ 可以传递它们的速度),并为每条消息打开一个 HTTP 连接,您最终会消耗系统的所有可用资源(在本例中为并行打开套接字的数量) .

阅读 message acknowledgements 上的文档后和 AMQP::Queue#subscribe ), 我建议对您的代码进行这些更改:

AMQP.start(host: $AMQP_URL) do |connection|
@channel ||= AMQP::Channel.new(connection)
@channel.prefetch(5)
@queue ||= @channel.queue("results")

# disable auto-ack, switch to manual mode
@queue.subscribe(ack: true) do |meta, body|
http = EventMachine::HttpRequest.new(URL).post body: body

http.callback {
# do something

# acknowledge message consumption
meta.ack
}

http.errback {
# ...
# do not `meta.ack` here, so the message gets redelivered
}
end
end

通过这种方式,您可以非常轻松地控制工作量。

关于ruby - 使用 EM-HTTP : unable to create new socket: Too many open files 使用队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com