同步转异步+RPC的一个POS行业应用-业务模型介绍

标签: 同步 异步 rpc | 发表时间:2014-12-06 17:01 | 作者:leobasic
出处:http://www.iteye.com

最近在做一个挺有意思的POS消费项目,工作量不太大,但涉及的技术运用还挺有意思的。

可能有人奇怪,POS项目怎么用到JAVA语言了,先来简单介绍下这个项目背景:

 

改造前:收银机下单,POS机下单并刷卡支付

改造后:收银机跟POS连线,收银台直接下单并触发POS刷卡支付动作

 

这里就涉及一个关键问题,POS机只能单线程工作,就是一个时刻只能干一件事情,比如打印,刷卡,跟卡主机通讯,都必须是一件件做。这样就导致一个问题,POS机不能做SERVER,接受收银台发出的指令。于是乎,我们做了这样一个方案:做一个独立的SERVER,收银台和POS都连接SERVER,收银台发送指令给SERVER,然后SERVER再把指令转发给POS。流程图应该是这样子(懒得画图了:-P):收银台<=>SERVER<=>POS。

 

这里就有一个很有意思的事情,假设现在顾客加完油,需要付款,整个工作流程是这样:

1、收银员在收银台录入订单,点击刷卡按钮

2、收银台向SERVER发送刷卡指令

3、SERVER把指令转发给POS(注意:POS开机后,处于就绪状态,保持跟SERVER一个长连接)

4、POS收到刷卡指令后,先断开跟POS连接,然后启动刷卡器执行刷卡动作

5、顾客刷卡后,POS重新连接上SERVER,把卡片信息返回给SERVER,SERVER再把信息返给收银台(注意:整个过程,收银台一直处于阻塞等待状态,等待返回卡片信息。这里就是有意思的地方,收银台工作在同步模式,POS工作在异步模式)

6、收银台收到卡片信息后,收银员点击支付按钮

7、然后收银台再次发送支付指令给SERVER,SERVER把指令转发给POS(此时,POS一直跟SERVER保持长连接),POS断开跟SERVER的连接,连接卡主机,把卡片信息和商品信息发送给卡主机进行支付,卡主机执行支付后,返回相应支付信息给POS,POS断开跟卡主机的连接,POS重新连接上SERVER,把支付完成信息发给SERVER,SERVER再把信息转发给收银台,然后POS启动打印机打印小票

8、整个支付过程,终于完成

 

大家看到了吧,POS一直都是一个时刻,只能做一件事,跟这个连接上了,断开后,再跟别人连接,断开后再打印,够忙乎的:)。

 

综合整个业务需求,这里就说说涉及到的一些技术要点吧:

1、技术选型

因为收银台是用JAVA语言开发,所以SERVER我们也采用了JAVA开发

 

2、SERVER通讯框架

NETTY,大家都应该比较熟悉。其实选择NETTY也不是什么特殊原因,用mina也行,主要是貌似现在很流行,用了它感觉马上变得高大上:)。不过因为NETTY API很多,实际使用中,会碰到很多问题需要注意,后期给我们带来不少麻烦。

这里还有一个要求:一个POS可以绑定多台收银机,也就是多台收银机公用一个POS。多台收银机,可以分别绑定不同POS。即一台收银机,对应一个POS。

 

 

 

3、同步转异步

从上面业务流程分析可知,收银机连上SERVER一直是同步在工作,一直等待着POS返回结果。而POS则是异步去一个个地处理事情,最后返回结果。要实现同步转异步,我使用了Condition和Lock。

 

4、收银台跟SERVER通讯方式

为了解耦收银台和SERVER,便于以后升级维护,SERVER会先封装好POS操作的API,收银台使用RPC进行调用。

 

5、RPC实现方式

原先打算采用RMI,因为都是局域网内部通讯,比较单一,不存在性能问题。结果甲方大石压死蟹,说RMI不好维护。。。。。。要用socket通讯(难道RMI不是基于SOCKET的?)。。。。。。最后只能无语地接受,用了他所谓的SOCKET通讯,自己去实现了RPC。

 

原先以为简单介绍下业务模型,结果发现说了那么多。。。。。。下一篇将会介绍核心技术实现细节,待续。。。

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [同步 异步 rpc] 推荐:

同步转异步+RPC的一个POS行业应用-业务模型介绍

