随笔 - 94  文章 - 25 评论 - 267 trackbacks - 9
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

与我联系

搜索

 

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

猛人

最新评论

阅读排行榜

评论排行榜

最近项目关于分布式系统,本来使用Web Service处理,但是遇到了最大一个麻烦:

 

我们是租用虚拟主机,对方虚拟主机每1分钟就会清空进程,导致长事务处理失败,影响数据库稳定性。

 

后来我想到了经典的Email系统,简单的思路:

1.需要分布式协同的数据对象序列化,然后DES对称加密算法加密,最后进行GZip压缩,作为Email的正文。

2.对Email的标题进行特别处理

3.发送一封Email到邮箱。

4.发送一个信令到目标系统,通知他收Email

5.对方读取Email,寻找对应的Email,获取里面的正文进行处理,删除这份Email

6.对方返回一个信令,通知本地操作成功。

 

至于信令的发送用回经典的WebService方法。

 

这样,整个分布式架构就完全穿越防火墙,体现了WebService优点,又保证了分布式事务处理的安全。

 

后续:

这个思路和UDP很像,而且有效。关键点是:本地Smtp发送了Email之后,必须线程等待,然后再通知对方采用Pop3收邮件,否则由于延迟无法收。

 

[2008-8-8]

上文的思路太简单,我没有写明白,现在具体说说我的实现方式:

1.分布式协同,无非就是数据的分布式处理,即分布式环境下数据库数据的同步。

2.数据库操作包括insert, update, delete需要协同,其他的不需要

3.select不需要协同,因为多个数据库保存着有效的数据副本就行了。

4.数据库一个事务处理,无非就是insert,update,delete的处理

 

我的思路:

1.写一个类,能够反映当前表的处理方式和顺序。

Class DataTableItem

{

int sequence;//数据在事务中的处理顺序

DataTable table;//被处理的数据

ProcessStatus status;//处理方式,insert, update, delete

}

public enum ProcessStatus

{

Insert,

Delete,
Update

}

 

2.一个处理流程:

。通过WS与对方第一次握手,得到一个Token

。把需要事务处理的数据保存在数据结构 List<DataTableItem>里面。

。对数据结构进行序列化、用TOKEN进行DES加密,用GZIP进行压缩

。写一封Email,标题特别处理,内容是处理后的数据,SMTP发送Email

。Thread.Sleep(5000)

。通过WS通知对方接受邮件

 

。对方通过POP3读取所有邮件,分析Email的标题,得到当前需要处理的Email

。对方利用TOKEN解密数据,事务处理,返回处理结果到本地。

 

。本地接受到了对方的处理结果,一个事务处理完毕

 

3.思路非常简单有效,充分利用了EMAIL系统,EMAIL系统非常经典,完全经受的住各种环境下的考验,但是微软的WS却非常糟糕,很容易出错超时之类的。

-------------------------------

大城小格最新商品列表 来源大城小格开放平台Beta版,详情请登录:大城小格

posted on 2008-08-07 15:05 阅读(1803) 评论(14)  编辑 收藏

FeedBack:
#1楼  2008-08-07 15:12 坏人      
假如你的WS没有事务,还会失败吗?假如你这样做,还具备事务性吗?不太理解为什么要这样做。
  回复  引用  查看    
@坏人

WS没有事务,那么就没有用了。但是WS又不能够长连接,否则Timeout,因此传递不了大数据。

我这样做,一封Email就是一个事务。
  回复  引用    
#3楼  2008-08-07 16:37 坏人      
ws是可以传递大量数据的,应该是你的设置有问题,毕竟用WS的话,不用自己处理很多细节,出错几率会小很多。
  回复  引用  查看    
#4楼  2008-08-07 16:38 坏人      
比如CLIENT的连接超时时间,SERVER的超时时间以及接收数据量限制等,可以查下这些配置。
  回复  引用  查看    
#5楼  2008-08-07 16:38 坏人      
并且你这样走MAIL,本身就已经没事务了,不是吗?
  回复  引用  查看    
@坏人
我说的不能传输大容量文件不是说,asp.net中config的安全考虑配置的,而是对方虚拟主机每1分钟会清空一次进程,这个非常要命,一个大事务处理肯定超过1分钟,数据还没有传输完毕,对方就把本次进程清楚了,非常不稳定。

这个肯定避免不了,例如中国万网、西域数码等。除非自己安装服务器。

至于Email,一次把所有事务处理打包成为一个Email,只要这封email能够正确处理,那么这次事务就处理完成。
  回复  引用    
#7楼  2008-08-07 16:49 鬼不灵      
不明白,路过。。。
  回复  引用  查看    
#8楼  2008-08-07 19:15 坏人      
既然mail都可以发出去了,说明数据是能够发出去的,既然如此,你把数据走WS和MAIL的区别在什么地方呢?
  回复  引用  查看    
#9楼  2008-08-07 21:06 G yc {Son of VB.NET}      
原来,现在的虚拟机提供商,都是这么变态啊~~
  回复  引用  查看    
楼主下面没有了?
  回复  引用    
学习
  回复  引用    
#12楼  2008-08-09 08:57 NormRen [未注册用户]
很有创意
要是有人发现你的信箱,大量发垃圾邮件呢?
  回复  引用    
#13楼  2008-08-09 11:15 G yc {Son of VB.NET}      
^_^

还不算什么创意。
WCF中,对移动设备里面,就有一个使用Email的
不过,要求用的是ExchangeServer, 使用其中的直达功能
  回复  引用  查看    
#14楼 [楼主] 2008-08-09 14:25       
@NormRen

一般企业级邮箱里面有个 黑名单、白名单。

我们只要设置好白名单,这个邮箱就是我们系统内部专用了。
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-08-08 13:23 编辑过
Google站内搜索


相关链接:
 



大城小格 全球格仔铺的领航者