gpt4 book ai didi

ruby - 来自 Ruby 的长期运行的 Redshift 事务

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:36 25 4
gpt4 key购买 nike

我使用 Ruby pg gem 在事务中运行多个 sql 语句。我遇到的问题是由于防火墙设置,这些查询的连接超时。提出解决方案here不起作用,因为它需要 jdbc 连接字符串,而且我在 Ruby 中(jRuby 不是一个选项)。将驱动程序移至 AWS 以删除防火墙也不是一种选择。

我的代码如下:

conn = RedshiftHelper.get_redshift_connection
begin
conn.transaction do
# run my queries
end
ensure
conn.flush
conn.finish
end

我现在正在研究 PG 异步 API。我想知道我是否可以使用 is_busy 来防止防火墙超时,或者类似的东西。不过,我找不到关于该主题的好文档。感谢任何提示。

PS:我已经解决了单个查询的这个问题 - 我可以异步触发它并使用系统 STV_INFLIGHT Redshift 表跟踪它的完成。事务不能以这种方式工作,因为我必须保持连接打开。

最佳答案

好的,我确定了。以下是事实:

  1. Redshift 基于 Postgres 8.0。要检查这一点,请使用 psql 连接到 Redshift 实例并看到它显示“服务器版本 8.0”
  2. Keepalive 请求在 tcp 套接字级别 (link) 上指定。
  3. Postgres 8.0 在指定连接字符串时不支持 keepalive 选项(link 到 9.0 版本更改,libpq 上的 E.19.3.9.1 节)
  4. Ruby 中的 PG gem 是 libpq 的包装器

基于以上事实,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 类的原因是因为 Ruby 倾向于在 IO 对象(如套接字)超出范围时对其进行垃圾回收。这意味着我们现在需要连接和套接字在同一个范围内,这是通过这个代理类实现的。我的 Ruby 知识不深,所以可能有更好的方法来处理套接字对象。

这种方法可行,但我很乐意了解是否有更好/更清洁的解决方案。

关于ruby - 来自 Ruby 的长期运行的 Redshift 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290382/

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