【问题标题】:Distributed System分布式系统
【发布时间】:2011-11-25 17:56:41
【问题描述】:

我希望在 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 编写)。

【问题讨论】:

  • 我们可以看看你尝试做的一些代码吗?

标签: java frameworks distributed


【解决方案1】:
  • 问。如何区分客户端连接和工作器连接?
  • A.使用两个端口,一个监听来自工作人员的连接,一个来自客户端。
  • 问。如何跟踪当前连接的工作人员数量?
  • A.有一个注册机制(可能在工作人员列表中)以在工作人员每次连接/断开连接时进行注册/取消注册。

【讨论】:

  • 如何在两个端口上使用监听,我的管理器代码正在循环等待新的客户端连接.. new connection_thread(serverSocket.accept()).start();
  • 创建新ServerSocket时可以提供端口号public ServerSocket(int port)。有两个线程打开两个 ServerSocket。
  • 谢谢,我的经理现在可以接受来自不同端口的客户端和工作人员的多个连接!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 2011-11-05
    • 1970-01-01
    • 2023-01-05
    • 2020-08-05
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多