mirror of
https://github.com/internetarchive/warcprox.git
synced 2025-01-18 13:22:09 +01:00
The last approach was not good, timeout of 0.1 seconds was too short. A bunch of stuff has to happen in the timeout period inside of rethinkdb.connect(). It doesn't offer a way to set only the socket timeout. Even a timeout of 0.5 seconds results in a noticeable error rate. The new approach is to put a server in the penalty box for 5 minutes when it errors. While the server is in the penalty box, we don't try to connect to it, unless all the servers are in the penalty box, in which case we try the server that errored least recently.
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.. image:: https://travis-ci.org/internetarchive/doublethink.svg?branch=master
:target: https://travis-ci.org/internetarchive/doublethink
doublethink
============
RethinkDB python library. Provides connection manager and ORM framework
(object-relational mapping, sometimes called ODM or OM for nosql databases).
Connection Manager
------------------
Three main purposes:
- round-robin connections among database servers
- make sure connections close at proper time
- retry retry-able queries on failure
Not currently a connection pool, because it doesn’t keep any connections open.
Should be possible to implement connection pooling without changing the API.
However, testing suggests there would be no appreciable performance gain from
connection pooling.
Usage Example
~~~~~~~~~~~~~
::
import doublethink
rr = doublethink.Rethinker(['db0.foo.com', 'db0.foo.com:38015', 'db1.foo.com'], 'my_db')
rr.table('mytable').insert({'foo':'bar','baz':2}).run()
for result in rr.table('mytable'):
print("result={}".format(result))
ORM
---
Simple yet powerful ORM system. *Does not enforce a schema.*
Usage Example
~~~~~~~~~~~~~
::
import doublethink
rr = doublethink.Rethinker(['db0.foo.com', 'db0.foo.com:38015', 'db1.foo.com'], 'my_db')
class MyTable(doublethink.Document):
pass
MyTable.table_create(rr)
doc1 = MyTable(rr, {'animal': 'elephant', 'size': 'large'})
doc1.save()
doc1_copy = MyTable.load(rr, doc1.id)
doc1_copy.food = 'bread'
doc1_copy.save()
doc1.first_name = 'Frankworth'
doc1.save()
doc1.refresh()
Service Registry
----------------
Now also has a ServiceRegistry class, a lightweight solution for service
discovery for distributed services. Maintains service info and status in
a rethinkdb table called “services”.
Description
Languages
Python
97.1%
Dockerfile
2%
Shell
0.9%