Безопасное одновременное сведение надежных коллекций Azure Service Fabric

У меня есть служба с кучей входящих заказов, которые я храню в IReliableDictionary. По мере поступления новых заказов мне нужно обновлять и поддерживать отдельный отсортированный список этих заказов на протяжении всего срока действия моей программы.

Как эффективно и с параллелизмом преобразовать данные в IReliableDictionary в другую отсортированную коллекцию, чтобы избежать взаимоблокировок и не приходилось перестраивать отсортированный список с нуля каждый раз, когда поступает новый заказ?

РЕДАКТИРОВАТЬ: просмотрев документацию, я считаю, что могу добиться этого, обновив отсортированную коллекцию в локальной памяти после обновления перед фиксацией.

        using (var tx = this.StateManager.CreateTransaction())
        {
            bool addOk = await orderDictionary.TryAddAsync(tx, 123, someOrderToAdd);
            if (addOk)
            {
                this.SortedOrders.Add(someOrderToAdd);
            }
            await tx.CommitAsync();
        }

Может ли кто-нибудь подтвердить, что я правильно понял документацию и что что-то вроде приведенной выше реализации не вызовет проблем с параллелизмом?


person rysama    schedule 28.05.2018    source источник


Ответы (2)


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

person teeboy    schedule 30.05.2018
comment
Каково рекомендуемое использование этого? Является ли уведомление упорядоченным/параллельным? Или я должен заблокировать отсортированный список, а затем вставить (при условии, что надежный словарь не поддерживает какую-либо блокировку обновления во время уведомления)? - person rysama; 01.06.2018
comment
Если вы используете concurrentdictionary, вам не нужна блокировка. Вам нужна блокировка для отсортированного списка. События приходят по порядку. Не выполняйте дорогостоящие операции в обработчике событий. - person teeboy; 02.06.2018

Если это только на время жизни процесса, и если не проблема иметь только Orders из раздела, возможно, вы можете использовать обычную параллельную коллекцию. Для пример файл ConcurrentQueue<Order>.

Вы также можете использовать событийно-ориентированный подход, сигнализируя о временной отметке OrderReceivedEvent каждый раз, когда получено Order. Затем вы можете подписаться на эти события в отдельной службе, которая их где-то хранит.

Или вы можете использовать распределенный кеш, например Redis (в файле Container), чтобы временно сохранить Orders.

Другим вариантом может быть использование SQL-сервера для Order данных вместо надежных коллекций.

person LoekD    schedule 28.05.2018