请看如下的系统架构(100分)

H

hongsen

Unregistered / Unconfirmed
GUEST, unregistred user!
一个网站内容监控的程序
使用方式:用户发出搜索任务,网络机器人根据任务到网上搜索网页,解析程序找出用户感兴趣的东西后通知用户。
我设想的实现如下:
(1)Client程序和数据库通信,将发出的任务保存在数据库中
(2)Server程序从数据库中取出任务队列,调用网络机器人根据任务到网上搜索网页,基于下载的网页生成解析任务,保存在数 据库中
(3)解析程序从解析队列中获取任务,进行解析,发现找到的东西就生成报警信息保存到数据库中
(4)报警程序从报警队列中获取报警任务,给用户发送报警信息。
整个实现中网路机器人、解析程序、报警程序互不通信。只靠数据库来进行异步通信。服务端程序用JAVA实现。
按道理网路机器人、解析程序、报警程序完成的是一个工作流的三个环节,应该同步才好。考虑到网络下载程序的速度,我决定将网页分析程序以异步的方式分出来。
问题如下:
(1)因为前端和后端程序不通信,后端网路机器人、解析程序、报警程序互不通信。所以每个程序为了获取相应任务队列,需要不停地去访问数据库,而且时间间隔很短(客户当然希望各个任务完成的越快越好。)这样是不是会造成系统的资源占用很厉害?
这种数据库轮询,我所设想的实现是一个while循环,看起来觉得很别扭。
另外一个问题就是客户端发出的任务规定在每天的某个时间段执行,而且不同天的时间段可能不同(用户一般不会这么BT,但有这种可能),如何实现?

(2)大家都说开发程序时应该隔离对数据库的访问。那么,有没有具体的实用的代码可供参考?
J2EE Core Pattern一书中讲到要将数据库的访问隔离起来,具体的实现方案就是定义独立的数据对象和数据访问对象。
其中,数据对象和数据访问对象是一对一的关系,数据访问对象提供对数据对象的插入、修改、删除、查询。那么,对于涉及多表的查询,如何定义其数据对象和数据访问对象?在数据访问对象提供的方法中,以数据对象为参数是否显得粒度太大。例如,我仅仅改了某个字段,但该方法提供的UPDATE语句是不是要支持对任何非关键字段的修改?
如果为每一个最终的SQL语句准备一个方法,则这样的函数将会很多。特别实业务逻辑很庞大很复杂时。本人曾经接触过一个大系统,其中用到的不同的SQL语句就多大8000个。该系统是用C实现的,按前面的说法,也就是实现了8000个函数。所幸该系统提供了自动生成工具。
 
这个东西比较有意思,我比较喜欢。
其实我想在你们网路机器人、解析程序、报警程序他们3者之间应该有一个数据池的概念,
他们可以供享一部分内存,其中静态数据是异步向数据库提交的,其实静态数据想数据库提交这一层应该最好由JDO来做,JDO知道该什么时候合适向数据库提交数据,减少数据库的并发访问(00数据库最怕这个了),从而实现性能上优化。
现在我们可以设想一下如果我们说“数据池”本身就是一个类的话,保存着客户的任务,
解析任务,智能化的控制着数据量的大小,具体实现您可以参考一下JIVE的缓存的机制。
 
谢谢billy_yuan的热心。
我将网络抓取程序、解析程序、报警程序分割成异步方式是希望能够保持性能。但是如何实现
这三者的异步通信呢,用独立的进程,还是用线程?事实上我在分别实现抓取程序、解析程序时已经采用了大量的工作线程。所以感觉线程太多不好控制,特别是相互间的通信。
关于数据库访问,我目前采用的是ORACLE的JDBC,对JDO从没有用过。不知新学JDO是否代价太大?
 
其实对于前后台通信,最实时的实现是前后台直接通信。但本人SOCKET编程不多。而且觉得如果在SOCKET一级来通信并且定义自己的应用协议,很是麻烦。所以呢,就只好通过数据库来作为通信中心了。
 
我的意思是说,网络抓取程序、解析程序、报警程序他们3个都通过“数据池”来通讯,
由“数据池”来控制他们之间的联系,让“数据池”接收客户的任务,他来给解析程序
分配任务,他把解析来的信息存入数据库,数据池与他们的通讯都是基于无连接的访问
这样就能实现异步和减少对服务器资源的消耗。
我目前采用的是ORACLE的JDBC,对JDO从没有用过。不知新学JDO是否代价太大?
先用JDBC吧,毕竟这是非常成熟的技术。JDO存储机制是一个非常先近的思想,
肯定值得学,。NET也有类似的产品。
 
接受答案了.
 
顶部