Hi Richard,
Thanks for the great notes about your use case. It is easy to fall into the double write logic with a queue.
There are a couple simple ways around this. First, you can skip the xxx write (from your example) and just do the queue write (let the worker thread take care of the data manipulation as well), which occasionally saves time and effort.
A second option is to create your own trigger; I use this in a couple project and they are extremely easy to manage yourself. Pretty much anything you could imagine being triggered from Firebase data can be done with a simple privileged consumer (worker).
For instance, my priv worker could listen on the online_users/ path for add/update/delete events and 'queue' actions (or skip the queue and just trigger API calls itself, depending on the complexity and volume).
The great part here is that the worker script really has no "meat," just a few lines of code. Creating something resembling hooks becomes fairly trivial because Firebase is the central API and "servers" are really just data consumers with different privileges.
Cheers,
Kato