The ability to be “offline” and “occasionally-connected” is a critical component of successful mobile apps. Wireless data networks lack complete coverage and exhibit a level of unreliability that immediately disqualify permanently-connected apps like you might see on a corporate LAN. For a mobile app to be successful, it must allow the user to keep working in the absence of a data network. It must also be able to transparently sync data changes from the mobile client to the server whenever a wireless data network is detected. The primary means of accomplishing that today is via one of Microsoft’s sync technologies that allows SQL Server Compact on the mobile client to replicate data to and from SQL Server in the data center or the cloud. Since SQL Server Compact runs almost anywhere, your mobile client could be a Windows phone, a laptop, a desktop or even a Netbook.
Besides synchronizing the tables, rows and columns of a complete database between mobile clients and servers, the use of message queuing should be considered for many scenarios due to its high-reliability by ensuring that a critical message arrives at its destination. Products like MSMQ, MQ Series, Tibco and JMS are used all over the world in the most mission-critical environments to ensure a high level of availability and reliability. They’re asynchronous by nature and use store and forward mechanisms so that messages get from point A to B to C. A typical queue message includes the Destination which tells the messge where to go, a Label which describes the message, a Body which contains the message, and a Body Length so the receiver can verify that it received everything.
So how does any of this relate to Windows phones? A number of years ago, an MSMQ client was made available for download and installation on Windows phones. Additionally, the .NET Compact Framework 2.0 included classes to work with MSMQ. Unfortunately, the installation of MSMQ was far from seamless which inhibited its adoption by customers. More recently, functionality was included in the .NET Compact Framework 3.5 that facilitated store and forward messaging using Exchange 2007 as a transport. This is a good solution for customers running the newest version of Exchange, have an unlimited data plan for their phones, and don’t mind running line of business applications over their email infrastructure.
So what do we do for customers that have found the Windows Mobile MSMQ client too much of a hassle, don’t have Exchange 2007 or don’t want to use it as a mobile message queue server? I think the answer has been under our noses all along. Burned in the ROM of every Windows Mobile 6.x device is SQL Server Compact + a lightweight data sync solution called Remote Data Access (RDA). For those of you running Windows Mobile 5, XP, Vista or 7, you can easily download these bits to your mobile client. SQL Server Compact is you local queue, RDA is your transport and SQL Server in the cloud or data center is your message queue server. So let’s break this down and see how it will work.
A mobile application that captures data in the field would want to drop that info in a local queue. SQL Server Compact becomes that local queue and the message format is actually a table with the following structure:
This table would be created inside a MessgeQueue database in SQL Server and RDA would pull it down to SQL Server Compact. In the Pull method you call from .NET on the client, you would add “WHERE 1=0” to the SQL statement. This filter has the effect of pulling down an empty shell of the table without retrieving any data to the client since that’s all you want. It also means that when you insert local data into the table and call the Push method, the data will be removed from the client at the completion of a successful sync.
So you’re probably wondering, what makes this so special and message queue-like vs. anything else? The secret is that unlike other sync technologies, RDA can wrap the upload of data into a transaction. As the data is being uploaded over wireless, if any of the INSERTs into SQL Server fail for whatever reason, everything gets rolled-back and the original data remains in the local SQL Server Compact queue. This is the kind of guaranteed commit that you expect from a message queuing system. It’s an “all or nothing” success or rollback.
It actually gets better. A property of both RDA and Merge Replication is called ConnectionRetryTimeout. This feature is designed to help you with unreliable wireless coverage where you have signal one minute and then lose it the next. Let’s say you have this timeout value set to 2 minutes and you begin your Push upload of queued data. Everything is working fine for the first few seconds but then you lose wireless coverage from your mobile operator. If you regain coverage before the 2 minute time-out, the upload will resume where it left off. Since both RDA and Merge send and receive data between the SQL Server Compact and IIS in tiny blocks, you never have to worry about running out of memory and you can pick up where you left off in case of a network dropout.
So the big takeaway here is that we do in fact have a Mobile Message Queue solution hidden on our Windows phones. We have a message format that lets us drop text/xml/whatever data into the body, a label that a server process or SQL trigger can key off of to perform an action, and a transactional upload mechanism that ensures your critical data will cross the wireless chasm and make it to the other side intact.
So what’s next? Now that you can capture data in a local queue and safely upload it, you might be wondering how queued messages from someone else can be pushed to your device. Don’t worry, that will be in my next post. Also, this isn’t just an article on how to solve a big problem in the mobile space, I’m actually building the necessary client and server pieces as well. We’re all looking for a reliable and unified way to connect mobile devices to corporate assets and this just might be the simple answer we’re looking for.