linux的CPU负载均值

当运行在Linux上的程序有问题之后,我们通常要看一下当前CPU和内存的使用情况来分析一下问题 对于CPU的使用率,通常用Load Average,也就是负载均值来度量 负载均值是啥? 负载是啥,负载就是对CPU使用率的一个计量,均值就是某一段时间内的一个平均值。 怎么看啊? 直接输入w命令 第一位1.20:表示最近1分钟平均负载 第二位1.28:表示最近5分钟平均负载 第三位1.29:表示最近15分钟平均负载 或者uptime命令 我们一般认为0.00表示无负载,可以理解为CPU空闲,1.00表示CPU满负载,但是注意,1.00是对于单cpu来说的,也就是说,如果是双核,那么这个满负载显示的值应该是2.00,以此类推。 怎么看我是几核啊 通过统计cpuinfo的model name信息来算的 这三个值哪个重要? 一分钟内突然负载很大没关系,当然如果你要排查也没人拦着,如果15分钟的负载均值超过cpu的数目,就要关注了。 那什么就是理想负载呢? 以单个cpu为例,1.00表示cpu满负载运行,没有一点点浪费,实际上,有些管理员认为0.7也许是理想的状态。如果你的经常超过0.7,那么最好查一查。

eclipse管理多个workplace

由于eclipse用的比较多,管理多个workplace很麻烦,经常需要打开以后再切换,简单介绍个方法。 一 1.进入Eclipse的安装目录,鼠标点击eclipse.exe,右键菜单–>发送到–>桌面快捷方式 2.到桌面上找到“eclipse.exe - 快捷方式”,鼠标右键点击查看属性,弹出菜单中选择“快捷方式”标签,然后在“目标”中增加内容:-data e:\workspace,保存后即可 3.双击这个快捷方式,eclipse就会使用e:\workspace作为工作空间启动。 这样你多复制几个,就好了。 二 1.找个目录,新建一个文件夹,名称为workspace_aaa 2.然后在当前目录下新建一个txt文件 3.输入内容为: 说明:前面是eclipse的路径,中间加上”-data” ,后面为工作空间的路径,start要有,不然打开eclipse之后,命令行窗口不会自动消失的,很是碍眼。 4.将这个txt保存为workspace1.bat 5.双击这个workspace1.bat,eclipse就会使用workspace1.bat 作为工作空间启动。  对launchy党来说,新建个目录,然后创建好多个bat,以后直接快速启动真是太方便了

[藏]运用 BoxLayout 进行 Swing 控件布局

写的非常非常好的一个教程,感谢陈 怡平 引言 在用户使用 Java Swing 进行用户界面开发过程中,会碰到如何对 Java Swing 的控件进行布局的问题。Swing 的控件放置在容器 (Container) 中,容器就是能够容纳控件或者其它容器的类,容器的具体例子有 Frame、Panel 等等。容器需要定义一个布局管理器来对控件进行布局管理,Swing 当中提供的主要的布局管理器有 FlowLayout、BorderLayout、BoxLayout、GridLayout 和 GridBaglayout, 它们的主要特点如表 1 所示: 表 1. Swing 中的一些主要布局管理器的比较 BoxLayout 介绍 如前所述,BoxLayout 可以把控件依次进行水平或者垂直排列布局,这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列。BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列。下面是一个创建 BoxLayout 实例的例子: 当 BoxLayout 进行布局时,它将所有控件依次按照控件的优先尺寸按照顺序的进行水平或者垂直放置,假如布局的整个水平或者垂直空间的尺寸不能放下所有控件,那么 BoxLayout 会试图调整各个控件的大小来填充整个布局的水平或者垂直空间。 BoxLayout 往往和 Box 这个容器结合在一起使用,这么做的理由是,BoxLayout 是把控件以水平或者垂直的方向一个接一个的放置,如果要调整这些控件之间的空间,就会需要使用 Box 容器提供的透明的组件作为填充来填充控件之间的空间,从而达到调整控件之间的间隔空间的目的。Box 容器提供了 4 种透明的组件,分别是 rigid area、strut、glue、filler。Box 容器分别提供了不同的方法来创建这些组件。这四个组件的特点如下: Rigid area 是一种用户可以定义水平和垂直尺寸的透明组件; strut 与 rigid area 类似,但是用户只能定义一个方向的尺寸,即水平方向或者垂直方向,不能同时定义水平和垂直尺寸; 当用户将 glue 放在两个控件之间时,它会尽可能的占据两个控件之间的多余空间,从而将两个控件挤到两边; Filler 是 Box 的内部类,它与 rigid area 相似,都可以指定水平或者垂直的尺寸,但是它可以设置最小,最大和优先尺寸。 用 BoxLayout 进行布局 在了解了 BoxLayout 和 Box 容器的基本特点后,我们来看一下 BoxLayout 的优点,首先 BoxLayout 可以进行对控件进行垂直或者水平布局,同时 BoxLayout 使用起来较为简单,然而把它和 Box 容器相结合,就可以进行较为复杂的布局,达到同使用 GridBagLayout 的一样的效果,但是使用起来要简单方便多了。我们用按钮的布局作为例子来看怎样运用 BoxLayout 和 Box 容器进行布局: 图 1. 应用 BoxLayout 进行按钮布局例子 1 我们在布局中经常会碰到如图 1 所示要把按钮放在容器的两端,那么我们就可以给容器定义一个 BoxLayout 来布局按钮,我们在按钮 1 和按钮 2 之间放置一个不可见的 glue,如前面所提到的那样,glue 就会尽量挤占掉两个按钮之间的空间,从而将两个按钮放在两端。 图 2. 应用 BoxLayout 进行按钮布局例子 2 再来看图 2 的例子,我们经常会遇到要将两个按钮放在容器的右边,我们就可以给容器定义一个 BoxLayout, 先放一个不可见的 glue,这个 glue 会挤占左边的空间,从而将两个按钮推到右边, 在两个按钮之间再放一个 strut,它也是不可见的,它会把两个按钮分隔开。 BoxLayout 布局实例 在基于前面讨论的基础上,我们现在来看一个具体的运用例子,假设图 3 是我们需要完成的用户界面:

[译]使用Mockito简单mock入门

我们在写单元测试的时候,面临的一个挑战就是要测试的内容总是依赖于其他组件,要是我们还得先配置好其他组件,未免有点不如意,那么我们可以使用Mocks来代替那些依赖的组件 本文问了展示这个过程,我会创建一个DAL,数据访问层,这是一个类,提供了一个通用的api来访问和修改数据仓库的数据,然后,我们要测试这个api,而不用配置连接某个本地的数据库,,或者一个远程的数据库,或者是一个文件系统,反正就是任何放数据的东西,DAL层的好处就是隔离开了数据访问和应用程序代码 首先使用maven来创建一个工程 执行之后,本地生成MockitoDemo 文件夹,然后整个工程的目录结构与生成好了。 然后,我们写这样一个model类,表示book类型 然后,我们访问Book model的DAL类会如下 DAL层现在还没啥功能,我们要通过TDD来测试,实际中,DAL可能和ORM来交互,也可能和数据库API交互,但是我们设计DAL的时候,不用关心 准备测试 我倾向于用junit做单元测试,而Mockito做mock。首先更新一下pom文件。添加依赖 下面,我们要测试啦,我们会在单元测试中把mock数据注入到BookDAL中,这样我们就不要依赖任何数据源就可以完成测试 我们当然对应测试DAL类的每个方法嘛。 然后我们会在setup(这个方法是在测试类执行测试前执行的,用于准备数据啦) 在setup()方法中 1.首先我创建BookDAL的对象 2.然后stub,存根。。用mock的数据。这样当对应的方法被调用的时候就返回我mock的数据 然后,我们执行一下 mvn test就可以看到结果了    很简单。。。没有配置任何实际的数据源。

