23,99 €
If you are a .NET developer who wants to eliminate the problems related to defective third-party web service integration or batch job failures, then this is the book for you. It is also perfect for those of you who are new to NServiceBus and service-oriented architecture and would like to learn how you can streamline all of your development efforts.
Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:
Seitenzahl: 277
Veröffentlichungsjahr: 2015
Copyright © 2015 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.
First published: August 2013
Second edition: January 2015
Production reference: 1250115
Published by Packt Publishing Ltd.
Livery Place
35 Livery Street
Birmingham B3 2PB, UK.
ISBN 978-1-78439-292-5
www.packtpub.com
Author
David Boike
Reviewers
Prashant Brall
Roy Cornelissen
Hadi Eskandari
Daniel Marbach
Commissioning Editor
Dipika Gaonkar
Acquisition Editor
Larissa Pinto
Content Development Editor
Kirti Patil
Technical Editor
Chinmay S. Puranik
Copy Editors
Dipti Kapadia
Vikrant Phadke
Project Coordinator
Kranti Berde
Proofreaders
Simran Bhogal
Maria Gould
Ameesha Green
Bernadette Watkins
Indexer
Monica Ajmera Mehta
Graphics
Sheetal Aute
Abhinash Sahu
Production Coordinators
Arvindkumar Gupta
Nilesh R. Mohite
Cover Work
Arvindkumar Gupta
Nilesh R. Mohite
Unlike many people who write a foreword for a book, I have myself not actually written a book yet, so I am probably going about this the wrong way. Also, of all the books that I have read, I have almost never read the foreword, which makes me wonder who is actually reading this.
That being said, I think that 10 years of blogging has actually prepared me very well to write this foreword, and it will end up being roughly as long as my regular blog posts.
In any case, I am extremely happy to see how well the first edition of this Learning NServiceBus book has done, and when David asked me to write the foreword for this second edition, I was more than willing to oblige.
Now that you've picked up this book, I think it's fair to assume that you have heard something about NServiceBus, maybe even downloaded it, played with it, or used it on a project or two. What you might not know is the story of how it all began and how we ended up where we are today—seeing the second edition of Learning NServiceBus being published.
Almost 15 years ago, I was working as a developer on a gigantic command and control system developed in a language called Ada. This is what Wikipedia has to say about Ada:
"[Ada] has built-in language support for explicit concurrency, offering tasks, synchronous message passing, protected objects, and non-determinism."
These were very important attributes for a system that needed to be super reliable, highly performant, and very scalable. Little did I realize at that time how profound an effect this relatively unknown programming language would have on the rest of my career.
In my next company, a software development firm—the kind that does turnkey projects for its customers—I continued my focus on command and control systems, this time using the fairly new .NET platform from Microsoft. The thing was that many of the abilities that I'd come to rely on in Ada were (to me) curiously absent from .NET.
Like any good craftsman who has gotten used to a certain tool, I started looking around for a replacement, and when I couldn't find one, I went and made it myself.
Although the main message from Microsoft at the time was all about XML Web Services and .NET Remoting, I found that there was support for a message passing model in .NET that was actually built on a piece of infrastructure that was considerably older (originally built in the NT 3.5.1 days, but released with NT 4.0 in 1997). At that time, MSMQ had made it to version 3.0 which, later on, I learned was the magic number when it came to stability of software built by Microsoft.
Still, I found the System Messaging API to be a little too close to the metal for me to feel comfortable using it directly from my application logic, so I created a wrapper library, which gave me some much needed abstraction.
As I moved from one project to the next, I found this little library to be more and more useful and kept on extending and refining it. The developers in my teams seemed to like working with it as well.
After the third or fourth project, I decided to approach the company's management, suggesting that we should consider turning this infrastructure into a product. Seeing how useful it was to us on our projects, I figured that it was a no-brainer.
It turned out that this company had gone down the productization path in the past and had gotten badly burned in the process. As a result, they were very hesitant to make the same mistake again. Realizing that it wasn't going to happen, I managed to get permission to release the infrastructure to the world as an open source project, but only after legal confirmation that there would be no support or other liabilities to the company.
Thus, in 2007, NServiceBus was born.
This also happened to be the time when I started transitioning into my own private consulting practice.
As I continued to use NServiceBus in my work projects, I kept tweaking and expanding it. Version numbers didn't mean a whole lot, and through 2008, the version progressed rapidly from 1.6.1 to a release candidate of 1.9. If it worked on my project, I considered it worthy to ship.
Documentation was practically nonexistent and developers leaned pretty heavily on samples to figure out what the software did, asking questions on the discussion group when they ran into cryptic error messages (of which there were many).
In 2008, the 5-day format of my Advanced Distributed Systems Design course was launched, which was an extension of the 2-day workshop on the same topics I had been teaching since 2006. This course was based on many of the learnings from my old Ada days and continues to serve as the architectural underpinning of much of NServiceBus to this day.
April 2009 brought some stability with the final release of version 1.9 but came with a marked increase in the amount of consulting and training I was doing. This was great for me as I could finally afford to turn down work in order to continue the development of NServiceBus. This worked out great and in March 2010, the much-heralded NServiceBus 2.0 was finally released.
By almost every measure, things were going great. More companies were adopting NServiceBus and bringing me in for consulting. The Advanced Distributed Systems Design course was getting quite popular, and for a while, I was teaching it almost once a month in a different country around the world. Unfortunately, almost 6 months had gone by without any meaningful development on the code base.
Then it hit me that if another year or two would pass by in this manner, NServiceBus would start to get stale and the companies that had used it in their systems would eventually have to replace it with something else (costing them quite a lot of time and money).
I had lived through this story several times as a consumer of open source projects. As long as the project wasn't too intertwined in our system, it wasn't too painful to remove it. The thing was that NServiceBus was a fairly large framework that supported broad cross-sections of both client-side and server-side logic, so there would be no simple way to replace it.
I tried to figure out how I could guarantee that the development of the code base would stay a priority, yet as long as my primary source of revenue was services (consulting and training), I couldn't see how it would work. The only solution seemed to be to start charging money for NServiceBus licenses. Although larger companies were able to keep an open source core and sell other products around it, I hadn't seen or heard of any one-person operations that had been able to bootstrap their way into that.
I had no idea whether this would work, and whether the open source community that had supported me all this time would accept it or turn their backs on me, but I felt that it needed to be done. Unless there was revenue coming in directly from the features of the product, it wouldn't have a future.
Therefore, in late 2010, I founded the NServiceBus company and steeled myself for the worst.
Seeing the overwhelmingly positive responses from the community was quite a surprise. Sure, there were those that grumbled, but only a handful ultimately decided to switch to something else.
I had made it—living the dream!
However, lest I paint an overly rosy picture, I knew nothing about running a product company. Pricing was harder than I ever imagined it would be. The legal factor was a "crazy-complex" where, even after the lawyers explained to me all about things such as indemnification, they told me that it was ultimately my decision whether to accept the client's terms or not.
Most importantly though, I felt that I had secured the future of NServiceBus. As long as there was money to be made from it, even if something happened to me, one of the other contributors to the project could afford to take it over.
So much has happened since those early days of 2011 that it could probably fill its own book, and maybe one of these days, I'll put the proverbial pen to paper and make it happen. Anyway, here are the highlights:
Also, I've got to tell you, the quality of each version has gone up dramatically over time. The level of testing that goes into each release is impressive—looping through every permutation of containers, persistence, transport, and even versions of supported operating systems and databases.
When David wrote the first edition of this Learning NServiceBus book, it was something of a defining moment for NServiceBus—there was finally a book. The technology industry is awash in books about almost every piece of software out there, but for most of the time, NServiceBus was absent. Decision makers took us more seriously when we'd bring physical books with us for their teams.
Books matter!
With this latest edition, David goes beyond just covering the changes that happened in NServiceBus version 5.0, and goes even deeper into the reasoning behind those changes and why you'd want to use which features and when.
As one of the most prominent members of the NServiceBus community, David has interacted with the NServiceBus development team on a regular basis, given valuable feedback on our API, and debated with us on our future technology roadmap.
You're in for a treat.
Udi Dahan
Founder and CEO, Particular Software
David Boike is a principal consultant with ILM Professional Services, with experience in building and teaching others how to build distributed systems. He is an NServiceBus Champion, official NServiceBus and RavenDB trainer, Xamarin Certified developer, and amateur beer brewer. He lives in the Twin Cities with his wife and two children.
Prashant Brall is a principal consultant and senior software architect and developer at Veritec (www.veritec.com.au) in Canberra, Australia. He has over 19 years of experience in application development, which includes 4 years of work in the USA for Fortune 500 companies and major financial corporations. As a software professional, Prashant loves crafting software and enjoys writing about his experiences on his blog at https://prashantbrall.wordpress.com. He has also reviewed Instant AutoMapper published by Packt Publishing.
In his leisure time, he enjoys watching movies with his wife and playing musical instruments such as piano and guitar.
A big thank you to my wife, Jhumur, for her love and support and for being my best friend. I would also like to thank my parents, Mr. Hem Brall and Mrs. Prabha Brall, for encouraging me and showing me the difference between right and wrong throughout my childhood.
Hadi Eskandari, while working on both Java and .NET technologies, has developed enterprise-level applications on both platforms. He is a regular contributor to various open source projects. Currently, he is working as a senior software developer at Readify, which is a leading company on .NET technology in Australia.
I'd like to thank my family for their support. This wouldn't have been possible without your encouragement and help.
Roy Cornelissen works as a software architect in the Netherlands. With over 15 years of experience in IT, he has designed and built many enterprise systems for customers using Microsoft, Particular, and Xamarin technologies.
As a lead consultant at Xpirit, Roy is responsible for the vision and strategy for the Enterprise Mobile Development competence. He specializes in designing and building mobile applications for iOS, Android, and Windows Phone, and using Xamarin technology and architectures for distributed systems running in the cloud.
In 2011, Roy cofounded the Dutch Mobile .NET Developers group, and he is an active member of the Xamarin and NServiceBus communities. He has been awarded the Xamarin Insider and NServiceBus Champion titles.
He is a frequent speaker at software development conferences, such as Microsoft TechDays, Xamarin Evolve, NSBCon, and Gartner Catalyst. He writes articles and blogs about his professional and personal interests.
As an avid amateur cook, Roy shoots for the Michelin stars. He loves photography, graphic design, and playing the guitar in his spare time.
I'd like to thank David Boike for the opportunity to review his excellent book, which has taught me some new things as well, and the NServiceBus community for being an awesome resource of knowledge.
Daniel Marbach is an independent contractor working in tracelight GmbH in Lucerne, Switzerland. His experience spans from mobile application development to client and server development, with a strong tendency towards distributed systems. He is a long-time contributor to and community champion of NServiceBus and its ecosystems. Daniel is a frequent speaker, coach, and passionate blog writer. Recently, he cofounded the .NET Usergroup of Central Switzerland and continues his journey of software development with passion.
For support files and downloads related to your book, please visit www.PacktPub.com.
Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at <[email protected]> for more details.
At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks.
https://www2.packtpub.com/books/subscription/packtlib
Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book library. Here, you can search, access, and read Packt's entire library of books.
If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view 9 entirely free books. Simply use your login credentials for immediate access.
Get notified! Find out when new books are published by following @PacktEnterprise on Twitter or the Packt Enterprise Facebook page.
Today's distributed applications need to be built on the principles of asynchronous messaging in order to be successful. While you could try to build this infrastructure yourself, it is much better to lean on the proven experience of experts of this field. NServiceBus is a framework that gives you a proven asynchronous messaging API and much more.
This book will be your guide to NServiceBus. From sending a simple message to publishing events, implementing complex time-dependent business processes, and deploying systems to production, you'll learn everything you need to know to start building complex distributed systems in no time.
Chapter 1, Getting on the IBus, introduces NServiceBus and shows you how to start using the framework. You will learn how to download the framework and send your first message with it.
Chapter 2, Messaging Patterns, discusses the asynchronous messaging theory and introduces the concept of Publish/Subscribe, showing how we can achieve decoupling by publishing events.
Chapter 3, Preparing for Failure, covers concepts such as automatic retry to give you the ability to build a system that can deal with failures.
Chapter 4, Hosting, shows how to run and configure NServiceBus to run both within its own host process (as a console application or Windows service), and when hosted in a larger application such as a web project.
Chapter 5, Advanced Messaging, delves into advanced topics that will allow you to make the most out of the framework's messaging capabilities.
Chapter 6, Sagas, introduces the long-running business process known as a saga and explains how they are built and tested.
Chapter 7, Advanced Configuration, explains how NServiceBus extends and modifies itself to fit any situation or need.
Chapter 8, The Service Platform, introduces the extra tools that help you to build, debug, and manage a distributed system from development and into production.
Chapter 9, Administration, shows you how to deploy, monitor, and scale a successful NServiceBus system in a production environment.
Chapter 10, Where to Go from Here?, summarizes what you have learned in this book and lists additional sources of information.
This book covers NServiceBus 5.0, and the requirements for this book closely mirror the software it covers:
Additionally, the code samples use ASP.NET MVC 5 for web projects.
This book is for senior developers and software architects who need to build distributed software systems and software for enterprises. It is assumed that you are quite familiar with the .NET Framework. A passing understanding of ASP.NET MVC concepts will also be helpful when discussing web-based projects.
In this book, you will find a number of styles of text that distinguish between different kinds of information. Here are some examples of these styles, and an explanation of their meaning.
Code words in text, database table names, folder names, filenames, file extensions, pathnames, dummy URLs, user input, and Twitter handles are shown as follows: "When we included the NServiceBus.Host NuGet package, a reference to NServiceBus.Host.exe was added to the class project."
A block of code is set as follows:
When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold:
Any command-line input or output is written as follows:
New terms and important words are shown in bold. Words that you see on the screen, for example, in menus or dialog boxes, appear in the text like this: "In the Solution Explorer, right-click on the solution file and click on Properties."
Warnings or important notes appear in a box like this.
Tips and tricks appear like this.
Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.
To send us general feedback, simply send an e-mail to <[email protected]>, and mention the book title via the subject of your message.
Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.
You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.
Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in the text or the code—we would be grateful if you would report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the Errata Submission Form link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded on our website, or added to any list of existing errata, under the Errata section of that title. Any existing errata can be viewed by selecting your title from http://www.packtpub.com/support.
Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works, in any form, on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy.
Please contact us at <[email protected]> with a link to the suspected pirated material.
We appreciate your help in protecting our authors, and our ability to bring you valuable content.
You can contact us at <[email protected]> if you are having a problem with any aspect of the book, and we will do our best to address it.
In this chapter, we'll explore the basics of NServiceBus by downloading the NServiceBus binaries and using them to build a simple solution to send a message from a ASP.NET MVC website to a backend service for processing.
Before diving in, we should take a moment to consider why NServiceBus might be a tool worth adding to your repertoire. If you're eager to get started, feel free to skip this section and come back later.
So what is NServiceBus? It's a powerful, extensible framework that will help you to leverage the principles of Service-oriented architecture (SOA) to create distributed systems that are more reliable, more extensible, more scalable, and easier to update.
That's all well and good, but if you're just picking up this book for the first time, why should you care? What problems does it solve? How will it make your life better?
Ask yourself whether any of the following situations describes you:
If any of these situations has you nodding your head in agreement, I invite you to read on.
NServiceBus will help you to make multiple transactional updates utilizing the principle of eventual consistency to reduce database locking and blocking and make deadlocks easy to deal with in a reliable way. It will ensure that valuable customer order data is not lost in the deep dark depths of a multi-megabyte logfile.
By the end of the book, you'll be able to build systems that can easily scale out as well as up. You'll also be able to reliably perform non-transactional tasks such as calling web services and sending emails. You will be able to easily start up long-running processes in an application server layer, leaving your web application free to process incoming requests and you'll be able to unravel your spaghetti codebases into a logical system of commands, events, and handlers that will enable you to more easily add new features and version the existing ones.
You could try to do this all on your own by rolling your own messaging, but that would be really dangerous and wasteful. It is a far better strategy to take advantage of all of the industry-leading expertise that has been applied in NServiceBus in the last several years, and concentrate on what your business does best. NServiceBus is the easiest and most capable solution to solve the aforementioned problems without having to expend too much effort to get it right, allowing you to put your focus on your business concerns, where it belongs.
So if you're ready, let's get started creating an NServiceBus solution.
We will be covering a lot of information very quickly in this chapter, so if you see something that doesn't immediately make sense, don't panic! Once we have the basic example in place, we will look back and explain some of the finer points in more detail.
To get the actual NServiceBus binaries, we will use NuGet exclusively, but before we get started on our first project, we should download and run the installer for the entire Particular Service Platform, which will ensure that your machine is set up properly to run NServiceBus solutions. Additionally, the platform installer will install several other helpful applications that will assist in your NServiceBus development, which we will cover in more detail in Chapter 8, The Service Platform.
Download the installer from http://particular.net/downloads and run it on your machine. The following screenshot depicts the applications installed by the platform installer:
You should select all the options that are available to you. There are two options for ServiceMatrix because of differences in how Visual Studio handles add-ins between Visual Studio 2012 and 2013, so you can install whichever matches the version of Visual Studio you use.
In addition to the Service Platform apps, the installer does several things to get your system ready to go: