[Twisted-Python] Twisted protocol as Django data source

Dan charnedn at muohio.edu
Thu May 28 20:38:01 MDT 2009


Thanks for all your replies.

Greg wrote:
> You might want to look into Orbited, there are a number of Django  
> examples
> out there:
>
> http://www.orbited.org

This looks very cool.  http://preview.tinyurl.com/3suqth (CometDaily)  
makes it seem extremely easy to develop for. Gonna play with this when  
I get a chance.

Jean-Paul wrote:
> Another option is to have Django talk to a Twisted process via some  
> RPC
> mechanism that won't require you to use Twisted in the Apache process.
> For example, XML-RPC.


I should have thought of this, as we're already using XML-RPC  
extensively in the application. All I'd really need to do is write a  
get_latest_data function and have Ajax poll Django poll XML-RPC. I  
keep forgetting that the GIL isn't anywhere near as much of a problem  
for this application now that it's Twisted than it was back when it  
was done entirely in threads.

And Esteve, there's a very good chance I'm going to start using  
Thrift. Thanks for pointing that out.

Alex wrote:
> I wrote up some thoughts on this here:
> http://clemesha.org/blog/2009/apr/23/Django-on-Twisted-using-latest-twisted-web-wsgi/
>
> basically it comes down to running Django off the very latest WSGI
> code (in the trunk still)
> found in twisted.web, which I've found to work very well.
>
> Also see here:
> http://blog.dreid.org/2009/03/twisted-django-it-wont-burn-down-your.html

WSGI is scary to me mostly because it's done in threads. Trying to  
find GIL-related bugs in the old code cost me a LOT of time. And while  
presumably this integration is done by people who are far better  
coders than I, I can't shake the thread safety thing.

Also, I almost never use someone else's svn head code if I can avoid  
it. This is partly because I don't consider myself a good enough  
debugger to file good reports against somebody's enormous source tree,  
but mostly because I want to be spending most of my time worrying  
about my code than someone else's.

The other unfortunate restraint is that Apache in this instance is non- 
optional, as the box we're using also houses mod_svn repositories.

Dave wrote:
> I don't think the database option is a hack. Have twisted write the  
> live
> stream items into a ring-buffer SQL database table (eg. use records  
> 1-100
> over and over again), including a timestamp for each entry. Then  
> your django
> page can always retrieve the most current set of entries by  
> SELECTing * from
> the table in descending order by timestamp, which django is good at,  
> staying
> live with constant refreshing. There are no interprocess communication
> pipes, broken sockets and timeouts etc. to screw up, no flaky  
> javascript to
> worry about, and the DBMS will handle the multiple simultaneous  
> separate
> data sources correctly. The central twisted application only has to  
> keep
> track of the buffer position. It's just not as much fun, though.

glyph at divmod wrote:
> Personally, I don't like using databases as a point of integration.
> Inevitably your Django app or your Twisted app will want to enforce
> constraints on the data and model things about the relationships  
> between
> rows beyond what one can glean by inspecting the SQL schema.

Okay, so calling it a "hack" probably wasn't a good choice of words. I  
was actually leaning strongly towards using our Postgres installation  
for Dave's reasons. But the thought of using the database for  
integration bothers me for precisely glyph's reason, even though we  
already have the multiplexer sticking data into Postgres. That's  
pretty much the driving worry behind my initial post. I'm trying to  
avoid Django's nice builtin database API like the plague because we  
store a LOT of data. Our indices have to be optimized for INSERTs; a  
typical query on this data comes with a human-noticeable delay (I  
haven't timed it, but on the order of a second). Doing that for 30-odd  
satellites isn't going to happen fast enough to make the UI smooth as  
we would like.

If I followed Dave's suggestion to the letter (ring-buffer), it would  
work, but something in me strongly resists storing the same data in  
two places. Probably the fact that every time I've done that, I've had  
sync issues. I could write a trigger for the synchronization, but that  
would break sqlite support, which I'm trying to keep in since it was  
requested at a conference.

Thank you all again for the advice, and I'm sorry if I misspelled  
anybody's name.

As I continue to work with this project, you'll doubtless hear from me  
again.

-Dan




More information about the Twisted-Python mailing list