尝试JavaFX开发

曾经有报道说JavaFX将使java在桌面开发上大有作为,感觉好像是很高端的样子,今天尝试了一下,界面对于自用的工具来说,本来也不多重要,只是一个简单的尝试 简单说下大致的步骤和一些思路,可能有错误。 javafx需要sdk支持,java7之后的都有的。设计思路是数据和代码分离,界面通过xml或json数据来描述,这样就把业务逻辑代码和界面实现代码分开了 一个简单的开发过程应该是这样的 1.使用JavaFX Scene Builder来绘制界面,保存为xml/json格式 画的话没啥要说的,了解一下基本的整体概念就行。 2.在eclipse里新建工程,可以是普通工程,将1中的文件放到资源目录,在代码里加载,然后界面就加载成功了。 逻辑代码,比如一个简单的按钮事件可以通过 来查找到id为paneRightBottom的元素,然后就可以通过对node添加事件监听器来完成一些功能了 主要想说的是: JavaFX和WPF其实思路是一模一样的,恰好WPF我也用过,感觉两个都没搞起来,虽然界面炫,然后我去维基看了下: 该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet application(RIAs)。JavaFX期望能够在桌面应用的开发领域与Adobe公司的AIR、OpenLaszlo以及微软公司的Silverlight相竞争 已经7年了,用户数应该是非常少的,成熟的商业型产品也没几个,在尝试的过程中,我在stackoverflow,以及一些很不错的java博客上,大量查找基本也没有太多的信息,都是一些很浅的应用,包括stackoverflow上的回答数,基本还是能反映出来的,主要应用于RIA,而当前RIA已经出html5的天下了。SL早都不更新了,这种坑爹的所谓新技术。  Oracle还是好好把Swing搞好吧。。不建议尝试。  

[藏]隐藏在PNG图像元数据中的新iFrame注入攻击

这个攻击方式很旧了,但手法相当不错,来自乐嵌网 我们一直在努力保持领先的最新趋势,今天我们发现了一个非常有趣的事,这或者是我们之前没有发现,或者是刚发生的。 我们只能说这是新发现的。  我们都了解的iFrame注入攻击,对吧?  了解一个iFrame注入 今天的iFrame 是非常标准的HTML标记,它是在自己网页中嵌入其他网站内容的简单方式。 被几乎所有的浏览器支持和百万计的网站使用,使用AdSense吗? 那么你的网站中就有一个iFrame。 我知道这东西很好,然而总是福祸相惜。 今天的攻击,特别是当我们谈论路过式下载,首选是利用IFRAME标记。 它简单方便,只需简单的属性修改,攻击者可以稳妥的从另一个站点嵌入代码,并通过客户的浏览器不知不觉的加载。  像这样:  攻击者通常从其他网站嵌入的恶意文件,通常是一个PHP文件或类似的形式。 当然,这并不是唯一的方法,但是是最普遍的。 从检测和修复的角度来看,这往往很容易修复。  新的iFrame注入法 然而今天,我们发现一个有趣的iFrame注入类型。 它的特殊之处不是在iframe标签中嵌入的内容,而是它分发恶意软件的方式。 你会看到,攻击者将威胁隐藏在PNG文件中。 我几乎可以听到很多你的窃笑,PFF .. 这不是新的…. 但问题是在细节上我的朋友。  如下,iFrame加载了一个有效的文件,没有什么恶意,一个叫jquery.js的JavaScript文件。这一切看上去都很好。你要细细的找: 起初,很多人会说我们傻。 这些代码很好,没看见什么问题,对不对? 然后,我们注意到了这个小函数,loadFile()。 函数本身并不奇怪,但事实上,它是装载一个PNG-var strFile = ‘./dron.png。 你会被它惊讶良久,它才是一个真正的黑手。  自然,下一步就是好奇的打开dron.png文件。 会有什么可怕的事情发生吗?  噢,什么都没有,太无聊了,这纯粹是浪费时间。 但是,请等一下,我发现这里有个有趣的小循环。 嗯,这是确实挺奇怪的,这是一个解码循环。 为什么要一个循环的解码PNG文件呢?  作为一个优秀的研究人员,采取最简单的方式,我可以将它加载到简单的测试页上 并提取图像内容。搞定!  测试页上加载它之后这,我们获得了strData变量:  看到它在干嘛了吗? 它做了个iFrame注入,并把它嵌入到PNG的元数据中,像一个新的分配机制。  有两点需要特别注意了,它使用createElement做了一个iFrame标签**,**然后设置**elm.style.position.left 和 elm.style.position.top **属性的值为-1000px,把iframe放到可视区域之外。这些值都是负值,在浏览器中根本看不到。但是你知道谁能看到吗?只有浏览器和Google能看到。这就是下载驱动和搜索引擎感染(SEP)攻击的小伎俩。  最后我们在elm.src元素中发现了真正的威胁**。**  做的这么独特到底有什么用呢? 它尽力隐藏真正的威胁的水平是独特的。现在的杀毒软件不会解码图像元数据,直到JavaScript文件加载完毕就停止扫描。不会追踪cookie文件,对于攻击者来说,这太好了,使它们很难被发现。  记住一点,尽管我们这里谈论的是PNG文件,这些方法和概念也可以应用到其他类型图像中。重要的一点是:留意你的web 服务状态,了解哪些修改和未修改的文件并确保漏洞未被利用。  通常情况下,一些新的侦查和排障需要一定的时间。 现在我们的 网站恶意软件扫描器能发现它吗 ? 绝对可以!  不要笑了,朋友们! 原文:new-iframe-injections-leverage-png-image-metadata by Peter Gramantik

