DiscoveryNodeManagerDiscoveryNodeManagerRemoteNodeStateRemoteNodeStateHeartbeatFailureDetectorHeartbeatFailureDetectorMergingServiceSelectorMergingServiceSelectorAnnouncerAnnouncerCachingServiceSelectorCachingServiceSelectorpollWorkers()loop[each nodeStates.values()]asyncRefresh()refreshNodesInternal()selectAllServices()getServiceAnnouncements()serviceAnnouncementsselectAllServices()serviceDescriptorsmerge(serviceAnnouncements, serviceDescriptors)loop[each service descriptor]Filter healthy servicesgetFailed()failed servicesloop[each service descriptor]Separate descriptors by their node stategetNodeState()node stateupdate allNodes