• 扩展Email系统,成就分布式协同


    最近项目关于分布式系统,本来使用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却非常糟糕,很容易出错超时之类的。

  • 相关阅读:
    redis学习汇总
    注解配置springMVC
    为什么MYSQL分页时使用limit+ order by会出现数据重复问题
    springMVC请求访问的整个过程
    springMVC项目配置文件
    springMVC三大组件、spring主要jar包、
    单例模式的三种实现方式
    JDBC连接数据库的7个步骤
    数据结构汇总
    Java基础汇总2019
  • 原文地址:https://www.cnblogs.com/zc22/p/1262913.html
Copyright © 2020-2023  润新知