Я разрабатываю систему, которая активно использует сервисы без сохранения состояния. Я думал, что у меня есть хорошее представление о том, как все работает, однако сейчас я делаю что-то немного другое, и очевидно, что мое понимание ограничено.
У меня есть кластер из 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);
ServiceManifest.xml
для обеих служб? - person Oleg Karasik   schedule 30.10.2018