Or How Monte Python taught me to program
Sometimes you learn the most from boring conference calls. In this case, I was listening to a deployment that was so painfully reference-example super-redundant by-the-book that I could have completed the presenter’s sentences. Except that he kept complaining about the cost. It turns out that our typical failure-proofed belt-and-suspenders infrastructure is really, really expensive.
Shouldn’t our applications be Monte Python’s Black Knight yelling “It’s just a flesh wound! Come back and fight!” Instead, we’ve grown to tolerate princess applications that throw a tantrum of over skim milk instead of organic soy in their mochaito.
Making an application failure-ready requires a mindset change. It means taking of our architecture space suit and donning our welding helmet.
Fragility is often born from complexity and complexity is the compounded interest from system design assumptions.
Let’s consider a transactional SQL database. I love relational databases. Really, I do. Just typing SELECT * FROM or LEFT OUTER JOIN gives me XKCD-like goose bumps. Unfortunately, they are as fragile as Cinderella’s glass slippers. The whole concept of relational databases requires a complex web of sophisticated data integrity we’ve been able to take for granted. The web requires intricate locking mechanisms that make data replication tricky. We could take it for granted because our operations people have built up super-complex triple-redundant infrastructure so that we did not have to consider what happens when the database can’t perform its magic.
What is the real cost for that magic?
I’m learning about CouchDB. It’s not a relational database, it a distributed JSON document warehouse with smart indexing. And compared some of the fine grained features of SQL, it’s an arc welder. The data in CouchDB is loosely structured (JSON!) and relationships are ad hoc. The system doesn’t care (let alone enforce) that if you’ve maintained referential integrity within the document – it just wants to make sure that the documents are stored, replicated, and indexed. The goodness here is that CouchDB allows you to distribute your data broadly so that it can be local and redundant. Even better, weak structure allows you to evolve your schema agilely (look for a future post on this topic).
If you’re cringing about lack referential integrity then get over it – every SQL backed application I ever wrote required RI double-checking anyway!
If you’re cringing about possible dirty reads or race conditions then get over it – every SQL backed application I ever wrote required collision protection too!
I’m not pitching CouchDB (or similar) is a SQL replacement. I’m holding it up as an example of a pragmatic approach to failure-ready design. I’m asking you to think about the hidden complexity and consequential fragility that you may blindly inherit.
So cut off my arms and legs – I can still spit on your shoes.