2016-10-02 5 views
1

Я в настоящее время реализую EventSourcing для своего Go Actor lib. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда актер перезагружается и ему нужно переписать все его состояние из журнала событий, запрос может возвращать несогласованные данные. Я знаю, что могу это решить, используя MutationTokenConsisnent N1QL Query Couchbase GOCB sdk

Но если я это сделаю, я буду вынужден писать все события в последовательном порядке, то есть записывать последнее событие последним.

Таким образом, токен мутации для последнего события будет достаточным для того, чтобы все данные были последовательно заданы для конкретного актера.

Это, однако, очень медленно, записывая около 10 000 событий в порядке, занимает около 5 секунд в моей настройке.

Если я вместо этого пишу эти 10 000 асинхронных сообщений, используя подпрограммы go, я могу записать все данные менее чем за одну секунду. Но тогда записи находятся в индетерминистском порядке, и я могу узнать, какой токен мутации я могу доверять. , например. Событие 999 может быть записано до события 843 из-за планового планирования AFAIK.

Какие у меня варианты?

ответ

1

Технически говоря MutationToken и асинхронные операции не являются взаимоисключающими. Это может быть сделано без изменения клиенту (я не уверен), но здесь нужно взять все ответы MutationToken, а затем выдать запрос с самым высоким номером на vbucket со всеми из них.

Ключом здесь является то, что с учетом одного MutationToken вы можете добавить к нему другие. Я не вижу прямого способа сделать это, но так как внутри это всего лишь карта, она должна быть относительно простой, и я уверен, что мы (Couchbase) возьмем вклад, который сделает это. На самом низком уровне это всего лишь карта последовательностей vbucket, которая предоставляется для запроса во время выдачи запроса.