code: public Set<Integer> getAliveTasks(String topologyId, Set<Integer> taskIds) throws Exception {
          Set<Integer> aliveTasks = new HashSet<>();
  
          // taskIds is the list from ZK /ZK-DIR/tasks/topologyId
          for (int taskId : taskIds) {
              boolean isDead = NimbusUtils.isTaskDead(nimbusData, topologyId, taskId);
              if (!isDead) {
                  aliveTasks.add(taskId);
              }
          }
          return aliveTasks;
      }
docs: find all alive task ids. Do not assume that clocks are synchronized.
  Task heartbeat is only used so that nimbus knows when it's received a new heartbeat.
  All timing is done by nimbus and tracked through task-heartbeat-cache
  
  @return Set<Integer> : task id set