一个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实现,控制起来非常方便。

其图如下图所示:

【大半夜画图有点糙】

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

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

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

一个word合并项目的分布式架构设计的更多相关文章

  1. Slithice 分布式架构设计

    项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...

  2. 大型分布式架构设计与实现-第一章SOA(面向服务的体系架构)

    拜读了大型分布式架构设计与实现,觉得该书作为入门不错,但内容过于简单,描述过于琐碎,小节之间连续性不强,不适合深入钻研学习.但为了更多的希望向架构师行业靠拢的工程师学习需要,本博客将对上书进行简化讲解 ...

  3. Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构

    Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...

  4. 『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布

    项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...

  5. 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则

    转载:http://space.itpub.net/17007506/viewspace-616852 腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室( ...

  6. 以一个权限系统来告别WebForm —(一)项目整休架构设计与数据库设计

    在本节我想与大家与分享一下,我所将要做的权限系统的架构和数据库的表的设计.请各位大神们对我项目中设计的不足之处进行指导,让我得以更好的写完它,留给需要它的人. 我的项目架构如下图所示: 如上图所示,在 ...

  7. 分布式架构设计(一) --- 面向服务的体系架构 SOA

    1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调用方和服务提供方.服务调用方发 ...

  8. crm项目开发之架构设计

    CRM customer relationship management 客户管理系统 1. 干什么用的? 管理客户 维护客户关系 2. 谁去使用? 销售 班主任 项目经理 3. 需求: 1. 登录 ...

  9. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

随机推荐

  1. C#实现GDI+基本图的缩放、拖拽、移动

    C#实现GDI+基本图的缩放.拖拽.移动示例代码如下: using System;using System.Collections.Generic;using System.ComponentMode ...

  2. 面试题_48_to_65_Java 集合框架的面试题

    这部分也包含数据结构.算法及数组的面试问题 48) List.Set.Map 和 Queue 之间的区别(答案)List 是一个有序集合,允许元素重复.它的某些实现可以提供基于下标值的常量访问时间,但 ...

  3. HDU 4923

    题目大意: 给出一串序列Ai{0,1},求一个序列Bi[0,1](Bi<Bi+1),使得sigama(Ai-Bi)^2最小 思路: 若B相同,则取A的平均数可使方差最小 若B有序,   若A== ...

  4. int和integer;Math.round(11.5)和Math.round(-11.5)

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  5. 发布mvc3的项目时system.web.mvc 版本 为3.0.0.1高于服务器版本3.0.0.0 升级到3.0.0.1

    下载地址在这里: http://www.microsoft.com/zh-cn/download/details.aspx?id=44533&WT.mc_id=rss_alldownloads ...

  6. jdom学习读取XML文件

    用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类.Element类等的方法读取所需的内容.IB ...

  7. MVC&WebForm对照学习:文件下载

    说完了WebForm和MVC中的文件上传,就不得不说用户从服务器端下载资源了.那么今天就扯扯在WebForm和MVC中是如何实现文件下载的.说起WebForm中的文件上传,codeshark在他的博文 ...

  8. MVC&WebForm对照学习:ajax异步请求

    写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...

  9. CPC23-4 K.喵喵的神·数

    题意:给出整数T,P,求c(T,P) mod P. 解法:用卢卡斯定理. 卢卡斯定理:解决c(n,m) mod p问题.Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) ...

  10. JTA事务管理--配置剖析

    概述    [IT168 专稿]Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻.但是很大部分人都还认为 ...