Improving Wunderlist’s Sync
TL;DR: Over the past few months we have made changes which have made Wunderlist's sync five times as fast, significantly more reliable, and a whole lot less prone to errors.
We are continuously working to make improvements throughout the Wunderlist infrastructure to make syncing lists across your devices as reliable and fast as possible. Today, we’d like to give you a quick, somewhat technical, update on our progress and continued plans for the future.
What we've done so far
Since the launch of Wunderlist 2, we’ve made a lot of changes. Our approach has been to introduce them incrementally and carefully to avoid disrupting service as much as possible. We'll never be finished improving Wunderlist and its synchronization layer. As we grow and adjust to our users' needs, it too will need to adapt, but we're incredibly proud of what we've accomplished so far. So, let’s walk you through some of the details.
After the December launch of Wunderlist 2, we experienced significant unexpected downtime due to load and the reliability of our infrastructure. Since, our team has completely revamped the setup making the system stable and more maintainable. Here are just a handful of these changes:
Our backend team created a detailed internal dashboard allowing us measure to everything one can possibly measure. This enables us to see and react to increased load, isolated infrastructure and other anomalies early.
We introduced a new controlled change process so our team can roll out changes slowly and observe their effects. (This is technique is called "canary deployments")
When Wunderlist 2 was released, all of its data was stored in one large database. We’ve split this into many databases now, making it faster to upgrade and less risky to change.
Our team split up the backend application code of Wunderlist's Sync into multiple small services, that can now be changed independently, reducing coupling and risk of dependencies breaking each other. This means we can now work on areas of service, like Email Notifications, and keep the rest of Wunderlist available for our users.
We continue to make our clients more resilient to unexpected network and data conditions. Even under perfect conditions, networks (especially on mobile devices) can be slow and unpredictable.
For our users, we’ve created a status page where anyone can see if there are currently any known issues with the Wunderlist service.
Speed and Scalability
Our team has done many things to improve performance of the Wunderlist Sync, however we'll only list some of the big ones here. In a nutshell, the overall effect is that, since December, we’ve cut our average response times down to 20% of their original time. In addition, our teams have also done the following:
Broke our biggest data stores into separate physical databases, splitting up the input/output operations across many more disks and improving overall database performance.
Optimized the way we connect lists and their tasks, dramatically reducing the time it takes to look up your tasks.
Enhanced countless pieces of code, all without introducing caching (see below for why this is important).
Since the Wunderlist 2 launch, we’ve had a number of problems as a result there have been some data inconsistency on our clients. These problems had two root causes: premature optimization and caching. Our new mantra is "Keep It Simple".
While caching sounds like (and can be) a very good idea for a system under high load, keeping caches consistent is difficult. Our teams have removed most of our caches and replaced them with code which performs better without caching.
Today, all of the major problems that had caused lists to get out of sync between clients have now been solved.
What's to come
We definitely aren't finished and will continue to improve Wunderlist forever. That said, in the near future we plan to introduce a few major changes which will further improve and simplify Wunderlist's architecture. Most notably, as of the release of Wunderlist 2.2, we started to introduce real-time sync. So far this feature is only in effect for Files, but in the next two releases we’ll spread real-time sync throughout the entire Wunderlist system, covering every aspect of Wunderlist from creating a task to sharing a list with a friend. This means all changes on one client will almost immediately appear on other clients.
As we continue to methodically improve our systems and infrastructure, we hope to transparently show our users what improvements we’re continuing to make and share our learnings with other developers and product teams. In the next post of this series, we’ll go into detail on how our rolling deployment system works.