zoukankan      html  css  js  c++  java
  • 一个word合并项目的分布式架构设计

    一个word合并项目的分布式架构设计

    项目背景与问题起源

    我们要给一个客户做word生成报告以及报告合并的工作,要合并的报告非常多,而且每个报告也比较大,一个多的报告大概有200页以上。我们用c#操作word,并把程序部署到了一个配置还可以的服务器上。现在大概有20几个客户端,每个客户端把生成的数据传输到服务器上,等到一组数据完整之后,会触发合并报告。我们的程序会自动生成N份报告,并把这N份报告合并成一个大的报告。

    但随着要合并的报告越来越多,word经常会报一些异常,这些异常是单机版从来没有出现过的。(一样的代码,单机版已经运行了几年了)我们查了很多资料,也没有解决这些异常。同时我们观察了服务器的资源占用情况,CPU和内存占用都不多,这说明不是资源的问题。

    思考与解决方案

    我们考虑了很久,觉得可能是word本身的bug(当然,这个可能性比较小,但我们没有别的办法了)。word被设计成一个单机版的软件,对通过API同时操作多个word的情况可能没有处理。考虑到这里,我们在想,有没有办法把每个生成word和合并word都变成单机版操作呢?我们想到了分布式的方法。

    解决方案是这样的,我们可以利用虚拟机(XEN)虚拟出N个系统,每个系统里面部署一个生成报告和合并报告的程序(slave)。在外面现在的服务器(master)上,部署主程序,用来分发任务。但是这样的话就要做一个任务控制器(controller),这个控制器要去控制下面每个slave的任务,要了解slave的运行状态,并给slave分配任务。如果任务比较多,还要做一个任务队列,用来存储任务。这个控制器的功能虽然很常见,但是也有一定的复杂度,有没有更好的方案呢?

    我们忽然想到之前用过MQ发送消息,消息可以永久性的存储在queue里面,直到有consumer拿走消息。我们可以利用MQ的这个功能,实现controller。具体实现就是首先部署一个MQ,在现在的服务器上部署一个程序,这个程序的主要功能是:

    1. 接收客户端发过来的请求。
    2. 把此请求转发到MQ的队列中。
    3. 读取另外一个完成队列中的内容,返回到客户端。

    slave上面程序的主要功能是:

    1. 如果没有任务,则从MQ中读取任务队列。
    2. 读到任务队列后,执行任务,并向MQ的完成队列中发消息标志完成。

    需要注意的是:

    1. master与slave之间是异步的。
    2. 客户端与服务器是同步的。
    3. 自动做了负载均衡,单个slave的故障对系统没有影响,如果负载很大,直接增加slave即可,扩展性非常好。
    4. slave部署在虚拟机上,虚拟机用XEN实现,控制起来非常方便。

    其图如下图所示:
    Alt text
    【大半夜画图有点糙】

    总之,这个方案应用MQ,降低了代码开发的复杂性。

    各位如果对此方案有和建议,请不吝赐教。

    PS:这篇文章是我用markdown写的第一篇文章,马克飞象很赞!

  • 相关阅读:
    [Ramda] allPass, propEq
    [Elm] Installing and setting up Elm
    [Node.js] Use nodejs-dashboard event loop delay with hrtime()
    [Node.js] Use Realm Object Database with Node.js
    [CSS] Manipulate Images Using CSS Filter and Blend Modes
    Android实现弹出输入法时,顶部固定,中间部分上移的效果
    [置顶] linux下让php支持mysql——寻找消失的mysql
    Conversion between json and object using SBJson lib
    Linux2.6内核--中断线被关闭的情况
    字符串、十六进制、byte数组互转
  • 原文地址:https://www.cnblogs.com/wardensky/p/4162151.html
Copyright © 2011-2022 走看看