2012-03-20 2 views
2

У меня есть файлы, которые сохраняются в хранилище Azure Blob, и у меня есть база данных, которая хранит URI этих файлов. Есть ли стандартный способ их синхронизации? Я имею в виду, что не должно быть способа удалить файл без удаления записи в базе данных и наоборот.Как синхронизировать Azure SQL с Azure BLOB Storage?

+0

Создайте рабочую роль и выполните все операции с файлами и db в пределах одной транзакции. http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx – Lloyd

+0

спасибо! я думаю, что будет работать –

+0

У меня была аналогичная проблема, и именно так мы ее решили, сначала удалим запись базы данных, а затем файл, если файл не удалит, а затем откат транзакции базы данных. Будьте осторожны с открытыми связями между службами – Lloyd

ответ

1

Нет инструмента, который может обеспечить ссылочную целостность между записями базы данных и хранилищем Azure Blob.

В качестве альтернативы вы можете иметь рабочую роль, которая будет поддерживать синхронизацию файлов с базой данных (но у вас будет дезактивация здесь).

Другим разумно чистым подходом будет только одна точка входа для добавления/удаления файлов blob и обработки синхронизации с базой данных в этом месте.

1

Я согласен с scripni, вы также можете голосовать до следующие спросить:

http://www.mygreatwindowsazureidea.com/forums/34192-windows-azure-feature-voting/suggestions/469736-event-handler-support-for-blob

Если хранилище больших двоичных объектов были события, вы могли бы знать, когда один вставлен, а затем обновить базу данных. Вы могли бы также иметь рабочую роль или просто задание cron на том основании, что запросы blob-хранилища так часто и соответственно обновляют SQL.

0

Одним из способов реализации транзакций на платформе Azure является использование очередей. Поместите сообщение в очередь и удалите сообщение только после его успешной обработки.

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

0

Мое решение имеет одну точку входа, такую ​​как scripni, и добавляет к ней транзакцию, подобную подходу.

Я использую базу данных как журнал записи для всей транзакции.

1) отметьте записи базы данных как «shouldBeDeleted» = true.

2) попробуйте удалить капли.

3) если есть ошибка, и капли не удаляются, у вас все еще есть записи, и вы знаете, что капли, на которые они указывают, должны быть удалены. и вы можете попытаться удалить их позже, что более важно, вы можете игнорировать записи в запросах на чтение так же, как если бы вы использовали метод мягкого удаления.

4) если удаленные блокировки удалены, вы можете удалить записи.

5) если это не удается, записи по-прежнему отмечены как «shouldBeDeleted», позволяя вам игнорировать их и очищать их позже.

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

Вы можете реализовать ту же идею для вставки/обновления практически так же.

* Немного поздно, но я считаю, что проблема все еще актуальна и что другие столкнулись с ней.

+0

Это очень близко к тому, что я сделал. –

Смежные вопросы