Я думаю, что списки Redis - хороший выбор. Я бы пошел со списком для каждого наблюдателя - таким образом, у вас есть O (1) для чтения и записи с RPUSH / LPOP, и события автоматически исчезают из системы, когда все наблюдатели получают их.
Вы можете уменьшить объем памяти, требуемый для каждого наблюдателя, просто сохранив идентификатор события в каждом списке, хотя тогда вам нужно будет сохранить счетчик для каждого события, чтобы определить, когда его можно удалить из системы.
Для реализации с одним списком, установите счетчик, который увеличивается каждый раз, когда событие добавляется в начало списка. Также установите счетчик для каждого клиента, показывающий, сколько событий они получили. Разница между ними заключается в количестве предметов, которые вам нужно получить из списка.
Недостатком этого подхода является то, что новые элементы могут быть добавлены в список после проверки счетчиков. Вы можете обойти это, считая от конца списка, но это O (N), а не O (1). Вы можете уменьшить N, обрезав полученные события из списка и сохранив счетчик для хвостовой позиции - насколько хорошо это будет работать, будет зависеть от того, сколько событий может накопиться, когда наблюдатель находится в автономном режиме.