проблема
Я создаю систему на основе подписки, которая предоставляет канал уведомлений на основе предоставленного запроса, когда результаты запроса изменяются из-за документов, измененных с помощью добавления/удаления/обновления. Например,
подписываться
void mySystem.subscribe(collection, QUERY("name" << "abc"), callBack);
где обратный вызов определяется как:
void Client::Callback(ChangedDocuments, Operation)
{
// handle the change
}
если кто-то mySystem.Add(collection, documentsNameIsAbc)
, будет вызван обратный вызов, чтобы подписывающие клиенты уведомлялись об изменениях.
Это нужно сделать как можно быстрее, поэтому что-то вроде сканирования журнала повтора не будет работать для меня.
Возможности
a) Наивный способ будет помнить результаты всех запросов, после каждого добавления/удаления/обновления, запускать все запросы снова, а затем отправлять diffs как уведомление.
b) Немного более разумный способ - взять изменяющийся документ (перед любой операцией db), проверить, соответствует ли он любому запросу. Если да, отправьте уведомление. Тем не менее, звучит как такой "матч", не поддерживается.
c) Использовать запрос в формате regex, сериализовать изменяющийся документ в формате json и выполнить регулярное выражение.
Я использую C++, хотя проблема звучит на языке нейтрально.
Любые входы приветствуются.
Если вы язык-агностик, вы можете взглянуть на структуру meteor. Он реализует хвостовое оперение, и по совпадению вчера была выпущена новая версия, которая фокусируется именно на этом: