Distributed Systems Building NServiceBus Metrics with OpenTelemetry and System.Diagnostics.Metrics The release of System.Diagnostics.DiagnosticSource version 6.0 a few months back brought something entirely new to the library - support for OpenTelemetry Metrics. Since this package releases out-of-band from the .NET 6 SDK, it also means you can use these new metrics
Azure Local Development with Azure Service Bus For teams new to Azure Service Bus, one of the first questions you have to answer is "how do I develop against this?" And it turns out the answer isn't that straightforward - because it's currently impossible to run Azure Service Bus outside of
Distributed Systems OpenTelemetry 1.0 Extensions Released With the release of OpenTelemetry tracing specification reaching 1.0, and the subsequent release of the 1.0 release of the core components of .NET, I've pushed updates to my OpenTelemetry packages for: NServiceBus.Extensions.Diagnostics.OpenTelemetryMongoDB.Driver.Core.Extensions.OpenTelemetryWhile those packages didn't
Distributed Systems Diagnostics and Instrumentation Packages Targeting Open Telemetry Beta for MongoDB and NServiceBus Published That's...a long title. I've published release packages for System.Diagnostics support for NServiceBus and MongoDB: NServiceBus.Extensions.DiagnosticsMongoDB.Driver.Core.Extensions.DiagnosticSourcesAnd published new beta packages targeting the beta release of OpenTelemetry: NServiceBus.Extensions.Diagnostics.OpenTelemetryMongoDB.Driver.Core.Extensions.OpenTelemetryThe Diagnostics packages are
Distributed Systems Diagnostics and Instrumentation Packages for MongoDB and NServiceBus Published As part of the end-to-end diagnostics and tracing blog series, I had an end goal of eventually publishing out NuGet packages for diagnostics (Activity and DiagnosticSource). I'm happy to announce that I've released 4 packages to NuGet: NServiceBus.Extensions.DiagnosticsNServiceBus.Extensions.Diagnostics.OpenTelemetryMongoDB.Driver.
Microservices Building End-to-End Diagnostics and Tracing: An Intro Posts in this series: An IntroTrace ContextDiagnostic EventsOpenTelemetry IntegrationActivity and Span CorrelationVisualization with ExportersUser-Defined Context with Correlation ContextActivitySource and OpenTelemetry 1.0Source Code As microservices introduced (forced) highly complex distributed systems into organizations, the tools required to operate these architectures needed to evolve as
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Conclusion Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion We started out with a common, but nearly always overlooked problem: how do we reliably coordinate activities between different transactional resources? The question
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Relational Resources Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series So far in this series we've mainly concerned ourselves with a single resource that can't support distributed (or
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Sagas Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series So far in this series, we've looked at the ins and outs of moving beyond distributed transactions using
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Dispatcher Failure Recovery Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series In the last post, we looked at how we can recover from exceptions from inside our code handling
Architecture Life Beyond Distributed Transactions: An Apostate's Implementation - Failures and Retries Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series In the last post, we looked at an example of dispatching document messages to other documents using a
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Dispatching Example Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series In the last post, we looked at refactoring our documents to use messaging to communicate changes. We're still
Microservices Life Beyond Distributed Transactions: An Apostate's Implementation - Document Example Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series In the last post, I walked through the "happy path" scenario of coordinated communication/activities between
Distributed Systems Life Beyond Distributed Transactions: An Apostate's Implementation - Document Coordination Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series Quick note - I've updated this post to use the more accurate term "Document" than the
Distributed Systems Life Beyond Distributed Transactions: An Apostate's Implementation - A Primer Posts in this series: A Primer Document Coordination Document Example Dispatching Example Failures and Retries Failure Recovery Sagas Relational Resources Conclusion Sample code from this series For those working with SQL databases, working with transactions is more or less a given. The most we
Distributed Systems Dealing With Optimistic Concurrency Control Collisions Optimistic Concurrency Control (OCC) is a well-established solution for a rather old problem - handling two (or more) concurrent writes to a single object/resource/entity without losing writes. OCC works (typically) by including a timestamp as part of the record, and during a
REST Swagger, the REST Kryptonite Swagger, a tool to help design, build, document, and consume RESTful APIs is ironically kryptonite for building actual RESTful APIs. The battle over the term "REST" is lost, where "RESTful" simply means "an API over HTTP" but these
Architecture Refactoring Towards Resilience: Process Manager Solution Other posts in this series: A primer Evaluating Stripe Options Evaluating SendGrid Options Evaluating RabbitMQ Options Evaluating Coupling Async Workflow Options Process Manager Solution In the last post, we examined all of our coordination options as well as our process coupling to design a
Architecture Refactoring Towards Resilience: Async Workflow Options Other posts in this series: A primer Evaluating Stripe Options Evaluating SendGrid Options Evaluating RabbitMQ Options Evaluating Coupling Async Workflow Options Process Manager Solution In the last post, we looked at coupling options in our 3rd-party resources we use as part of "button-click&
Architecture Refactoring Towards Resilience: Evaluating Coupling Other posts in this series: A primer Evaluating Stripe Options Evaluating SendGrid Options Evaluating RabbitMQ Options Evaluating Coupling Async Workflow Options Process Manager Solution So far, we've been looking at our options on how to coordinate various services, using Hohpe as our guide: Ignore
Architecture Refactoring Towards Resilience: Evaluating Stripe Options Other posts in this series: A primer Evaluating Stripe Options Evaluating SendGrid Options Evaluating RabbitMQ Options Evaluating Coupling Async Workflow Options Process Manager Solution In the last post, I looked at a common problem in web applications - accepting payments via 3rd party APIs
Architecture Refactoring Towards Resilience: A Primer Other posts in this series: A primer Evaluating Stripe Options Evaluating SendGrid Options Evaluating RabbitMQ Options Evaluating Coupling Async Workflow Options Process Manager Solution Recently, I sat down to help a team to put in some resiliency in a payment page. This payment page