• 2011-02-24

    [Code] 分布式初体验 - [Code]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/sgzxy-logs/106585014.html

    因为项目需要,我基于.NET的WCF(TCP双工通道)做了一个非常简单的分布式系统,昨晚完成了第一次全面测试,4台笔记本通过路由器连接,将原本耗时14个小时的任务(主要工作量是网络I/O)只用不到4小时便完成。考虑到那4部笔记本中1部是10年前的配置(奔3M+256M内存)、1部是两年前的Intel Classmate(赛扬M 900),这个效果已经让我小兴奋了一把。

    这个系统属于自我摸索的产物,虽然也是MapReduce,但估计跟Hadoop什么的没有可比性,没有分布式存储,也没有强大的负载均衡,更无虚拟化和安全机制考虑,不过还是可以分享一些使用WCF做类似工作的心得:

    (1)尽量不使用WCF内部的序列化机制,所有复杂对象一律传byte[],序列化和反序列化工作自己来完成(MemoryStream和BinaryFormatter)。你会发现这样的效率比内部机制快得多也稳定得多。

    (2)可以将Map的过程设计为被动式的。也就是Master一开始只为每个Worker分配一个初始的工作量,每个Worker完成工作量到一定程度时再向Master索取更多的工作量。这样不仅保证让每个Worker都尽量全力开动,而且以很简单的实现完成了一种简易的负载均衡。

    (3)若你想让Worker关闭时干脆一点(因为WCF通道的问题,你关闭了界面但不代表Worker进程被终止了),或者实现能够在Master端命令Worker们都停下(不是暂停,而是整个任务彻底终止),我尝试的最简单的办法是通过外部进程强行kill掉Worker并重启(自身kill自身效果总是不好,不知道为啥;另外我需求中的Worker都是无状态的,只是收到啥任务就完成啥任务);若你想在Master端更新了程序后,Worker们都能够在连接时自动完成升级,最简单的办法也是下载了新的程序文件后,通过一个外部进程进行替换操作。综上所述,如果你再额外实现一个Assistant程序,那么以上需求都非常简单。

    目前就想到这么多,希望对有类似需求的人有帮助。

    ==================3.10分界线===============

    6台机器连接,优化了Task设计后,不到2小时完成全部任务。自此达到预定目标。

    分享到: