Каков правильный способ разрешения ссылки на службу без сохранения состояния структуры служб?

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

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

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

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

Я могу найти экземпляр, используя код, аналогичный этому, но что произойдет, если этот экземпляр выйдет из строя. Как получить другую ссылку?

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

Вот как я разрешаю службы, поскольку использую пользовательскую сериализацию V2.

            var _proxyFactory = new ServiceProxyFactory(c =>
            {
                return new FabricTransportServiceRemotingClientFactory(                                        
                    serializationProvider: new CustomRemotingSerializationProvider(Logger)
                );
            });

            var location = new Uri("fabric:/xyz/abcService");
            var proxy = _proxyFactory.CreateServiceProxy<TService>(location); 

Это действительно работает, однако, похоже, разрешает службу только на том же компьютере. Таким образом, ServiceA разрешит ссылку на ServiceB на той же машине. Однако, если ServiceB не существует на компьютере по уважительной причине, разрешение не удастся.

Обзор:

Как ServiceA правильно использует пользовательскую сериализацию версии 2 ServiceProxyFactory для разрешения ссылки интерфейса на ServiceB везде, где ServiceA и ServiceB находятся в кластере?

Обновление:

Доказательством того, что это не работает, является призыв разрешить зависание навсегда. Согласно этой ссылке это правильное поведение. потому что услуга в конечном итоге придет. Однако только 1 узел когда-либо разрешал его правильно, и это узел, на котором активен единственный экземпляр. Я пробовал несколько вещей, даже подождав 30 секунд, чтобы убедиться, что это не проблема инициализации.

var proxy = _proxyFactory.CreateServiceProxy<TService>(location);

// Never gets here except on the one node.
SomethingElse(proxy);

Код прослушивателя

По сути, это соответствует версии 2. учебник по сериализации почти точно.

    var listeners = new[]
    {
        new ServiceInstanceListener((c) =>
        {
            return new FabricTransportServiceRemotingListener(c, this, null,
                new CustomRemotingSerializationProvider(Logger));
        })
    };

public class HyperspaceRemotingSerializationProvider : IServiceRemotingMessageSerializationProvider
    {
        #region Private Variables

        private readonly ILogger _logger;
        private readonly Action<RequestInfo> _requestAction;
        private readonly Action<RequestInfo> _responseAction;

        #endregion Private Variables

        public CustomRemotingSerializationProvider(ILogger logger, Action<RequestInfo> requestAction = null, Action<RequestInfo> responseAction = null)
        {
            _logger = logger;
            _requestAction = requestAction;
            _responseAction = responseAction;
        }

        public IServiceRemotingRequestMessageBodySerializer CreateRequestMessageSerializer(Type serviceInterfaceType, IEnumerable<Type> requestWrappedTypes,
            IEnumerable<Type> requestBodyTypes = null)
        {
            return new RequestMessageBodySerializer(_requestAction);
        }

        public IServiceRemotingResponseMessageBodySerializer CreateResponseMessageSerializer(Type serviceInterfaceType, IEnumerable<Type> responseWrappedTypes,
            IEnumerable<Type> responseBodyTypes = null)
        {
            return new ResponseMessageBodySerializer(_responseAction);
        }

        public IServiceRemotingMessageBodyFactory CreateMessageBodyFactory()
        {
            return new MessageBodyFactory();
        }
    }

Код подключения

            _proxyFactory = new ServiceProxyFactory(c =>
            {
                return new FabricTransportServiceRemotingClientFactory(                                        
                    serializationProvider: new CustomRemotingSerializationProvider(Logger)
                );
            });

// Hangs here - tried different partition keys or not specifying one.
var proxy = _proxyFactory.CreateServiceProxy<TService>(location, ServicePartitionKey.Singleton); 

person Telavian    schedule 27.10.2018    source источник
comment
Каковы доказательства того, что он терпит неудачу, когда служба B доступна только на других узлах. Какое исключение он дает? Я спрашиваю это, потому что это должно просто работать.   -  person Peter Bons    schedule 27.10.2018
comment
@PeterBons Я добавил обновление. Я не уверен, что еще попробовать. Меня это совершенно ставит в тупик. Кажется, что чего-то фундаментального не хватает.   -  person Telavian    schedule 27.10.2018
comment
Я видел такое поведение в ситуациях, когда удаленное взаимодействие версии 2 было неправильно настроено. Может ли быть что-то подобное?   -  person LoekD    schedule 28.10.2018
comment
Включен ли на узлах брандмауэр? Брандмауэр может блокировать связь между узлами, возможно, вам придется открыть двери, используемые этими службами, если он включен!   -  person Diego Mendes    schedule 29.10.2018
comment
@LoekD Может быть, как сказать? Все остальное работает корректно с V2.   -  person Telavian    schedule 29.10.2018
comment
@DiegoMendes Какие порты открыть? SF Explorer не показывает конечную точку, зарегистрированную для экземпляра.   -  person Telavian    schedule 29.10.2018
comment
Можете ли вы поделиться кодом инициализации конечной точки и ServiceManifest.xml для обеих служб?   -  person Oleg Karasik    schedule 30.10.2018
comment
@OlegKarasik Добавлен код для отображения конечной точки открытия службы и подключения службы к конечной точке.   -  person Telavian    schedule 02.11.2018