[笔记]写代码遇到的一些问题汇总下

本篇是用来填上一篇 挖下的坑的。 1.java调用webservice 有一些已有的webservice服务,由xfire生成发布,有些有参数,有些无参数,无参数的直接我直接使用org.codehaus.xfire这个包里的Client来动态生成客户端。然后调用就可以了。非常简单 但对于有参的,且是服务器自定义的类作为参数的时候,实在是搞不定。。不管是把自定义的类放到本地,包名一致,在invoke的时候生成这个对象还是其他什么方法。都无法完成。 最终换了直接发送soap报文来完成。dirty hack啊。如果你有一些好的方法希望不吝赐教。 解决方案来源自stackoverflow,因为stackoverflow现在国内好像有时候打不开。因此把代码贴过来。有疑问的话留言讨论。 2.Access restriction on class due to restriction on required library rt.jar? 报错 总么都感觉是环境问题,系统bug。解决如下: 进入project properties的 Build Path 设置里. 移除 JRE System Library 再添加回来,方法是: 选择 “Add Library” ,然后选择 JRE System Library. 3.SSHManager类报错:com.jcraft.jsch.JSchException: UnknownHostKey 我使用的一个SSHManager类如下: 报这个错是因为 连接这段代码里少了config.put(“StrictHostKeyChecking”, “no”);这段设置,这个是去掉了严格的安全检查,一般只用于测试目的。 4.navicat连接oracle数据库 之前使用PL/SQL操作Oracle数据库,使用Heidisql操作mysql数据库。。切换麻烦。而且PL/SQL搜索的时候中文有问题。于是打算使用navicat统一管理 方法是: 1.首先下载Instant Client 的32位版本和Navicat Premium 2.然后解压Instant Client,配置navicat 选择oci文件即可 然后新建oracle配置,选择basic模式,其他的根据你的数据库信息自己填写即可。  5.HttpClient的logger日志实在太多了 大人,实在太多了。看不过来啊。附赠一篇log4j配置文件详解 在log4j.properties文件中添加如下配置信息 log4j.logger.httpclient.wire.header=INFO log4j.logger.httpclient.wire.content=INFO log4j.logger.org.apache.commons.httpclient = INFO 最后附赠一些实用的工具 http://www.freeformatter.com/ 程序员必备。各类转换,包括转义工具,格式校验工具。效果很好。 流体力学理论与F1赛车的空气动力学1,2,3 什么雷诺数,伯努利方程,文丘里效应,当年木有好好学啊。这么高大上的东西果然还是有压力。

