WCF: обмен кэшированными данными между несколькими службами - PullRequest
3 голосов
/ 16 апреля 2009

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

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

Я провел некоторое исследование и нашел несколько статей об использовании IExtension, прикрепленного к сервисным хостам, для хранения общих данных.

При условии, что все службы работают на одном веб-сайте, это будет работать? И это правильный подход? Или я должен искать в другом месте?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2009

Если данные, которые вы кэшируете, требуются более чем одной службе, это звучит так - с точки зрения Сервис-ориентированной архитектуры, во всяком случае, - что они не принадлежат ни к одной из служб, которые вы вызываете.

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

  1. Это решает вашу первоначальную дилемму, избегая необходимости читать весь кэш из базы данных несколько раз;
  2. Он инкапсулирует кэш в одном месте для удобства поддержки / изменения позже.
  3. Это позволяет абстрагировать реализацию кэша от других сервисов, добавив другой интерфейс сервиса.

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

В качестве альтернативы, если данные в вашем кеше очень тесно связаны с ОБА сервисов, которые вызывают кеш, т.е. оба сервиса добавляют / изменяют данные в кеше и т. Д., То, возможно, две существующие службы должны быть объединены в разовая услуга.

Если то, что я говорю, имеет какой-то смысл, то принцип SOA, на котором я опираюсь, это Автономная служба .

2 голосов
/ 16 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...