Видел доклад тов. Романа?
Тут, вроде, должно в режиме «что вижу, то пою» делаться:
1) Делаем Channel со входящими сообщениями
2) Делаем корутину (напр. `actor<…>`), которая читает из канала, и проверяет свою `HashMap`’у на предмет того есть ли группа для текущего сообщения
2.а) Если есть, то добавляем туда сообщение
2.б) Если нет, то запускаем и добавляем в Map
Ну и нужно как-то разрулить тот случай, если сообщение C2 пришло в момент, когда «предыдущая C-группа уже пытается отправиться». Тут нужно либо каналы закрывать, либо, если типов сообщений немного, то можно вообще корутины делать бесконечными.