SaaS = Web Component + Desktop Component + Sync

I tuned to Mix07 yesterday to listen to the keynote from Ray Ozzie. Ray draws the picture for the software and service model. One important statement in the keynote made feel really good, Ray said “Even software as a service vendors have found a need to expand their offering to include offline edition”

This is a fact. There is growing interest in building offline applications especially with the new breed of web 2.0 applications. It is much faster to edit your documents on the desktop, yet it is more convenience to store them on the web and be able to access them anywhere. Web based everything is a weak vision and won’t materialize given that SaaS vendors are building offline experiences.

If you buy into this new world of software plus service then you must look at synchronization as the enabling technology. The Synchronization Services of ADO.NET is one step in this direction. Using web service or WCF you could easily expose your data to your web clients.

Building rich applications on the client that takes advantage of the processing power, storage, and graphics on the desktop for better user experience and reduce the load on the web server for better scalability is a great model that is gaining momentum everyday. For this vision to materialize, synchronization technologies have to become mainstream and part of every developer toolbox. With that, I think you know why I feel good … [tip: my team is responsible for sync technologies across Microsoft!] ….


Update: Just to let you know, I left Microsoft to start a new company, Raveable Hotel Reviews. See Examples: Romantic Hotels in Myrtle Beach, Top 10 Hotels in Seattle, 5 Star Hotels in Miami, Hotels with in-room jacuzzi, Family Friendly hotels in Anaheimand Best Hotels in Fort Lauderdale. Your feedback is welcome, raveable blog.


Comments (5)

  1. Garry Trinder says:

    While I agree that the online/offline combo is needed, I think that the synchronization model you are suggesting might be augmented to handle more complex scenarios.

    I have a podcast up about this here:

    The bottom line is that synchronization leads to collision detection and resolution, which involve highly complex business logic. I suggest an integrated infrastructure/applicative-design approach that is optimized for handling it.

    Take a look and tell me what you think.

  2. Rafik – I think the whole MS Sync Services is going to rock once we can build a Silverlight app that can store data locally (using SSCE), sync using MS Sync Services and function offline!!!

  3. MSDN Archive says:

    Hi Udi,

    I listened to your cast and I disagree with you.  The scenario you mentioned regarding address change and whether a conflict should be detected if another change is made to the same row but in other set of columns is usually addressed by column level tracking. SQL merge replication supports column level tracking, but OCS does not at this point.  When simultaneous changes to the address fields are made, you got a conflict regardless of the type of sync engine: state based sync like OCS; event based sync like the approach you suggested.

    State based synchronization algorithms are simpler and more reliable. Event based synchronization algorithms are extremely complex and unreliable. I am basing my assessment on my previous experience building windows file replication engines, one of which is event based system. OCS scope is to enable developers to easily build sync scenarios with most needed features, exposing set of events for developers to intercept the data while in flight and apply any business logic they might have. It is a developer framework and not end-to-end solution like merge replication.  



  4. MSDN Archive says:

    Hi Nick,

    I totally agree with you. However, the offline story is has to be in the browser only since the SilverLight team made it clear that they are not planning to enable building SilverLight apps for desktop. I am reading the news here just like you; no insider info 🙂



  5. SYNC IS SLOW says:

    Dear All,

    SYNC IS VERY VERY SLOW (With batching) using bidirectional by terminal

    I have implemented batching from syncguru website, now it is working fine, but it takes a long time to complete the process. "Demo VIII: Offline Application – Batching"

    the link is…/SyncServicesDemoBatching.aspx

    Total records in my table : 60,000 records

    BatchSize : 3000

    Total Duration : For updating 1000 records, it takes more than 90 seconds

    i need to reduce the "Total Duration" upto 30 seconds atleast.

    Please provide your valuable suggestions.

    Thanks in advance.




    —  ***********************************************  

    —     NewAnchor proc with batching support  

    —  ***********************************************  


    create procedure [dbo].[sp_new_batch_anchor] (  

           @sync_last_received_anchor bigint ,  

           @sync_batch_size int,  

     @sync_max_received_anchor bigint output,  

     @sync_new_received_anchor bigint output,    

     @sync_batch_count int output)    


    if @sync_batch_size <= 0  or @sync_batch_size is null  

    set @sync_batch_size = 3000  

    if @sync_max_received_anchor is null  

        set @sync_max_received_anchor =  min_active_rowversion()-1 — @@DBTS –min_active_rowversion()-1  

    — simplest form of batching  

    if @sync_last_received_anchor is null or @sync_last_received_anchor = 0  


        set @sync_new_received_anchor = @sync_batch_size  

     if @sync_batch_count <= 0 or @sync_batch_count is null  

      set @sync_batch_count = (@sync_max_received_anchor /  @sync_batch_size) + 1  




        set @sync_new_received_anchor = @sync_last_received_anchor + @sync_batch_size  

     if @sync_batch_count <= 0 or @sync_batch_count is null  

      set @sync_batch_count = (@sync_max_received_anchor /  @sync_batch_size) – (@sync_new_received_anchor /  @sync_batch_size) + 1  


       — check if this is the last batch      

       if @sync_new_received_anchor >= @sync_max_received_anchor  


           set @sync_new_received_anchor = @sync_max_received_anchor          

     if @sync_batch_count <= 0 or @sync_batch_count is null  

      set @sync_batch_count = 1