My company has a rails application as our product. As we add more
functionality, we are thinking of building new small, self-contained
rails applications rather than just chugging along with our single
monolithic application that we have right now.
What is the best way to do this? Is it even recommended?
My company, www.readMedia.com, specializes in press release
distribution over the web and our product is a 60,000 line Ruby on
rails application. We want to start adding some functionality that
sort of has to do with existing functionality, but not really. It
would use most of the same data, but the product could be sold
separately to new clients, or as an add-on to old clients.
The easiest thing to do would be to simply build that functionality
into our existing application. However, that has some drawbacks. As
the application gets bigger and bigger, and we hire more programmers,
the testing gets harder, the organization gets harder, deployment gets
harder, the code gets messier, et cetera.
What we would like to do instead is to build new functionality as a
separate rails application entirely. This has many advantages. Each
application/functionality can be upgraded independently, turned on or
off at will, have its own team of programmers who never have to worry
about stepping on the feet of other teams, source control becomes
easier, deployment is easier, et cetera.
The problem, to me, is that this seems to be technically really REALLY
hard, if not impossible. It sounds wonderful in theory, but can
(should) it even be done? Although the functionality of each
application would be different, they would share most of the same
data, such as our geographic table of zip codes and counties and our
history of sent releases.
One thought is to use the same database for each application. This
seems really tough. How would we keep the models in sync with each
other, because things such as validation is very important? Another
thought is to use multiple databases, one with the shared information,
and another for each application to hold its own stuff. Again, very
difficult. As far as I can tell, rails simply can’t use multiple
databases. I’ve found a plug-in or two that supposedly does this, but
I’m not sure I would trust it.
Another thought is to have some API between the old system and the new
applications that we are making. Although certainly possible, this
seems like an extraordinary amount of work. How do we secure
communication between applications? How do we share user accounts?
Making an API would basically mean re-creating all of the existing
functionality in an outward facing manner that can be called from
another application. I don’t really know how to do that, nor do I have
any experience with that sort of thing.
Another thought is to synchronize the data occasionally between our
applications. Have a background task that runs every night and updates
each database in sync with each other. This is a nice solution, but it
means that changes are propagated slowly, and syncing has historically
been very difficult in the programming world.
As my final thought, I’ve been thinking about what 37 signals does.
Their applications don’t really interact at all. You have to login
separately to each one, data isn’t shared between them, they are
basically separate products. In our situation we would like our
products to be more tightly intertwined than the 37 signals ones.
However, given that 37 signals doesn’t do it, perhaps it’s not
possible? It’s not what rails was designed to do? It’s a bad idea?
Anyway, what do all of you think? Do we just keep growing and growing
the main application? Do we force ourselves to create completely
If we can somehow segment functionality into different rails
applications that still work together as a whole, what is the best way
to do it? Has anybody tried? Does anybody have any experience with
this? Please share any tools, plug-ins, or best practices that you
think could help.
Thanks a lot!