#sql #database #postgres #futures #high-availability

sys pg_async

Asynchronous, HA (master-master) PostgreSQL driver on top of libpq

27 releases

0.8.6 Dec 16, 2018
0.8.5 Jun 22, 2017
0.8.3 May 1, 2017
0.5.1 Mar 30, 2017
0.3.1 Dec 31, 2016

#197 in Database interfaces

Download history 390/week @ 2019-12-08 28/week @ 2019-12-22 1/week @ 2019-12-29 43/week @ 2020-01-12 55/week @ 2020-01-19 2/week @ 2020-01-26 1/week @ 2020-02-02 29/week @ 2020-02-09 29/week @ 2020-02-16 203/week @ 2020-02-23 54/week @ 2020-03-08 28/week @ 2020-03-15 112/week @ 2020-03-22

349 downloads per month

MIT license

69KB
869 lines

pg_async.rs

Asynchronous, HA (master-master) PostgreSQL driver on top of libpq.

crate docs patreon

Vision

  • Designed to work with a master-master replicated database, such as BDR (but standalone databases are supported too).
  • Uses libpq, leveraging it's asynchronous support.
  • Maintains an asynchronous connection to every node of the replicated cluster.
  • Pings the nodes (with SELECT 1) to see who's closer/faster.
  • Every operation is a separate transaction.
  • If a node fails, the operation is transparently retried on another node.
  • Operations are exposed as futures.
  • futures are backed by a thread or two and can be used without a tokio reactor (because KISS).
  • Fast mode: send the operation to every node and return the first answer.
  • Pin mode: send the operation to one of the nodes only (useful to avoid some of the master-master conflicts).
  • There is a JSON helper converting table rows to serde_json objects.
  • If the operation wasn't pipelined already, dropping a Future allows the driver to cancel it.
  • Database-level timeouts can be used to terminate slow operations early.

Notes

The combination of libpq and OpenSSL doesn't work very well during PostgreSQL server restarts. I've seen libpq SEGV-crash reliably when the OpenSSL layer is enabled. For the driver to properly work around PostgreSQL server unavailability and restarts I recommend adding the "sslmode=disable" disabler to the connection strings.

Dependencies

~3.5MB
~72K SLoC