Awlexus

Awlexus

Hello, I’m using the tesla library to send http requests to a host. However I’m supposed to keep the amount of concurrent requests somewhat low.

To achieve this I used poolboy. The problem with this approach however is that I have to use mock_global during testing, which is not a problem for now, but could become one later on.

Is there a better alternative to this approach? My current telsa adapter is hackney, but it doesn’t matter, if I have to switch.

Showing Posts 1 to 6

slashdotdash

slashdotdash

Take a look at one of the following open source libraries which can be used to rate limit requests.

You could use the external host name as the rate limit identity. Writing your own Tesla middleware to apply the rate limit might be a good approach. Take a look at the existing fuse middleware for inspiration.

arcanemachine

arcanemachine

Just checking to see if there are any new opinions on this topic. :wave:

EDIT: Came across this other post, which recommends a couple resources:

arcanemachine

arcanemachine

Follow-up: It turns out the solution I needed is built into Hackney.

To limit the maximum number of connections for a given Tesla Client (using the Hackney adapter), you can just configure Hackney’s pool and max_connections options when configuring the adapter:

  adapter({
    Tesla.Adapter.Hackney,
    pool: :some_hackney_pool,
    max_connections: 10
  })

Seems to work as expected so far. Each pool appears to work independently of the others. :slight_smile:

arcanemachine

arcanemachine

To provide a bit of follow-up context from what I learned while doing this:

  • This works by (ab)using the connection pool feature built into Hackney. (TLDR: HTTP connection pools save time and resources by re-using HTTP connections, which saves time doing DNS resolution, negotiating SSL/TLS security, etc.)

  • Because this is not what connection pools are intended for, it is is definitely a “hack” (although I found it to be a pretty effective one).

  • If you (ab)use Hackney’s connection pool settings to do this, you should probably set timeout: 0 when configuring the Hackney adapter to ensure that no connections are actually kept alive.

lkananowicz

lkananowicz

@arcanemachine Thanks for sharing these hacks :slight_smile:, I am not sure I understand them though, I set new pool as:

:hackney_pool.start_pool(:my_connection_pool, [timeout: 120_000, max_connections: 100])

and then in Elixir app config I set:

config :tesla, adapter: {Tesla.Adapter.Hackney, recv_timeout: 120_000, pool: :my_connection_pool}

but when I inspect via:

iex(1)> Application.get_all_env(:hackney)
[
  timeout: 150000,
  maxr: 10,
  maxt: 1,
  restart: :permanent,
  max_connections: 50,
  shutdown: 10000
]

So it seems it does not work, how can I set my own custom pool for hackney?

adamu

adamu

Not concurrent requests in general, but for concurrent requests to the same URL I wrote a Tesla Middlewear library that handles this:

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews