6

REST API の自動テストのために、Ruby で rest-client gem を使用しています。ただし、リクエストごとに、ホスト名の DNS ルックアップも行うことに気付きました。ローカル環境では、「localhost」を使用するとテストは高速に実行されますが、適切なホスト名を使用すると 2.5 倍の時間がかかり、膨大な数の DNS ルックアップが実行されます。

この問題は、特に rest-client とは関係がなく、基本的な Ruby ネットワーキングに関連していると思います。「resolv」と「resolv-replace」を要求しようとしましたが、役に立ちませんでした。「dig」は、DNS クエリの TTL が 1 時間であることを報告します。

RubyキャッシュDNSリクエストを作成する方法はありますか? IP アドレスを明示的に使用するようにコードを変更することはできますが、それは問題を修正するのに不適切な場所です。

Ubuntu 12.04 と Ruby 1.9.3 を実行しています。

4

4 に答える 4

2

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の元のコード

于 2014-12-15T01:51:45.197 に答える
1

OS は通常、いくつかの dns 名のキャッシュを提供しますが、常に有効になっているとは限りません。

私の理解では、ruby は libc を使用して名前を解決します。したがって、これはプロセスごとに応答をキャッシュする可能性があります。ただし、libcについては完全にはわかりません。

Ruby プログラムでホスト名を手動で IP アドレスに解決し、返された IP アドレスを同じホストへの繰り返しのリクエストに使用することで、回避できる可能性があります。

ただし、これは SSL ターゲットへの接続ではうまく機能しない場合があります。多くの場合、証明書の検証はホスト名の一致に依存します。

Net::HTTP を使用せず、独自の DNS キャッシュを保持する素敵な ruby​​ ネットワーク ソケット gem があるかもしれません。

于 2014-04-03T22:17:55.983 に答える
0

rest-client コードを確認したところ、Net::HTTP を使用しているだけで、ソケットを使用しています。

次に、すべてが Ruby インタープリターの実装に消えます。ここで、私の知識は少し弱くなります (MRI を使用しているか、JRuby を使用しているかによって、動作が変わる可能性があります)。

DNS解決は最終的にOSに委ねられると思いますが、おそらく問題はホストの奇妙なリゾルバー構成にあるのでしょうか?

于 2012-08-30T21:11:21.400 に答える