santosh79

santosh79

Hi All,
I have just released a project that I had been hacking on for quite a while and would love to get your feedback. It’s basically redis implemented in Elixir. The line level protocol stays the same, this way people currently using Redis who’d (maybe) wish to switch to Remixdb, needn’t have to install new drivers/packages/what have you.

It’s still super experimental and I have some crazy ideas for doing real time sharding, moving processes across nodes in a cluster etc., but it’s no where near being reality, yet.

The repo is at – GitHub - santosh79/remixdb: Key/Value Store focussed on Concurrency and Distribution Primitives · GitHub.

Best,
Santosh

Showing Posts 1 to 10

findlaech

findlaech

That’s awesome, this project has all my attention :smiley:

mebezac

mebezac

Very interesting! On your README you say:

Fault Tolerance: Being able to bring back a key-value process when it goes down based on some last known state is trivial.

Can you explain a little bit how you achieve that?

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Your readme promises a lot, but your code doesn’t back it up. You need to be clearer in the readme that this is wildly alpha software.

Couple of points that raise some alarms:

  • https://github.com/santosh79/remixdb/blob/master/lib/remixdb.ex doesn’t create an OTP application
  • No supervisors. Not only is this bad practice, it goes against all general claims to fault tolerance in the Readme, as well as against explicit claims to use supervisors.
  • No distributed functionality, despite claiming so in the readme.
  • Your latest commit says “Using HashDicts for better hash performance” and the commit shows you’ve replaced a bunch of Maps with HashDicts. Not only is this false, Maps perform better in literally every case, but HashDicts are deprecated.
  • you’re creating an escript, but a release would be more appropriate for a long running service.
  • extensive use of spawn_link instead of using OTP behaviours.
  • unlinked processes.
  • You aren’t following elixir conventions for file organization

I’m not trying to discourage you, I think there’s a lot of value in thinking through how a key value store in Elixir might work. However, right now your readme is 100% aspirational, but written as if it reflects the current capabilities of your code. You do yourself and your users a disservice by not being clear on this point.

santosh79

santosh79 OP

Thanks for your input. Yes, I’ll be the first to agree the code is not
backing up what’s on the README. But the fact that this is being built in
Elixir means I have somewhat of a shot at making this real.

Ben Wilson - thanks for your suggestions. All of them are valid and I
should be addressing them shortly. To pick just 1 – the reason for the
switch to HashDicts was that “Elixir in Action” said they performed better
than Maps for larger collections. Is this wrong? If so, then yea it makes
sense I didn’t do it.

Again this is super experimental and all these issues such as – Making it
an OTP application, running it as a daemon are all in my list of things to
do. Heck, I need to be able to read a RDB file to be able to load in
existing Redis data!! So yea, I am in no way saying yank out Redis and go
and use this in production right now.

Thanks again for offering your inputs, looking at code.

Best,
Santosh

Qqwy

Qqwy

TypeCheck Core Team

Yes. This used to be the case, but in recent versions of Erlang (18+) this has been changed. Maps are now more performant than HashDicts. Also see http://www.theerlangelist.com/article/eia_elixir_12

santosh79

santosh79 OP

Thanks for sharing that article, I wasn’t aware of the deprecation of
HashDict.

Best,
Santosh

StevenXL

StevenXL

@santosh79,

Elixir in Action is an incredible resource and most of my knowledge of OTP comes from it. I see that you’ve already been pointed to the article that @sasajuric wrote when Elixir 1.2 came out.

Are you trying to create a Redis server? There are many client implementations that you can find redis.io itself, many Erlang and a few Elixir clients.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

I appreciate your response here, and I do believe that you had no intention of misleading any one.

My only further comment is to suggest that while some of these features (distribution) are definitely things that you can wait on for now and develop in time, others form the foundation of a proper Elixir package and should be prioritized higher, even over “basic functionality”. Specifically:

  • Organizing your code properly. It’s really hard for people to offer advice or contribute if there’s no real structure to the files.
  • Using supervisors. This one is crucial. It will also simplify the spaghetti of start_link calls that happen.
  • Generate a valid application. mix new with the --sup flag gives you the bare bones, and it’s covered in the getting started guides and virtually every elixir book.

Best of luck to you!

sasajuric

sasajuric

Author of Elixir In Action

Having a Redis protocol compatible k-v, but with an Elixir implementation certainly sounds interesting!

However, I’d advise against hand building the distributed k-v part yourself, as it can become hard to get proper CP or AP guarantees in a clustered environment. Instead, I’d suggest looking for third party libraries which solve those problems. The first ones which come to mind are riak_core for eventual consistency, and riak_ensemble for strong consistency. I also wonder whether recent work on Phoenix presence (i.e. CRDT) could be used for a general purpose distributed k-v, and what are the trade-offs. I’ll ping @chrismccord to hear his thoughts on this :slight_smile:

However, if you just want to practice and/or have fun, then it will probably be simpler to build from scratch, as long as you’re not optimistic about proper behaviour on netsplits. Getting that part right requires carefully applying some scientific papers and a good amount of testing. Otherwise various subtle errors might occur, and the storage might have unpredictable behaviour on netsplits.

I agree with other comments, especially those made by @benwilson512. An app should be OTP compliant, because strange bugs may occur, and it might not play nicely with the client’s project. If you’re still practicing, it’s fine to violate those principles and taking baby steps in whichever order suits your flow. However, the project Readme should clearly state that, because otherwise people may get false impression about the maturity of the library. Here’s an example of how we did it for our Phoenix socket client.

Best of luck!

santosh79

santosh79 OP

@StevenXL yes, I’m trying to create redis-server.

Where Next? Top

Trending in Announcing Top

wojtekmach
Hey everyone! Req is an HTTP client for Elixir that I’ve been working on for quite some time. There is already a lot of HTTP clients out...
New
handnot2
Samly can be used to enable SAML 2.0 Single Sign On in a Plug/Phoenix application. This library uses Erlang esaml to provide plug enabl...
New
woylie
Flop is an Elixir library that applies filtering, ordering and pagination parameters to your Ecto queries. offset-based pagination with...
New
restlessronin
The repo is at GitHub - cyberchitta/openai_ex: Community maintained Elixir library for OpenAI API · GitHub. Docs are at OpenaiEx User Gu...
152 11030 135
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
fuelen
Hi all! I want to present a small library which provides a mix task for generating an Entity-Relationship Diagram for Ecto schemas. You...
New
woylie
Phoenix components for pagination, sortable tables and filter forms with Flop and (optionally) Ecto. pagination cursor pagination sorta...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
mudasobwa
I am seeing a lot of aplications of Argumentum ad Vericundiam in software discussions. They do link some piece of writing and point us to...
New
bartblast
Hey folks, I just published a post about Hologram’s funding and where the project goes next - the short version: Curiosum as Main Spons...
New
sorenone
Today we’re releasing Oban for Python. Not an Oban client in Python. Not a pythonx wrapper embedded in Elixir. Nope, it’s a fully operati...
New
Herve37
We’re evaluating API mocking tools for OpenAPI-based projects and would love to hear what other teams are using. We’re particularly inte...
New
sergio
It’s not that it’s vocabulary is too advanced. It’s something worse. I get lost trying to follow even a paragraph written by Claude. It’...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews