我们将Ruby中的rest-client gem用于REST API的自动化测试。但是我注意到,在它发出的每个请求中,它还会对主机名进行DNS查找。在本地环境中,如果使用“localhost”,则测试运行速度很快,但是,如果使用正确的主机名,它们将花费2.5倍的时间,从而执行大量的DNS查找。

我认为这个问题与REST客户端无关,但与基本的Ruby网络有关。我尝试要求使用“resolv”和“resolv-replace”,但它们没有帮助。 “dig”报告DNS查询的TTL为1小时。

有没有办法让Ruby缓存DNS请求?我可以更改代码以显式使用IP地址,但这是解决此问题的错误位置。

我正在运行Ubuntu 12.04和Ruby 1.9.3。

最佳答案

您可以使用dnsruby gem将名称解析为地址,然后在调用中使用该地址。

#! /usr/bin/env ruby

# Gets the IP address of a host.

require 'dnsruby'  # gem install dnsruby first, of course

def hostname_to_ip_addr(host_name)
  query = Dnsruby::Message.new(host_name)
  response = Dnsruby::Resolver.new.send_message(query)
  response.answer[1].address
end

host_name = 'cnn.com'
ip_addr = hostname_to_ip_addr(host_name)
puts("Host name: #{host_name}, IP address: #{ip_addr}")

Gist的原始代码

09-16 00:46