Sha256: 5b72ada2d1c07dce6b9f1dd9718f998137f4bf166f2d258158820a68702b4b3a

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

# frozen_string_literal: true

require "delegate"
require_relative "limiter/distributed_rate_queue"
require_relative "json_rpc_client"
require_relative "throttled_json_rpc_client/version"

module ThrottledJsonRpcClient
  class Client < SimpleDelegator
    DEFAULT_MAX_RETRIES = 3
    DEFAULT_BASE_DELAY = 1 # Base delay in seconds

    # limit: #{rate} requests / #{interval} seconds
    def initialize(
      endpoint,
      timeout: JsonRpcClient::DEFAULT_TIMEOUT,
      max_batch_size: JsonRpcClient::DEFAULT_MAX_BATCH_SIZE,
      headers: {},
      # retry params
      max_retries: DEFAULT_MAX_RETRIES,
      base_delay: DEFAULT_BASE_DELAY,
      # limit params
      rate: 5, 
      interval: 1, # in seconds
      redis_urls: ["redis://localhost:6379/2"]
    )
      @max_retries = max_retries
      @base_delay = base_delay
      @queue = DistributedRateQueue.new(
        redis_urls: redis_urls,
        key: "key:#{endpoint}",
        rate: rate,
        interval: interval
      )
      super(
        JsonRpcClient.new(
          endpoint, 
          timeout: timeout, 
          max_batch_size: max_batch_size, 
          headers: headers
        )
      )
    end

    def call(method, params = nil)
      retries = 0
      begin
        @queue.shift do
          super(method, params)
        end
      rescue JsonRpcClient::RpcError => e
        retries += 1
        if retries <= @max_retries
          delay = @base_delay * (2**(retries - 1))
          sleep(delay)
          retry
        end
        raise e
      end
    end

    def batch_call(calls)
      retries = 0
      begin
        @queue.shift do
          super(calls)
        end
      rescue JsonRpcClient::RpcError => e
        retries += 1
        if retries <= @max_retries
          delay = @base_delay * (2**(retries - 1))
          sleep(delay)
          retry
        end
        raise e
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
throttled_json_rpc_client-0.2.0 lib/throttled_json_rpc_client.rb