[笔记]写代码遇到的一些问题汇总上

今天大雪,天冷,不能出去玩了。把保存在pocket里的一些记录总结一下,太懒了。。下篇等我去了上海用我电脑写吧 1.java模拟https登陆 首先我要登陆,然后保存cookie,然后利用cookie来访问后续的网页,发包,处理包这样,然后,为了方便,我选择了 org.apache.http 这个库,典型的一个登陆场景应该是这样的,以后遇到问题一定先要去看官方的例子,别人给出的例子一般要么是不能用,要么是用的方法都是一些过时的,虽然能用,但看到警告还是不舒服。 但是,这个过程报了如下的错 google之,发现时访问https的原因。需要先安装对应站点的证书。这里要用到一个通用的java类,我贴下链接 编译这个工具类,然后执行java InstallCert <host>[:port] 会生成一个证书文件 然后在项目里通过 设置即可,你可以吧证书文件放到资源目录,就更好了。 2.java正则替换反斜线 我在某个地方需要把字符串里的所有反斜线替换成两个,我就写了 结果发现我还是too young,实际上, java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 例如 要想替换成 必须这样替换: 原因如下: String 的 replaceAll() 方法,实际是采用正则表达式的规则去匹配的, \\ ,java解析为\交给正则表达式, 正则表达式再经过一次转换,把\转换成为\ 也就是java里面要用正则来表示一个. 必须写成4个\ 如果要表示\,那就要写8个\ 所以如果写成: str1 = str1.replaceAll("\", “\\"); 就会报正则表达式的错误。 3.httpClient如何模拟表单上传文件 这个还是要去看官方例子,网上没找到,需要添加 org.apache.http.entity包 其他都和普通的post请求没啥区别了 4.json-lib的一个问题 在maven里添加了json-lib的依赖后,启动报错 missing net.sf.json-lib,但实际上这个我的确是加载进来了。去了SO,才知道,还需要知道classifier 依赖,把jdk的版本添加上就行。这个应该是我当时添加的时候没有去maven中央库填写造成的 然后在工程目录执行 就会在target目录生成jar包啦

前路月光

火影片头曲想知道中文,没找到翻译,于是译之,感谢@sepith  。 今夜月光 不知为何 比往日温柔 崎岖泥泞的来时路 何时才能有同行之人 我沉默 为即将而来的眼泪 泪水中努力 悲伤着变得更强 很多时候,伤痕累累 忘掉了痛苦 流过血泪 王者归来是使命所及 哪管一路秋叶萧萧 我仰望星空 孤独从来不是虚假的幻想 你的过去我无法参与 我想要的的是现在和未来 昨日月光 无论是明亮,还是黯淡 我用双手铸造 始于生而终于死 一定错过了 诸多美好 我的同伴 虽然时过境迁 可是,你住过的地方 经年难忘 如果你想对我说 我还是会在你身边 舍命相陪 很多时候,伤痕累累 星空暗淡 假使黎明 也悄然消失 我一定再一次 为了梦想努力拼搏 痛到难以承受 迷惘前路崎岖 我轻轻闭上双眼 感受月光温柔 前路相伴 岂敢轻易迷失 如果欺骗了内心 失去了自己 莫忘星空璀璨 凝视遥远的未来 固执地努力 很多时候,伤痕累累 忘掉了痛苦 流过血泪, 王者归来是使命所及 哪管一路秋叶萧萧 我仰望星空 真正强大的是 心怀梦想的人 有着爱的人

[藏]跨行清算系统的实现原理

本文来自God Is Coder,通过这篇文章我算是理解了跨行清算系统逻辑,非常非常好。 最近看了很多银联方面的清算系统的设计原理,对于跨行清算系统有了很大的了解,写这篇文章的目的是在于从一个程序员的角度去思考一个跨行清算系统的架构是如何实现的以及整个过程中我们有哪些思想是可以借鉴的。由于金融里面涉及到太多的专业名词,包括借贷,备付金,头寸,调拨等等,这里不会涉及到这些,取而代之的是以大家可以理解的概念去解释。 下面简单的介绍一下两种跨行清算系统的实现原理以及特点。一种跨清算系统是我们最熟悉的银联,还有一种是越来越流行的第三方支付系统,比较典型的是快钱。 首先来拿生活中的一个非常常见的例子来说明跨行清算的整个过程,这里面不涉及交易费等其他概念。 跨行取款流程 张三是工行的持卡人,他需要取现金,但是找不到工行的ATM机器,发现附近有建行的ATM机器,他只能去建行取款,整个过程就是跨行清算的过程,我们以这个场景为例,分析一下业务流程,具体交互流程见下面一张图。  工行持卡人张三在建行ATM机器取款100,ATM请求建行主机,由于是工行的卡,建行不识别,只能请求工行去处理,工行识别持卡人账户并扣款100,然后通知建行,建行则通知atm吐钱。 这里整个系统要解决两个问题: 1 建行如何与工行通信 2 建行和工行之间如何清算,如上图结果,工行欠建行100. 整个系统的分析基于以上两个问题,下面首先解决是通信问题  跨行通信的两种模式 我们先假设工行提供接口,只需要建行发送指约定格式的报文,即可于工行通信,这种相当于建行直接通过接口方式与工行通信。如果是这种方式,只能解决建行和工行的单向通信,如果工行和建行通信,则工行要发送建行指定的通信报文格式。可是大家想想,如果银行更多怎么办,下面是三家银行间的通信 当有三家银行的时候,通信链路就有3*2=6条,当银行越来越多的时候,这种点对点的通信变的越来越复杂,每新增一家银行,他要做之前银行都要做的很多重复性的劳动,这样的成本非常高,也不经济,那么必须出现一个网络,它能够接入所有的银行,新的银行只需要接入这个网络,就可以和其他所有的银行进行通信。 先把这个网络成为通信网络,这种通信网络有两种方式可以连接所有的银行 1 这个通信网络定义标准接口,所有的银行都必须实现这个通信网络定义的api,新的银行如果想要接入这个通信网络,必须实现通信接口约定的协议。简称公共接口模式 2 这个通信网络主动去连接所有的银行的接口,把所有银行的接口信息都接入里面,就像一个适配器,新的银行如果想要接入这个通信网络,这个通信网络必须主动联系银行,按照银行的接口协议实现通信,简称适配器模式。 下面一幅图演示了这两种模式的不同: 对于这两模式,主要博弈就在于谁强谁弱。显然第三方支付公司属于适配器模式,需要一家一家银行去接入,至于银联,个人认为应该是第一种模式,这种对于银联这种需要稳定的系统来说是最具有优势的。  跨行清算保证金模式 解决了通信问题,下面就看如何解决资金的清算问题。一种简单的方案就是工行在建行里面开设一个保证金账户,用这个账户去偿还在整个跨行交易中应付给建行的资金。  从上图来看,这种方案确实可行。只需要工行在建行里面放足额的保证金,就可以满足跨行的费用。但是这里面实际上存在非常多的问题, 1 如果银行越来也多,每个银行都要在其他银行存钱,太不经济了 2 保证金需要放多少资金?如果一直都没有发生跨行交易,工行就亏大发了 3 如果保证金不够怎么办?交易失败还是记应收款? 对于第一个问题假设银行越来越多,会导致工行需要在其他每个银行里面都开设保证金账户(见下图),是一个很不经济的方案。 说明这个在其他银行存保证金的方案是不可行的,和之前通信的问题一样,是不是可以把所有的银行保证金账户单独管理起来,统一放置在一起,方便各个银行之间的清算。我们暂时把这个系统称之为保证金系统。 保证金系统 保证金就是方便各个银行之间的清算,需要单独由一个系统进行管理,解决了跨行之间保证金存放的问题。每个银行只需要在保证金系统中存点钱就可以了。保证金系统也有两种模式。先看看比较好理解的第一种模式: 在这种模式下,银行先把一部分钱存放在保证金系统里面,同时银行内部建立一个虚拟账户,记录存放了多少钱,主要是方便对账,万一这个保证金系统钱算错了怎么办。你可以想象一下,银行是很小气的,为啥愿意把钱存放到这保证金系统里面,这部分钱干啥不好,能够银行这么干的只有国家了,这个系统就是央行的备付金管理系统。每个新增的银行都要存一份钱在这里。 另外一种方案是倒过来思考,既然没有牛逼的央行作支撑,那可以在每个商业银行都建立一个账户,用这个账户负责和银行进行清算。每新增一家银行,就在那个银行里面开一个保证金账户。 这两种方式有本质的不同,一个是银行把资金的一部分转出到保证金,银行建立虚拟账户和保证金里面真实的资金映射。一个是保证金系统把资金转出到各个银行,自己内部建立一个虚拟账户和银行中真实的资金账户进行映射。这个间接的银行了后续的对账机制,这里先不叙述。 所有的第三方支付公司跨行清算的流程都是第二种方式,只有国家级清算公司(比如银联)是第一种方式,这是一种资源和权力上的不平等,不过是可以理解的。 清算系统 保证金系统解决了保证金存放的问题,接下来就是解决如何清算的问题。假设保证金转账是实时的,就要面对上面说的问题,保证金不够的情况下,跨行交易是成功还是失败。这是一个业务上问题,有很多种解决方案,我们暂不说。从技术上来讲,如果每一笔交易都要保证金实时记账,那么保证金系统的负载太大,事务如何保证等等一些列的问题。所以一个最简单的方案就是:一天结算一次。 每天由一个系统记录这些跨行交易信息,汇总出来,统一记账。这样一天只需要调用一次保证金系统即可。那么整个清算过程则是下面的流程: 1 系统T日发生建行和工行的跨行交易100 2 清算系统T+1日汇总T日工行和建行之间发生的交易明细数据,并且发这些数据发给建行和工行进行确认   3 工行建行分别对明细对账确认之后,通知清算系统确认交易明细无误,清算系统开始清算,调用保证金支付系统转账。 4 清算完成之后,工行和建行分别获取保证金系统的真实金额和自身系统内部的映射账户进行余额对账。  清算中心最主要干得事情就是统计谁欠谁多少钱,以及触发保证金系统的调拨操作。  对账流程 对账包括两个部分,一个是跨行交易明细的对账以及保证金余额的对账。 首先要思考的是:对账是谁发起的 ? 这个是了解对账的本质。 我们举生活中的一个例子,我们把钱投资到一个人,那个人负责公司的日常运作。你肯定会主动了解公司的账务,因为那个是你的钱。对账的发起人也是如此,对于银联的清算过程,对账的发起者是商业银行,因为你把钱放在保证金系统里面,这是你的钱,你需要去关心这个的,银联可不关心这个。 对于另外一种保证金系统,把钱放在各个银行里面了,那么对账的发起者就是这个保证金系统维护者了。目前普遍的第三方支付公司都是这个模式,所以他要找各个银行要结果明细进行对账,确认自己的资金安全无误。  以上就是一个简单的跨行清算系统的雏形,从一个就简单的例子入手,说明一个清算过程。目前银联的第三方支付公司的清算过程大致如此,但是实现细节远比这个复杂。但是一个基本的清算系统的本质模型大体上是不会变的。当然这个只是对于同币种的清算,不同币种或者虚拟货币的清算会涉及到汇率的问题,这些就很复杂,有机会在研究一下,后续在分享。 PS:以上很多名词都是自己的随意写的,里面很多专业名词这里不提及,有兴趣的可以自己去了解。