现在用了如下的方式,但是很明显是失败的。拿出来借鉴一下吧。
将处理过程拆分成几个部分分别是
请求处理、运用算法、交易处理
再通过Observable/Observer依次通知下面的处理操作。本来还想通过将各部分的处理以多线程的方式处理,并放入到线程池根据各个部分的处理快慢来调配线程数目。但是后来等我写好后发现Observer不是说通知到别人就算好了,而是要等到别人处理完成。所以这是一个很失败的试验!

解决方案 »

  1.   

    To songbo_pp
    管理请求队列,请问有什么可循么?如何去做呢?如何去保证不丢失和快速反应呢?
      

  2.   

    谢谢大家的关注!
    To: songbo_pp(皮皮) 说的是不错,但是问题是我现在不想用任何现成queue产品。
    当然是可以自己去实现queue,那又该如何去弄呢?我现在的考虑也是借鉴了一些队列的概念:
    就是在目前分段处理的前提下,使用一个容器(Q)保存下一个阶段要处理的内容,比如
    请求处理:将请求接收到后,放到数据库,同时往容器(Q)里放入请求内容。
    容器(Q):开线程查看自己的请求的长度,并根据这个长度调整“运用算法”的线程数量
    运用算法:是个线程,只关心自己的算法处理!不知道这样可行否,请大家指正。
      

  3.   

    不考虑商业化的Queue就自己做一个吧,就象你说的把请求存入数据库,基本思想是一样的。
      

  4.   

    to nwangwei(初夏草) :用一台机器来专门与终端机进行交互,我称为接口服务器,再就是专门执行计算任务的服务器,他们需要到接口服务器进行注册。接口服务器与计算服务器之间要有一些内部协议,可以通过socket来实现,大致的命令有注册计算服务器,计算服务器向接口服务器报告状态(是否正在计算),计算服务器向接口服务器反馈处理结果,可能是成功、不成功或者是数据。执行的流程是:  1。初始化,计算服务器在接口服务器注册;
      2。接口服务器收到一个请求,压入请求队列;
      3。用一个线程遍历请求队列,取出一个新的请求,然后再遍历注册过的计算服务器,如果存在一台不忙的计算服务器,将请求推给它,并设为忙标志;如果计算服务器都忙,等待下一轮。
      4。计算服务器收到请求后,开始处理,处理完后将结果给接口服务器,这个结果可能是成功的,也可能是不成功的,接口服务器收到后,找到所对应的请求,弹出队列,向客户机发送结果,同时还要将计算服务器的标志改为不忙,让该计算服务器等待下一次任务。  这样就完成了一个简单的流程。
      
      例外控制:
      计算服务器出错,比如异常和断开。
         可以进一步封装客户机请求,比如增加开始处理时间。超时的请求应重新分配计算服务器。这样的话就不会存在丢失。  快速响应,就是我所说的这种方法,分布式计算。
      

  5.   

    不错!先谢谢songbo_pp(皮皮)。但是考虑到时间效应所以近期可能不能采用你的提议,不过确实是个不错的想法。我有空了一定会去尝试一下的。
    我又加了100分,欢迎任何建议!
      

  6.   

    to ldbingshui(笨小孩) :只要服务器接收到就算成功。即便是交易处理失败,当时也是返回成功,只是将来对帐的我会告诉用户那一笔交易失败了。
      

  7.   

    1、即使有专门的“算法服务器”,我认为对于 10笔/秒 的要求,时间更多被浪费在算法上
       除非“算法服务器”有多CPU(4个?5个?),否则仍然难以达到速度要求。
       多线程,归根结底也是线性的时间利用, 300×10=3000=3秒。 
       所以不管是多线程还是队列管理,3秒远大于1秒2、花时间在服务器端把 3秒硬挤进1秒 里面,还不如多话时间考虑终端与服务器间的安全通信
       成果功效可以贯穿整个系统3、如果没有办法 98% 保证服务器与终端通信安全,分布式计算也是个好方法,但要有资金实力
      

  8.   

    onefox(一品狐) ,搂主已经声明了客户不是即时得到服务器的处理结果的,而是一个收到请求的确认信息,至于收到的请求,留待日后慢慢分解。是这样吧,takecare(大厅) ?
      

  9.   

    to:songbo_pp(皮皮)  我的意思是把那个复杂算法放到客户端运行(同时插入一个安全机制)这与客户得到怎样的确认信息没有什么关系吧?!
      

  10.   

    To songbo_pp(皮皮)多谢回答!:)其实我最想要知道的是“接口服务器”和“计算服务器”如何协调:)照你的意思就是单独开一个线程不断遍历?有两个任务,一个是接受,保存,然后快速反馈。另一个就是取出,计算。我的意思其实是这两个任务如何同步和协调的问题。
      

  11.   

    to nwangwei(初夏草) :  每个任务都可以用一个线程来实现,采用notify/wait机制。
      你的意思我还不是很清楚,能举个例子么?
      

  12.   

    To songbo_pp(皮皮)就是第一个任务做好了,我就拍拍屁股走人了:)以下引用楼主的:
    《《《《《《《《《《《《《
        将处理过程拆分成几个部分分别是
        请求处理、运用算法、交易处理
        再通过Observable/Observer依次通知下面的处理操作。本来还想通过将各部分的处理以多线程的方式处理,并放入到线程池根据各个部分的处理快慢来调配线程数目。    但是后来等我写好后发现Observer不是说通知到别人就算好了,而是要等到别人处理完成。所以这是一个很失败的试验!
    》》》》》》》》》》》》》》
        
        我的意思是“请求处理”做好了,我就走人了,不用管我后面的了。但是后面的又要知道“请求处理”已经做好了,要继续“请求处理”未竟的事业:)    对你先前的想法,我是这样想的:就是把“请求处理”作为“接口服务器”余下的步骤作为“计算服务器”。    如何?
      

  13.   

    to nwangwei(初夏草) :
      是这样的,我觉得可以将运用算法、交易处理合二为一,因为运用算法也是为交易处理作准备数据,应该属于交易处理的一部分,当然搂主的具体情况也可能并不是这样的。
      

  14.   

    To songbo_pp(皮皮)对,其实我也是这么设想的,第一个任务就是“请求处理”,“运用算法、交易处理”合二为一为第二个任务。我的意思其实是想知道这两个任务如何同步和协调的问题。因为在我的想法中,第一个任务完成后不用管第二个任务了,这样才能保持快速反应。依你的那个方法,是通过第二个任务来单独开一个线程不断遍历?如何?
      

  15.   

    to nwangwei(初夏草) :  单开一个线程不断遍历是一种方法,但是还是会有延迟的,也可以用上面说的wait/notify机制提高实时性,当第一个任务的线程向队列插入请求时,唤醒第二个任务的线程,这个线程一直运行直到队列为空,然后进入等待状态。  你是不是也正在做这样的系统?
      

  16.   

    http://www-900.ibm.com/developerWorks/cn/java/l-multithreading/index.shtml
      

  17.   

    To songbo_pp(皮皮)   对,马上也要有类似的需求了。
       我再研究研究。   谢谢答复!