HN user

chanks

2,008 karma

github: chanks gmail: christopher dot m dot hanks

Posts34
Comments37
View on HN
www.bna.com 8y ago

Tech Startup Fires Engineers Amid Union Organizing Effort

chanks
9pts0
github.com 12y ago

Show HN: Que, a crazy-fast Ruby-PostgreSQL job queue

chanks
2pts0
news.ycombinator.com 12y ago

Show HN: Que, a Ruby-PostgreSQL job queue with ~20x the throughput of DelayedJob

chanks
6pts0
gist.github.com 12y ago

Turning PostgreSQL into a queue serving 10,000 jobs per second

chanks
5pts0
github.com 12y ago

Que: A fast, concurrent job queue for Ruby and PostgreSQL

chanks
3pts2
www.washingtonpost.com 12y ago

U.S. intelligence agencies have their own Twitter. It’s called eChirp

chanks
2pts0
www.postgresql.org 13y ago

Extra security measures for next week's releases

chanks
197pts41
www.databasesoup.com 13y ago

PostgreSQL 9.3: Current Feature Status

chanks
9pts0
www.forbes.com 13y ago

How Zappos' User Agreement Failed In Court and Left Zappos Legally Naked

chanks
11pts3
postgres.heroku.com 14y ago

Heroku's new, free PostgreSQL 9.1 development database

chanks
94pts25
rhaas.blogspot.com 14y ago

Postgres 9.2 will feature linear read scalability up to 64 cores

chanks
262pts107
momjian.us 14y ago

The Most Important Postgres CPU Instruction

chanks
1pts0
www.xzilla.net 14y ago

Understanding Postgres Durability Options

chanks
2pts0
rhaas.blogspot.com 14y ago

Speeding up COUNT(*) in PostgreSQL

chanks
2pts0
rhaas.blogspot.com 14y ago

PostgreSQL - Index-Only Scans: We've Got 'Em

chanks
3pts0
www.xaprb.com 14y ago

When systems scale better than linearly

chanks
1pts0
rhaas.blogspot.com 14y ago

Scalability, in Graphical Form, Analyzed

chanks
2pts0
it.toolbox.com 14y ago

RIP Ingres

chanks
6pts2
xkcd.com 14y ago

Password Strength

chanks
52pts4
programmers.stackexchange.com 15y ago

Why don't relational databases support returning information in a nested format?

chanks
5pts0
arstechnica.com 15y ago

Sen. Ron Wyden places a "hold" on the Protect IP Act

chanks
197pts29
arstechnica.com 15y ago

Doctors and dentists tell patients, "all your review are belong to us"

chanks
187pts76
engineering.twitter.com 15y ago

Twitter Engineering Blog: Faster Ruby (Kiji Update)

chanks
15pts3
www.itproportal.com 15y ago

Steve Wozniak Calls Paul Allen A Patent Troll

chanks
90pts18
weblog.rubyonrails.org 15y ago

Rails 3.1 beta 1 released

chanks
77pts15
www.nytimes.com 15y ago

Google Takes to TV to Promote Browser

chanks
2pts0
management.fortune.cnn.com 15y ago

Want to attract top tech talent? Offer telecommuting

chanks
316pts173
twitter.com 15y ago

Rails 3.1 will ship with jQuery as the default JavaScript library

chanks
5pts0
arstechnica.com 15y ago

Judge allows Sony to see IPs of those visiting PS3 jailbreak site

chanks
1pts0
aws.typepad.com 15y ago

Amazon Web Services Blog: Rack and the Beanstalk

chanks
4pts0
Why Rust? 4 years ago

I'm very curious how well this is working for you in practice, since I've been thinking about what it would look like to share a single Rust UI implementation across a webapp and native apps.

If you have a table that undergoes frequent updates and this is a concern of yours, look into setting a fillfactor on it. This will help Postgres keep writes in the same page, which means it doesn't need to touch indexes for non-indexed columns.

Edit: non-updated columns, I mean.

That is, indeed, what Sequel does. You can query the database object directly (for example, `DB[:posts].where{comments_count > 5}.exclude(poster_name: "Bob").order(:comments_count.desc).limit(10).all`) and get back an array of hashes.

Sequel's model layer is also faster than ActiveRecord's, because much of the additional functionality that ActiveRecord piles onto all records (dirty tracking, single table inheritance, etc.) are available in Sequel via a plugin system. You can enable the plugins you want to use and not pay the overhead of all the others. You can even enable specific plugins for only the models where you'll actually want to use them.

It also has a lot less magic (no association proxies, unless you enable the plugin for them :)), ridiculously customizable (many more options for associations, custom eager loading logic, and so on), and has an implementation of its Postgres adapter written in C for performance.

Highly, highly recommended.

Edit: Oh, and an issue tracker that is almost always at zero, with a very fast response time. As someone who has contributed a patch to ActiveRecord, I can't tell you how nice that is.

