monix
Do you like our app?
<Yes, rate it> <Later>
It's also freaking annoying because it interrupts your workflow, the thing for which you ended up installing that stupid app in the first place. It's basically disrespectful of their users' time and needs.And had fewer issues in general with FastMail. Google Apps has some crazy limits, like on the number of IMAP connections or email aliases, you can't normally change the primary domain, you can't setup an abuse@ alias, etc, etc. and contacting Google Apps support doesn't do more than for them to tell what's already written in the docs.
And I mentioned in another mail, but FastMail's IMAP import and POP3 links work, whereas this functionality is broken for Gmail and Google's support won't help you ;-)
Problem is they couldn't help me much when I had problems. Google Apps has serious limits and contacting support won't help you get around those limits. Most of the time support just tells you what you can already find in their online docs.
They only solved two issues for me: (1) when I wanted to change my primary domain, after 2-3 months of asking them repeatedly, they finally enrolled me into this beta programming and finally changed my primary domain. And (2) when I upgraded to the annual subscription and then changed my mind, they reverted me to the flexible pricing. On the other hand they couldn't even help with with an import gone wrong.
With FastMail I have had a good experience thus far.
Of course it helps when the platform has the proper tools for it. I end up using JMH and YourKit Profiler weekly, because a memory or CPU leak can crash our process and we have pretty strict reliability requirements with a single server processing about 5000 events per second - not extremely demanding, but when it crashes, we can lose money, with the redundancy infrastructure being pretty new.
But in fact concurrency is inevitable in absence of OS threads that can be blocked (another potential clusterfuck) or of some form of continuations support, because it is a direct consequence of asynchrony.
And asynchrony isn't avoidable, all you can do is to find abstractions that make it more deterministic.