- - 行业应用 - ITeye博客
最近在做一个挺有意思的POS消费项目,工作量不太大,但涉及的技术运用还挺有意思的. 可能有人奇怪,POS项目怎么用到JAVA语言了,先来简单介绍下这个项目背景:. 改造前:收银机下单,POS机下单并刷卡支付. 改造后:收银机跟POS连线,收银台直接下单并触发POS刷卡支付动作. 这里就涉及一个关键问题,POS机只能单线程工作,就是一个时刻只能干一件事情,比如打印,刷卡,跟卡主机通讯,都必须是一件件做.

同步转异步+RPC的一个POS行业应用-关键技术实现

- - 行业应用 - ITeye博客
简单回顾下业务模型:收银台<=>POS代理服务器<=>POS机,三者之间进行通讯,POS代理作为一个报文转换和同步转异步角色. 下面介绍下几个关键技术实现:. 这里的报文,指的是POS代理服务器跟POS通讯之间约定的报文. 根据POS交易类型,支付、刷卡、打印等,约定每个交易报文包含什么字段信息和长度,其中一个比较特别字段是UUID,这个字段是每个报文的关键字段,.

基于Netty的异步Rpc调用的小框架

- - Java - 编程语言 - ITeye博客
基于netty写的一个异步Rpc调用小框架,欢迎拍砖,新手. private String methodName;//调用的方法名称. private Class[] types;//参数类型. private Object[] objects;//参数列表.  框架类,有两个静态方法,regist(在服务器上注册服务)和getobjt(获得接口的代理类).

Hadoop RPC机制

- - 企业架构 - ITeye博客
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. Hadoop底层的交互都是通过 rpc进行的. 例如:datanode和namenode 、tasktracker和jobtracker、secondary namenode和namenode之间的通信都是通过rpc实现的.

JAVA RPC 通讯框架

- - 经验沉淀 知识结晶
Bison 是一个JAVA 程间的通信框架,基于apache mina 实现,对mina进行了byteBuffer 缓冲区重用以及半包出处时减少拷贝. 客户端(bison-client) 功能点. 2 支持高用性:高可用的一个基本原则,可以接受快速的失败,但不能接受长时间的等待. Githup地址:https://github.com/gavenpeng/Bison.

Avro RPC 对比测试

- - 行业应用 - ITeye博客
J2EE平台常采用多层分布式的架构体系. 分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的). 因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信.

RPC原理详解 - 永志

- - 博客园_首页
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性.  为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用. 下面我们将具体细化 stub 结构的实现. 客户方等待调用执行完成并返回结果. 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果.

zmq-rpc:基于zeromq网络层编写的protobuf RPC框架

- Shengbin - codedump
阅读过zmq的代码之后,感觉这个网络层是我目前见过最高效的–线程之间使用lockfree的消息队列保存消息,可以启动多个I/O线程分担压力等等特性.于是决定基于它写一个protobuf RPC的框架.. 另外,这里使用的protobuf是旧版本2.3.0,新版本2.4.1的生成的RPC service接口跟原来不太一致,暂时还没有去研究它.BTW,升级版本之后导致原来的接口发生变化这是一个很操蛋的事情..

【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架

- - 开源软件 - ITeye博客
HttpInvoker是Spring原生的RPC调用框架,HttpInvoker同Burlap和Hessian一样,提供了一致的服务Exporter以及客户端的服务代理工厂Bean,这篇文章主要是复制粘贴了Hessian与Spring集成一文,. 【RPC框架Hessian四】Hessian与Spring集成.

从同步到异步,从匿名到实名

- keso - 乱象,印迹
题记:完成正则表达式的书稿,对许多事情不再麻木,慢慢恢复写点东西的意识. 虽然对网络没太多钻研,但从97年至今,自己上网的历史也有十多年了. 在我眼里,这些年来网络呈现出两个趋势:从同步到异步,从匿名到实名,所以写了这篇散记. 先说从同步到异步(这里借用了计算机专业中的两个术语,有必要为不熟悉的读者做一点解释:异步是一种松散的通讯模式,一方发送消息之后,不需要等待对方回复,即可以接续处理,电子邮件就是最常见的异步通讯模式;同步则是较为紧密的通讯模式,一方发送消息之后,需要等到对方回复,才可以接续处理).