每个插入的Bigquery Streaming插入,持久或新的http连接?

时间:2015-10-11 06:58:40

标签: ruby google-bigquery google-api-ruby-client

我正在google-api-ruby-client使用Streaming Data Into BigQuery。所以每当有请求时。它被推入Redis作为队列&然后一个新的Sidekiq工作者试图插入bigquery。我认为它涉及在每个插入时打开一个与bigquery的新HTTPS连接。

方式,我有它设置是: 事件每1秒发布一次,或批量大小达到1MB(1兆字节)时,以先发生者为准。这是每个工作者,因此Biquery API可以通过多个HTTPS连接每秒接收数十个HTTP帖子。

这是使用Google提供的API客户端完成的。

现在的问题 - 对于Streaming插入,更好的方法是什么: -

  1. 持久HTTPS连接。如果是,那么它应该是一个在所有请求中共享的全局连接吗?或其他什么?
  2. 打开新连接。就像我们现在正在使用google-api-ruby-client
  3. 一样

1 个答案:

答案 0 :(得分:1)

我认为谈论这些优化很早就到了。如果您用尽内核的TCP连接,也会丢失其他上下文。或者有多少连接处于TIME_WAIT状态,依此类推。

  1. 在同一台计算机上工作池未达到每秒1000个连接之前,您应该坚持使用库提供的默认模式
  2. 否则,这将需要许多其他上下文,并深入了解其工作原理,以便在此处优化。

    1. 另一方面,您可以将更多行批处理到相同的streaming insert requests, the limits
    2. 最大行尺寸:1 MB
      HTTP请求大小限制:10 MB
      每秒最大行数:每表100,000行每秒 每个请求的最大行数:500
      每秒最大字节数:每个表每秒100 MB

      1. 阅读我的其他建议 Google BigQuery: Slow streaming inserts performance
      2. 我会尝试提供上下文,以便更好地了解端口耗尽时的复杂情况:

        让我们在一台机器上说你有30,000个端口池和每秒500个新连接(典型值):

        function myFunction() {
            document.getElementById("exampleInput").value = "after";
        }
        

        现在说你平均每秒看到550个连接。 突然间,没有任何可用的端口可供使用。

        因此,您的第一个选择是提高允许的本地端口范围; 很容易,但即使你尽可能多地打开它然后去 1025到65535,仍然只有64000个端口;你的60秒 TCP_TIMEWAIT_LEN,您可以平均维持1000个连接a 第二。仍然没有使用持久连接。

        这里更好地讨论了这个端口排气:http://www.gossamer-threads.com/lists/nanog/users/158655