public IObservable <TResponse> CreateRequestResponseOperation <TRequest, TResponse>(string operationName, TRequest request, bool waitForSuitableService = false) { return(Observable.Create <TResponse>(o => { _log.Info("Creating request response operation"); var disposables = new CompositeDisposable(); disposables.Add( // we only take one as once we've found a service we use that for the remainder of the operation, // if there are errors, a higher level service will deal with how to retry _serviceInstanceStreamCache.GetServiceWithMinLoad(waitForSuitableService) .Take(1) .Subscribe(serviceInstanceStatus => { if (!serviceInstanceStatus.IsConnected) { o.OnError(new InvalidOperationException("Disconnected")); } var remoteProcedure = $"{serviceInstanceStatus.ServiceId}.{operationName}"; _log.Info($"Will use service instance [{serviceInstanceStatus}] for request response operation"); disposables.Add( _connection .RequestResponse <TRequest, TResponse>(remoteProcedure, request) .Subscribe(o) ); }, o.OnError) ); return disposables; })); }