Алгоритм поиска событий в памяти - правильно?это потокобезопасный? - PullRequest
0 голосов
/ 13 октября 2011

Извините за слегка умозрительный характер этого вопроса.

Я пишу Cms, используя статический объект в памяти для хранения текущего состояния системы, и использую Event Sourcing для создания журнала событий, который я могу использовать для восстановления состояния объекта, а также для обеспечения отката и т. Д. (см. http://martinfowler.com/articles/lmax.html, если вы не знаете, о чем я)

public class Cms
{
    private static object WriteLock = new object();
    public static Cms Read { get; set; }
    static Cms Write { get; set; }

    static Cms()
    {
        Read = RebuildFromActionLog();
        Write = RebuildFromActionLog();
    }

    public static void Update(Action action)
    {

        lock (WriteLock)
        {                
            try
            {
                action.Apply(Write);
            }
            catch(Exception ex)
            {
                Write = RebuildFromActionLog(); //ditch the potentially messed up Write model
                throw;
            }
            LogAction(action); //the action was a keeper, so keep it
            Read = Write; //ditch the current read only model - it will continue to be used by any requests that have grabbed it
            Write = RebuildFromActionLog(); //get a new model ready for the next write
        }
    }
...
}

Помимо возможности большого количества операций записи, если выполнение или восстановление занимает много времени, и возможности использования большого количества памяти, есть ли какие-либо ошибки в этом, особенно связанные с параллелизмом?

1 Ответ

1 голос
/ 13 октября 2011

У вас могут быть проблемы, если кто-то использует общедоступный метод получения или установки Read, поскольку у вас нет синхронизации там. Если кто-то использует это свойство одновременно с тем, как другой поток изменяет его в Update, чтение может извлечь устаревшее значение или изменение, сделанное записью, может быть молча потеряно.

Действительно ли это свойство должно быть публичным? И публично для записи ?

...