2011-11-25 113 views
1

我期待在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)。

+0

我们可以看到你试图做的一些代码吗? – Marcelo

回答

2
  • 问:如何区分客户端连接和工作人员连接?
  • A.使用两个端口,一个用于监听来自工作者的连接和一个来自客户端的连接。
  • 问:我如何跟踪当前连接的工人数量?
  • 答:有一个注册机制(可能在工作人员列表)注册/注销每次工人连接/断开连接。
+0

如何在两个端口上使用listen,我的管理器代码正在循环等待新的客户端连接。new connection_thread(serverSocket.accept())。start(); –

+2

你可以在创建一个新的ServerSocket'public ServerSocket(int port)'时提供一个端口号。有两个线程打开两个ServerSocket。 – Raihan

+0

谢谢,我的经理现在可以接受来自不同端口的客户和工作人员的多个连接! –

1

问:管理器可以接受多个连接,每个连接都作为一个线程运行,但是如何区分客户端连接和工作者连接?

我想你可以定义一些协议,我的意思是消息的格式/语义,消息类型可能有所帮助。另外,对于分布式系统,FIFO不能是拱形的,我想你应该使用一些机制作为序列号,逻辑时钟来处理请求和响应之间的匹配。

问:我如何跟踪当前连接的工人数量?

首先,可以考虑登录和注销,但并非总是可行,尤其是注销;第二,使用超时连接错误,至于发送后崩溃,可能会有一些阈值或“getResult”消息;第三,对于DS,我认为你最好应用一些选举算法来确保总是有工人。