Я думаю, с этим столкнусь уже при реализации. Сейчас пока сложно представить, как именно должны распределяться воркеры и кто за что отвечает.
Условно как будет с вашей реализацией:
Ряд эндпоинтов кроме своей непосредственной работы загоняет сообщение в очередь, мол, добавилось X, оповести Y типа Z(группа, юзер, не важно) видом уведомления V
При подключении к сокету сокет добавляет себя в хешмапу и отдаётся на откуп воркеру, который раз в N вейкается (у нас же holy async можем себе позволить слипы) и чекает очередь + другие таблицы, чтобы если там что-то появилось, например, скоро подходит срок, добавить это тоже в очередь. Как только он разберётся и выделит актуальные записи, начнётся проходка по мапе с рассылкой нужных сообщений по нужным группам. Тот же сокет может ожидать сообщения "read", на которое воркер легитимно удалит прочитанное из очереди.
Единственное вопрос - собственно, а как такой воркер выглядеть должен? :)
Звучит как внешний демон, с которым мы *как-то* общаемся. Либо что-то во внутреннем коде, которое крутится в while true и по вейку читает новую инфу из глобальных переменных. Например, те же присланные read можно тупо в список класть, как и хешмапа с сокетами, и pop'ать все.