Как обмениваться объектами между процессами в .Net? - PullRequest
3 голосов
/ 18 апреля 2009

Я пытаюсь «обмениваться» объектами .net между отдельными процессами. У меня есть один тип процесса, это веб-сервис, который манипулирует набором сущностей домена. Другим типом процесса является оконная служба, которая выполняет автоматическую пакетную обработку одного и того же набора объектов.

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

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

Является ли «шина обмена сообщениями» правильным способом, позволяющим процессам отправлять друг другу обновленные копии объектов?

Или есть другие решения, которые стоит рассмотреть?

Ответы [ 3 ]

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

Я бы предложил использовать WCF-сервисы. Для локального использования (вызова из службы Windows) вы можете использовать netNamedPipeBinding. Это позволит вам физически разделить эти два процесса в будущем.

1 голос
/ 18 апреля 2009

В наших проектах мы использовали ScaleOut StateServer (коммерческий продукт - www.scaleoutsoftware.com ) для выполнения распределенного кэширования / репликации объектов по всей ферме серверов для аналогичных целей. Это было довольно эффективно, хотя использование объектов влечет за собой (де) издержки сериализации, поэтому во многих случаях мы упрощаем то, что храним, до строковых значений, где это возможно.

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

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

Пример: у вас есть класс 'Group', который имеет свойство 'Leader' и коллекцию 'Members', и все они содержат объекты, которые являются экземплярами вашего класса 'Person'. Вы должны будете использовать пользовательскую сериализацию, чтобы выполнить ее, и ничто не сможет волшебным образом решить проблемы параллельного / грязного обновления, но идея в том, что то, что вы поместите в распределенный кеш, на самом деле будут также отдельными экземплярами Person. как поверхностная копия самого экземпляра «Group». Эта поверхностная копия будет сериализовать обычные свойства «Group» (имя и т. Д.), А также уникальные идентификаторы для каждой ссылки «Person», содержащейся в ней (например, исходный идентификатор базы данных, GUID, уникальное имя пользователя или что-то еще, что подходит), а не Человек возражает сам. Таким образом, вместо Leader у вас будет «LeaderID», а коллекция «Члены» будет сериализована в виде списка «MemberID». Каждое упомянутое лицо также сохраняется как отдельный объект; вот где в игру вступает хитрость параллелизма.

При десериализации (или при доступе, в зависимости от моделей использования) поверхностная копия группы будет следовать всем ссылкам на Person ID и повторно гидрировать эти ссылки с реальными объектами Person, которые хранятся отдельно в распределенном кэше. Вам нужно было бы реализовать механизмы блокировки, чтобы убедиться, что обновления этих объектов, которые могут быть использованы многими различными группами, были безопасными. Вам также потребуется механизм контроля версий и «грязная проверка» всякий раз, когда необходимо перечитать / зафиксировать любые изменения объекта Person, сделанные в распределенном кэше.

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

1 голос
/ 18 апреля 2009

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

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

Рассматривали ли вы проект Velocity ?

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