좋아, 나는 그것을 내려 놓았다. 다음은 사실입니다.
- Redshift는 Postgres 8.0을 기반으로합니다. 확인하려면 psql을 사용하여 Redshift 인스턴스에 연결하고 "server version 8.0"을 확인하십시오.
- Keepalive 요청은 TCP 소켓 (link) 수준에서 지정됩니다. 연결 문자열 (link 9.0 릴리스 변경, libpq를 섹션의 E.19.3.9.1)
루비에서
- PG 보석이 libpq 라이브러리에 대한 래퍼입니다 를 지정할 때
- 포스트 그레스 8.0 킵 얼라이브 옵션을 지원하지 않습니다
기반 위의 사실에서 Redshift는 tcp keepalive를 지원하지 않습니다. 그러나 PG를 사용하면 설정된 연결에서 사용되는 소켓을 검색 할 수 있습니다. 이것은 libpq가 keepalive 기능을 설정하지 않더라도 우리는 여전히 수동으로 사용할 수 있음을 의미합니다.따라서이 솔루션은 : 그들은 범위에서 얻을 때
class Connection
attr_accessor :socket, :pg_connection
def initialize(conn, socket)
@socket = socket
@pg_connection = conn
end
def method_missing(m, *args, &block)
@pg_connection.send(m, *args, &block)
end
def close
@socket.close
@pg_connection.close
end
def finish
@socket.close
@pg_connection.close
end
end
def get_connection
conn = PGconn.open(...)
socket_descriptor = conn.socket
socket = Socket.for_fd(socket_descriptor)
# Use TCP keep-alive feature
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
# Maximum keep-alive probes before asuming the connection is lost
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT, 5)
# Interval (in seconds) between keep-alive probes
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL, 2)
# Maximum idle time (in seconds) before start sending keep-alive probes
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPIDLE, 2)
socket.autoclose = true
return Connection.new(conn, socket)
end
내가 Connection
클래스가 있기 때문에 루비 경향이다 프록시 소개하는 이유 (소켓 등) IO
객체 쓰레기를-수집합니다. 즉,이 프록시 클래스를 통해 구현되는 동일한 범위에 연결 및 소켓이 있어야합니다. 내 Ruby 지식은 깊지 않으므로 소켓 객체를 처리하는 더 좋은 방법이있을 수 있습니다.
이 방법이 효과적이지만 더 나은/더 나은 솔루션이 있는지 배우게되어 기쁩니다.
출처
2014-10-16 02:20:47
Tim
시간을내어 함께 해 주셔서 감사합니다. –