Распределенная Система - PullRequest
1 голос
/ 25 ноября 2011

Я хочу создать распределенную среду на Java и мне нужна помощь, чтобы разобраться в реализации ситуации клиент / менеджер / работник, как описано в моем псевдокоде ниже.

Manager
BEGIN
    WHILE(true)     
        RECEIVE message FROM client
            IF (worker_connections > 0) THEN            
            FOR (i=0;i<worker_connections;i++) 
                SEND message TO worker[i]
            FOR (i=0;i<worker_connections;i++) 
                RECIEVE result[i] FROM worker[i]             
            SEND merge(result[]) TO client
            ELSE            
            SEND "No workers available" TO client
            END IF
    END WHILE
END

Client
BEGIN
    RECEIVE message FROM user
    SEND message TO manager
    RECEIVE message FROM manager
END

Worker
BEGIN
    WHILE(true)
        RECEIVE message FROM manager
         result = doSomething(message)
         SEND result TO manager
    END WHILE
END

До сих пор я реализовал клиент, как описано в псевдокоде, но у меня возникли проблемы с администратором / работником, поэтому в данный момент клиент просто получает сообщение о том, что рабочих нет. Менеджер может принимать несколько соединений, каждое соединение выполняется как поток, но как мне различить соединение клиента и соединение работника? Как я могу отслеживать количество работников, подключенных в настоящее время?

Клиент, менеджер и работники являются представлениями разных машин, но я работаю только на одной машине (на Java).

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011
  • Q.Как различить клиентское соединение и рабочее соединение?
  • A.Используйте два порта, один для прослушивания соединений от рабочих и один от клиентов.
  • Q.Как я могу отслеживать количество работников, подключенных в настоящее время?
  • A.Иметь механизм регистрации (возможно, в списке работников) для регистрации / отмены регистрации каждый раз, когда работник подключается / отключается.
1 голос
/ 04 марта 2012

В: Менеджер может принимать несколько соединений, каждое соединение выполняется как поток, но как мне отличить клиентское соединение от рабочего?

Полагаю, вы можете определить какой-то протокол, под которым я подразумеваю формат / семантику сообщений, может помочь тип сообщения.Кроме того, что касается распределенной системы, FIFO не может быть хранилищем, я думаю, вы должны использовать какой-то механизм в качестве номера последовательности, логических часов, чтобы позаботиться о соответствии между запросом и ответом.

В: Как мне сохранитьотслеживать количество работников, подключенных в настоящее время?

Во-первых, учетные записи и выход из системы могут быть приняты во внимание, однако, это не всегда возможно, особенно выход из системы;во-вторых, ошибка подключения с использованием тайм-аута, так как в случае сбоя после отправки может быть некоторый порог или сообщение «getResult»;в-третьих, что касается DS, я думаю, что вам лучше применить некоторый алгоритм выборов, чтобы убедиться, что всегда есть рабочий.

...