(I'm the author of Que, the job queue discussed in the post most extensively)

This isn't terribly surprising to me, since I have an appreciation for what long-running transactions will do to a system, and I try to design systems to use transactions that are as short-lived as possible on OLTP systems. I realize that this should be explicitly mentioned in the docs, though, I'll fix that.

I'll also note that since the beginning Que has gone out of its way to use session-level locks, not transaction-level ones, to ensure that you can execute long-running jobs without the need to hold open a transaction while they work. So I don't see this so much as a flaw inherent in the library as something that people should keep in mind when they use it.

(It's also something that I expect will be much less of an issue in version 1.0, which is set up to use LISTEN/NOTIFY rather than a polling query to distribute most jobs. That said, 1.0 has been a relatively low priority for much of the last year, due to a lack of free time on my part and since I've never had any complaints with the locking performance before. I hope I'll be able to get it out in the next few months.)

My point is that the only way to wrap your jobs in the same transactions as the rest of your data is to have your job queue in your RDBMS. If you don't have that, you can't guarantee that they are consistent, that your backups have snapshots of each at the same time, etc.

Inconsistency between jobs and the rest of your data isn't a problem for many (or even most) use cases, but there are certainly times when you need it.

The major benefit of putting your queue in your RDBMS, which isn't commonly brought up in these discussions, is that it lets you protect your jobs with the same ACID guarantees as the rest of your data. This is very valuable for some use cases.

I have a Postgres-based job queue that uses advisory locks to get around some of the drawbacks he mentions (job lock queries don't incur writes or block one another like SELECT FOR UPDATE would). Feedback is welcome: https://github.com/chanks/que

Hi, I'm the author of Que. It's true that you can't really completely solve the idempotence problem for jobs that write to external web services (unless those web services provide ways for you to check whether you've already performed a write - see the guide to writing reliable jobs in the /docs directory), but that's a limitation that'll apply to any queuing system. I'd definitely say that Que, being transactional and backed by Postgres' durability guarantees, does give you better tooling for writing reliable jobs than a Redis-backed queue would in general.

I'm happy to answer any questions you or anyone else might have.

What I would find helpful is some sort of operator to merge two JSON values. I use a JSON field to collect various statistics relating to a table's rows, and it'd be nice to not have to worry about overwriting old values. Something like:

json_merge('{"a":5,"b":7}', '{"b":6,"c":8}') -> '{"a":5,"b":6,"c":8}'

One thing people don't mention that often with Postgres, but is worth some attention, is the Heap-Only Tuples (HOT) optimization that was added in 8.3. During an UPDATE, Postgres will try to fit the new version of the row on the same page as the old one - if it's able to do this, it means the indices don't have to be updated at all.

So if you're expecting a table to have a heavy UPDATE load it may be a good idea to lower its fillfactor from the default of 100 (for example, ALTER TABLE foo SET (fillfactor = 95);). This means that once a page is 95% full no new rows will be inserted into it, and the remaining 5% will be available for updated rows. HOT will also do "mini-vacuums" on individual pages as needed to free up space.

Of course, it's up to you to decide whether this tradeoff is worth increasing the effective size of your table by ~5%. But even tables with fillfactors at the default of 100 will get some benefit from HOT.

More info: https://github.com/postgres/postgres/blob/master/src/backend...

Edit to add: One caveat is that HOT won't work if you UPDATE a column that is indexed - then, of course, Postgres will have to touch the index.

I strongly recommend Sequel for Ruby:

http://sequel.rubyforge.org

It provides an ActiveModel-compliant interface, so it works fine with Rails. It also has a lot less magic (associations don't use proxy objects, for example) and has a lot of features that ActiveRecord is sorely missing (such as complete support for composite primary keys). I don't know what your other problems with ActiveRecord are, but Sequel is definitely worth a look. I'm very happy with it.

I love Rails, but I strongly disagree with its philosophy of the DB as being just a dumb data store. Two things I would recommend.

One, the book Enterprise Rails. It's a few years old, so all the examples are from Rails 2, but the meat of it is about proper database design, including the stuff that Rails doesn't believe in (composite primary keys, foreign key constraints, check constraints, triggers). Chapter 4, about the importance of data integrity, was probably the single most useful thing I've read about web development in the past few years.

Most of it is on Google Books (although sadly, chunks of chapter 4 are missing): http://books.google.com/books?id=thTju-4duY4C&printsec=f...

Second, the best thing I did was replace ActiveRecord with Sequel. Sequel has built-in support for all of those things that ActiveRecord doesn't (I couldn't live without its composite primary key support), and is in general a much more robust library than ActiveRecord. It also supports more exotic SQL features like CTEs and CASE statements without forcing you to drop down to writing raw SQL (though you can certainly do that if you want).

It's not a necessary upgrade for everyone. If your app has fairly simple models and relationships, ActiveRecord will probably be just fine for you. But if you want to get better with SQL and get closer to your DB, I think Sequel is a much better choice.

More info on Sequel: http://sequel.rubyforge.org/

It also integrates very well with Postgres - there's a C extension for the Sequel postgres adapter (https://github.com/jeremyevans/sequel_pg) and support for adding common triggers in migrations, counter columns and whatnot (https://github.com/jeremyevans/sequel_postgresql_triggers). It also supports the more exotic datatypes - hstore, arrays, even the json and range types that are coming in PG 9.2.

I switched from ActiveRecord to Sequel about a year ago because I needed good support for composite primary keys, and I've never looked back. It's a phenomenal library, highly recommended.

It looks like Heroku's dropping the larger shared database offering ($15/month for 20 GB). That's... disconcerting. That means their cheapest production database now is the Ronin for $200 a month, but I have an app going into production soon that won't need anywhere near that much power.

I only took a quick glance through the source, but what's with the MongoDB dependency? Is there a chance that what you're using it for could be replaced with Redis? I already use Redis, but I'm hesitant to introduce yet another database into my stack unless it's absolutely necessary.

The sticking point for me with Unity was switching between multiple open windows. I typically have a dozen or so terminals and gedit and Chrome windows open across a half-dozen workspaces, but if I want to bring (let's say) a specific terminal on my current workspace to the foreground, I couldn't figure out a better way to do it than to open up Unity's display of all the many terminals I have running and try to pick out which one I mean.

I'm open to trying it again once it's had a bit more polish, but I'm sticking with Gnome classic for now.