I use to work on desktop app that have about 500k - 1M active users each day. We have build our own update system, each app checks if there is new version daily and then download it and install update automatically.
To prevent cases that wrong update kill whole user base we have users divided to groups = distributions. I think that there were about 20 of them, from user count about 2k to 100k+. We pushed updates to smaller ones first and test waters, then update rest of user base.
Everything was our own technology: web service for version checking, build system and some download servers.
When a user runs our software, we notify them of their version and the current version available. If they want the update, they have to come to the web site and download it manually.
It's really not hard to do your own thing and then you have freedom to modify how it works. I use an HTTP get to the server to fetch the latest version, alert the user, if they select update I run an external app that pulls the installer down and runs it. Now I can separate between different streams, e.g. beta or normal user.