Building Microservices: Free Ebook from O’Reilly and NGINX
nginx.com
nginx.com
Is this problem covered?
If these N things were just database writes to the same DB, transactions would save you, as you could just rollback. Without that, the answer has to be handled in code -- do you reverse the previous changes (if possible) by sending delete events, or leave the system in some sort of half-baked state and rectify things later via some other process? (I'm interested in hearing of other options...)
It's all very neat, though I'm doing a bad job explaining. Search for Amazon architectural presentations and hopefully you can find it. It may have been on James Hamilton's blog, maybe.
[1] - http://en.wikipedia.org/wiki/Consensus_%28computer_science%2... [2]- http://en.wikipedia.org/wiki/Paxos_(computer_science)
It's also why I think[1] we need to start building a framework[2] to provide standardised solutions (or at least patterns) to some of these problems.
[1]: https://vimeo.com/118895501 [2]: http://wym.io/
* Try Again Later: queue failed parts of the transaction for retry, moving towards eventual consistency
* Abort the Entire Operation: On failure issue a compensating transaction to roll back the previous successes
* Distributed Transaction: have some overall governing transaction manager process that orchestrates consistency (e.g. duplicate the transaction process of your monlithic data store up in the application layer). You could do a two-phase commit where each participant in the distributed transaction tells the transaction manager whether it thinks its local transaction can go ahead. "A single no vote is enough for the transaction manager to send out a rollback to all parties."
For each of these approaches there are issues, obviously, and to his credit he's pretty even-handed about them. He also says:
"If you do encounter state that really, really wants to be kept consistent, do everything you can to avoid splitting it up in the first place. Try really hard. If you really need to go ahead with the split, think about moving from a purely technical view of the process (e.g., a database transaction) and actually create a concrete concept to represent the transaction itself."
He gives an example of a domain model for a retail company of an order-in-process: instead of attempting to capture a user's order as a single database transaction, model the concept of an order flow of through fulfillment, shipping, marketing, accounting, etc.
It's all free.
If you're interested in more microservices stuff, here's the link to the first one. Fair warning, though: this isn't professionally produced or slick. It's just some schmuck (me) programming.
One thing I've found is that infrastructure stuff abounds for Java-based projects, doing much work for the message bus, metrics, and logging. But I find much less available for .Net, particularly for the latter two. Maybe you'll find some stuff that'll help me.
As an Agile coach, what I find interesting is conveying the philosophy of the work. I am nowhere near being a code ninja any more, but the way you think about writing the application is the most important part of doing the work.
But who knows? We'll see.
EDIT: To be a little clearer, message bus? You sure you need a full-bore bus? Make it work with simple files. Take a look at your volume. If you code it correctly from the start, adding on new stuff is easy. If you start with lots of frameworks and such, you can get caught up in complexities that are orthogonal to your mission. One of the beauties of going full functional is that it makes you focus on whether the dang thing is working or not. In an OO environment, many times you get lost in the "wiring" of the construction, making sure you implement the correct interfaces, paying attention to Demeter's Law and the rest. The end of the week comes and all you've got is forty thousand lines of code and 7 new dlls in your build.
Regarding the "full-bore bus" question, I see it being that way for two reasons:
1. Distributed architecture. I think that the way to foster simple deployment of updates services is making them distinct deployable units, and the most obvious way to do that is to put each on its own cluster of servers - although in most cases this is way overkill in scale. And I think that if the services are on different machines, that pushes away from a really simple approach like your idea of files, toward something more sophisticated. On the other hand, perhaps there's a good way to let the services be co-resident by using docker, which I don't yet know very well.
2. Capacity. Although most of the system isn't too heavy, I've got a couple services that are used ubiquitously, and probably do need serious high-performance. First, the legacy system at peak is handling about 25 product pricing queries per second (our pricing is customer specific and based on near-time availability from suppliers). Second, we have not just localization of text, but customer-specific text, so every bit of text everywhere needs to come from that customization engine, although I suspect that this may wind up being addressed more as caches at the UI layer.
My gut tells me the Ubuntu O/S can take quite a bruising. It'd be interesting to find out. Also there'd be some good lessons in there :)
Remember, the goal of microservices is to completely decouple processing so that you can completely configure the cloud graph any way you'd like. A microservices OO construct by definition would have to do a lot of honking around with the CPU before we got to the "work" part.
Of course what works for one team wouldn't work for another. Fun stuff to play around with, though.
No doubt. While I'm enamored with OO myself (having begun my professional life in the late 80s when it was the thing), I think that anything OO would be internal to a given service, and the interfaces between services would be much more conventional, most likely a simply REST approach.
(No side-interest here, just found it confusing that the page mentioned "hardcopy expected to be published in May")
You know, if it's free, you're the product and all that yadda yadda.
By posting the direct DL link here, you are discouraging similar free offers in the future. If I were you and I appreciated free offers, I would consider editing my post.
I have given O'Reilly my email before, but the content is absolute crap. They are spamming me even though I have cancel the subscription 3 times, hence direct link may bring them more marketing value than bunch of spam-only emails with fake names and phones numbers.
This is exactly why the direct link should be shared. I'd bet that most HN users aren't interested in "future marketing."
Still free though. I snatched a copy.