Как выполнить URL каждого отдельного компьютера каждые х минут?

1

Я работаю над проектом, в котором у меня есть три центра обработки данных - DC1, DC2 и DC3.

В DC1 меня есть 2 машины (machineA and machineB), в DC2 у меня две машины (machineC and machineD) (machineA and machineB), а в DC3 у меня две машины снова (machineE and machineF).

Каждый URL-адрес машины в каждом центре данных подобен этому, и он возвращает обратно строку в качестве ответа -

http://machineName:8080/textbeat

Для DC1-

http://machineA:8080/textbeat
http://machineB:8080/textbeat

Для DC2-

http://machineC:8080/textbeat
http://machineD:8080/textbeat

Для DC3-

http://machineE:8080/textbeat
http://machineF:8080/textbeat

Вот строка ответа, которую я вижу в целом после попадания URL-адреса для какой-либо конкретной машины -

state: READY server_uptime: 12462125 data_syncs: 29

Постановка задачи:-

Теперь мне нужно выполнить итерацию всех машин в каждом датацентре и выполнить URL-адрес, а затем извлечь из него data_syncs. И это нужно делать каждые 1 минуту.

А теперь, если machineA data_syncs всегда равен нулю непрерывно в течение 5 минут, то я хотел бы напечатать DC1 и machineA. Точно так же для machineB и других датацентров.

Логика, о которой я думал,

  • Пинг каждой отдельной машины из каждого центра данных, извлеките значение data_syncs если оно равно нулю, увеличивайте счетчик на единицу,
  • Затем повторите попытку через одну минуту, если значение все еще равно нулю, увеличьте один и тот же счетчик на единицу.
  • Если счетчик достигает 5 (так как он составляет 5 минут), и он все равно остается непрерывно, я бы добавил эту машину и имя центра данных на моей карте.
  • Но предположим, что в течение трех непрерывных попыток это было ноль, а в четвертой попытке оно стало ненулевым, тогда мой счетчик будет сброшен до нуля для этой машины в центре данных и снова запустит процесс для этой машины.

Ниже приведена моя карта, в которой я помещаю центр обработки данных и его машины, если они удовлетворяют вышеуказанному условию -

final Map<String, List<String>> holder = new LinkedHashMap<String, List<String>>();

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

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

public class MachineTest {

    private static int counter = 0;
    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

    public static void main(String[] args) {

        final ScheduledFuture<?> taskUtility = scheduler.scheduleAtFixedRate(new Runnable() {
            public void run() {
                try {
                    generalUtility();
                } catch (Exception ex) {
                    // log an exception
                }
            }
        }, 0, 1L, TimeUnit.MINUTES); 

    }

    protected static void generalUtility() {
        try {
            final Map<String, List<String>> holder = new LinkedHashMap<String, List<String>>();

            List<String> datacenters = Arrays.asList("DC1", "DC2", "DC3");
            for (String datacenter : datacenters) {
                LinkedList<String> machines = new LinkedList<String>();

                List<String> childrenInEachDatacenter = getMachinesInEachDatacenter(datacenter);

                for (String hosts : childrenInEachDatacenter) {
                    String host_name = hosts;
                    String url = "http://" + host_name + ":8080/textbeat";

                    MachineMetrics metrics = GeneralUtilities.getMetricsOfMachine(host_name, url); // execute the url and populate the MachineMetrics object
                    if (metrics.getDataSyncs().equalsIgnoreCase("0")) {
                        counter++;
                        if (counter == 5) {
                            machines.add(hosts);
                        }
                    }
                }
                if(!machines.isEmpty()) {
                    holder.put(datacenter, machines);   
                }
            }

            if (!holder.isEmpty()) {
                // log the datacenter and its machine as our criteria is met
                System.out.println(holder);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // Below method will return list of machines given the name of datacenter
    private static List<String> getMachinesInEachDatacenter(String datacenter) {
        // this will return list of machines for a given datacenter
    }

}

И вот мой класс MachineMetrics -

public class MachineMetrics {

    private String machineName;
    private String dataSyncs;

    // getters and setters
}   

Возможно ли это сделать с помощью ScheduledExecutorService, поскольку это не одноразовый процесс? Это необходимо сделать повторно

В основном для каждой машины, если data_syncs равно 0 в течение 5 minutes непрерывно, тогда мне нужно зарегистрировать этот центр обработки данных и его машины.

Теги:
multithreading
algorithm
scheduledexecutorservice

1 ответ

0
public class Machine{
    private String dataCenter;
    private String machineName;
    private String hostname;
    private int zeroCount = 0;

    //getters setters, except for zeroCount
    // constructor with datacenter,machine as args

    private boolean isEligibleForLogging(String dataSyncs){
        if(dataSyncs.equals("0")){
            zeroCount++;
        }else{
            zeroCount = 0;
        }   

        if(zeroCount > 5){
            zeroCount = 0;
            return true;
        }

        return false;

    }
}


static List<Machine> machines = new ArrayList<Machine>();

static{
    Machine machine1 = new Machine("DC1", "name1","hostname1");
    machines.add(machine1);
    //repeat the above two lines per each machine.
}


protected static void generalUtility() {
    try {

        for (Machine machine : machines) {

                String host_name = machine.getHostName();
                String url = "http://" + host_name + ":8080/textbeat";

                String dataSyncs = //execute url and get datasyncs
                if(machine.isEligibleForLogging()){
                    System.out.println(machine.getName() + ... +machine.getDataCenter() + ... + dataSyncs......);
                }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}
  • 0
    Спасибо, Чамиль. Нужна ли dataSyncs переменная dataSyncs вашем классе Machine? Во-вторых, что произойдет в этой ситуации - предположим, что впервые dataSyncs был zero для конкретной машины, поэтому zeroCount будет равен 1 но в следующий раз он не будет равен нулю, тогда все равно будет один для этой машины. Если да, то я думаю, что это не то, что мне нужно, это должно быть 5 попыток.
  • 0
    Спасибо, что насчет моего второго вопроса? есть идеи? - Предположим, что впервые dataSyncs был равен нулю для конкретной машины, поэтому zeroCount будет равен 1, но в следующий раз он не будет равен нулю, тогда все равно будет один для этой машины. Если да, то я думаю, что это не то, что мне нужно, это должно быть 5 попыток.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню