For those unfamiliar with BizTalk, it is Microsoft’s premiere Enterprise Application Integration (EAI) platform. It is used to integrate disparate systems over a variety of protocols using a durable pub-sub mechanism.
SignalR does have some similarities to BizTalk in that it is a messaging system that also supports the notion of pub-sub. However, SignalR’s sweet spot is really lightweight messaging across Web clients. SignalR itself is a scalable, asynchronous .Net library authored by David Fowler and Damian Edwards. If you are new to SignalR, I recommend checking out this post by Scott Hanselman who describes many of the underlying technical details that I will not be going into in this post.
Why is SignalR important?
One of the true benefits of SignalR is it is Asynchronous by nature. I don’t profess to be an expert web developer. I have done some in an earlier life prior to my BizTalk days but I know enough to understand that locking up a user’s browser during a request-response interaction can be a really bad thing. Yes, technologies have been introduced like AJAX and JQuery to provide a more asynchronous experience and they both have their strengths and weaknesses. But, overall they take many steps to solve this Request-Response locking problem. The question remains, what happens when you have events occurring in other systems that you want raised within your current system that you are interacting with? This is where I feel the true “magic” of SignalR comes into place.
I work in the Electricity/Power industry and we are implementing an Outage Management System (OMS). OMS systems are used to calculate or anticipate the particular device(s) that are the underlying problem that is causing a Power Outage. OMS systems may have many different types of input including Customer Calls, IVR messages or even SCADA events. In this case we are only going to focus on Customer Calls.
This OMS system is a commercial off the shelf (COTS) product that we have purchased from a vendor. This product has defined, XML based, asynchronous interfaces that require the use of WebSphere MQ queues. Using BizTalk to integrate with the OMS system makes a lot of sense and plays well to BizTalk’s strengths that include:
- Support for MQ Series
- Durable Messaging
- Correlation (Async messaging)
- XML Schemas
But the question remains, we need to capture information that is coming from our Customer’s calls in our Call Centre. One option that we are currently exploring is a light weight Web Based application that will allow our Call Centre to quickly capture customer’s outage information and then pass this information to BizTalk and have BizTalk deal with calling the OMS’s semi-complex interfaces.
Much earlier in my career I may have been tempted to do the following:
- Expose a WCF/Web Service that a Web Application can consume
- Accept the request from the Web App and then proceed to call the asynchronous interfaces that exist in the OMS system.
- In the meantime, the Web Application that called the BizTalk Service is being blocked as BizTalk is still processing messages Asynchronously.
- Once BizTalk is done interacting with the OMS system, BizTalk will provide a response back to the Calling Web Application.
The reality is that his is a bad pattern. You don’t want to lock up your users in a Web Application if you don’t have to especially when you have asynchronous messaging happening in the backend.
An alternative approach, that I like much better, is outlined below:
- Expose a WCF/Web Service that a Web Application can consume.
- Once BizTalk has received the Web Request from the Web Application, simply provide an acknowledgement that the message has been received and will be processed.
- At this point the Web Browser has been posted back. If our Web Application is built around technologies like JQuery and/or AJAX our users can continue to perform some work.
- In the meantime as BizTalk is calling the OMS' related interfaces, BizTalk can provide status updates back to the Web Application using SignalR. There is actual information that the OMS system will pass back that our end users are interested in. More specifically, it will include information as to when the Customer can expect their power to be restored (Estimated Time of Restore). If you have ever experienced a power outage, I am sure you would like to know if it is going to last 30 minutes or 10 hours.
The benefits to this approach include:
- User’s browser is not locked up
- Users are continuing to be updated as to the status of their request
- No need to continue to refresh your page (Just say NO to F5) in order to get a status update.
I am sure at the beginning of this post you were thinking what could BizTalk and SignalR possible have in common? I hope that I have provided a good example of how these two technologies complement themselves.
In Part 2 of this series, I will actually implement this pattern that I have shown above. I have split this information into two parts due to the total length of the content. Stay tuned!