我是一名相对新手的程序员,对Java很新,我的任务是创建一个运行两种类型应用程序的分布式系统。单个“服务器/路由器”和所需数量的客户端 - 服务器“节点”。
- 服务器/路由器将维护一个客户端连接信息表
- 节点将在它们产生时发送连接信息
- 节点A可以从节点B请求文件F
---此请求被发送到路由器,路由器查找B的连接信息并发送对F
的请求--- B开始将F流式传输到路由器,路由器又将F流式传输到A
这是一般的想法。听起来这很简单,如果不是因为我之前从未做过任何分布式计算...所以我的问题不是如何纠正代码,而是我的设计是否会起作用(和如果它不会,我怎么纠正它)
所以我的想法是创建一个公共类AVRouter,另一个类AVNodeInfo和一个第三类ConnectionMap; AVRouter将拥有一组AVRouterInfo对象,其中包含每个节点的名称,端口号和IP地址。它还将有一个ConnectionMap队列对象,我很快就会得到它。
AVRouter将有一个ServerSocket专门用于在节点启动时接收来自节点的连接信息,并用所述数据填充其AVNodeInfo表。它将有另一个文件请求端口;它将使用请求者和响应者的连接信息生成一个ConnectionMap对象,它将添加队列。
虽然队列中有ConnectionMaps,但它会使用第一个来促进传输。
最后一节AVNode更简单;在产生它将它的信息发送到路由器,然后它等待用户输入命名另一个节点和它希望从该节点请求的文件。当一个可用时,它会向路由器发送一个完整的请求。
处理AVNodeInfo表的逻辑可能只是用超时处理 - 如果它是自节点发出请求以来的X时间,节点将自行终止,表将自己从表中删除它。 ..这是一个小规模的概念验证型项目,所以它还没有真正处理这个细节的范围。
所以我实际上有两个问题:
1)这个设计会好吗,还是应该改进?
2)如何处理从源A到路由器B到目的地C的流数据,而实际上没有完全从A转移到B,然后从B转移到C?
我希望这个问题在StackOverflow的范围内;我知道这是设计而不是代码,但我相信它足够具体。
答案 0 :(得分:0)
主要概念听起来非常好,可能是最容易实现的(具有最少的陷阱)。它实际上是一种标准方法。
您可能需要考虑,而不是从节点向服务器发送文件,然后转发到请求节点,以使节点彼此直接连接。节点A只询问服务器文件F ,然后直接连接到节点B. (这应该减少网络负载,因为数据传输的路线较短)。但它增加了一些复杂性(每个节点必须能够到达任何其他节点和,使每个节点成为服务器)。复合方法是尝试直接连接,如果失败则回退到via-server方法。
您可以实施原始概念,当它有效时,看看您是否需要/需要该扩展。
编辑:我可能会融合NodeInfo和Connection(连接作为NodeInfo的成员) - 服务器应该只有一个连接到每个节点(或者如果使用多个连接,NodeInfo将保存一组打开的连接到该特定的节点)。
编辑:增加概念的可行性。它通常像BitTorrent这样的P2P共享程序实现。 “跟踪器”充当初始“路由器”,告诉每个客户端其他对等方。然后,同行使用直接连接互相交谈。所以它与你提出的实际相同,只是没有使用服务器/路由器作为桥梁的数据流量(对于明显的带宽问题,它会与P2P理念相矛盾)。