我必须编写一个分布式系统,在四个不同的节点上运行四个进程。分布式系统应该按以下方式工作:随机数生成器在每个进程生成一个随机数。目标是通过进程之间的消息传递在所有进程中均衡这些值。这样,进程A是从所有进程中获取数字然后命令它们将其一部分数字发送到一个或多个其他进程以便均衡进程所持有的所有数字的服务器。例如,A的计数为30,B的计数为65,C的计数为35,D的计数为70.计算30 + 65 + 35 + 70 = 200除以4 = 50.现在,服务器的进程A知道谁少了超过平均水平,谁超过平均水平。现在问题是A如何决定谁向谁发送什么号码?平衡所有过程的价值。请注意,A不能直接指示进程递减或增加其计数,例如它不能向B发送消息并告诉它递减15然后再向C发送另一条消息并告诉它增加15.必须向B发送一条消息,告诉B递减15然后发送一条消息消息到C并告诉它增加15或换句话说它告诉B将你的15个计数发送给C.提前谢谢。扎基。
答案 0 :(得分:1)
据我所知,没有特定的配方或只能很好地定义模式来实现这样的分布式系统(如果有材料给出参数指南,请参阅问题末尾的链接)。 这里涉及各种选择,这将决定最终系统,它的可扩展性,如何响应,如何将是坚实的等等。
您将问题标记为语言无关。我确信好的概念比技术更重要,但最终必须做出选择,这样的系统太复杂了,不能用一种你不熟悉的语言构建。
我会用C#构建它,因为它是我的主要开发语言,继续使用面向agile development的技术。
详细说明,即使使用原始套接字,也可以构建它;但为了简单起见,我建议您在HTTP protocol上找到您的系统(例如,使用.NET BCL HttpListener和HttpClient组件作为基础)进行通信:
GET
消息集可以在对等服务器之间执行同步。POST
消息可用于交换随机数据。关于数字的产生,它打开了一个全新的世界。我会依赖ANU Quantum Random Server之类的外部服务(如果你可以计算一个活跃的互联网连接)。我知道你说你有一个算法要实现,我提供了一个替代方案(我不知道这个部分是否可以改变)。
至少,如果您使用.NET框架,我建议您阅读this article以及this关于 peer-to-peer 。
答案 1 :(得分:0)
您描述的问题称为分布式聚合。有许多解决方案适用于网络上的不同假设(连接哪些节点?消息丢失?),计算功能(平均值?总和?)等等。可以在http://arxiv.org/abs/1110.0725找到一个很好的概述,参考您可以使用的算法。