zackattackz

zackattackz

DBConnection Implementation via HTTP

Hello!

I am currently working on an implementation of an Ecto Adapter for XTDB v2.x. 2.x is not a production-ready version, but I just wanted to try to make this project as a way to learn more about Elixir and XTDB as well.

So first of course I would need to create a DB driver for Elixir. XTDB has an HTTP API so I figured I will implement the driver using that as the protocol.

To create a driver, it seems standard that you should implement the DBConnection.Connection behavior. I just have a few struggles with this.

1.) From looking at other DBConnection implementations (MyXQL, Postgrex), they all seem to implement their database-specific protocols via TCP. Then DBConnection is somehow able to keep these TCP connections alive (via pinging?). My question is, how would one implement a DBConnection for an HTTP based protocol, specifically for the ping callback. To my understanding, HTTP is stateless, so I don’t think there is a realistic way to implement ping for this. Should I just leave it undefined and force :idle_interval = 0? Which brings me to my next question…
2.) Is there anything to be gained from implementing DBConnection for an HTTP based protocol? The main value-gain from implementing DBConnection seems to be that it is able to pool and maintain open TCP connections. I don’t know if there are other benefits, but if this is not applicable to HTTP, then should I bother with implementing it in the first place?

Sorry if these are ill-informed questions, as my knowledge of network protocols is very low. Any advice is appreciated, thank you!

Most Liked

al2o3cr

al2o3cr

There’s “keepalive” in HTTP/1.1 that lets a connection be used for multiple sequential requests.

You’d need to check if XTDB supports it, though.

The goal of connection pooling for this is largely around reducing the number of SSL handshakes required - every time a new connection is opened it takes a bunch of network round-trips and cryptographic calculations.

ruslandoga

ruslandoga

:wave: @zackattackz

I implemented an HTTP driver for ClickHouse and DBConnection was very useful.

  1. You can GET /status for handle_ping, it would probably be enough to keep the connection alive.

  2. In addition to pooling and keeping connections alive, DBConnection provides a way to make them re-connect with backoff in case things go bad.

Just make sure to use an HTTP client without a pool!

Where Next?

Popular in Questions Top

Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
earth10
Hi, I’m just starting to build a side-project with Elixir and Phoenix and doing some basic test with Elixir alone. What strikes me is th...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New

Other popular topics Top

skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
AstonJ
Please see the new poll here: Which code editor or IDE do you use? (Poll) (2022 Edition) It’s been a while since we first asked this, I...
208 31142 143
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement