最近在做一个挺有意思的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。
原先以为简单介绍下业务模型,结果发现说了那么多。。。。。。下一篇将会介绍核心技术实现细节,待续。。。
相关推荐
在选择同步还是异步的RPC-client时,应根据具体的业务场景和需求来决定。对于时延敏感的应用,可以选择同步模式以确保低延迟;而对于需要处理大量并发请求的应用,则更适合采用异步模式来提高吞吐量。无论选择哪种...
ASP.NET、Ajax 和 jQuery 是构建动态网页应用的三个关键技术,它们在实现无刷新用户体验方面扮演着重要角色。本文将深入探讨这些技术如何协同工作,以及如何利用它们来创建一个"顶-踩-无刷新【点赞】"功能的程序。 ...
- **回调函数**: 异步RPC通常涉及回调函数,客户端在发送请求时提供一个回调函数的引用,服务器在完成处理后通过这个回调函数将结果返回给客户端。 ### 2. 异步RPC的工作流程 1. **请求发起**: 客户端调用异步RPC...
一旦安装成功,就可以在Python项目中导入并使用`awesome_rpc`库,它可能提供了创建客户端和服务端的接口,支持异步或同步RPC调用,可能还有错误处理和序列化机制。 总的来说,`awesome_rpc`是一个Python实现的RPC...
在"异步电机矢量控制-仿真模型.rar"中,我们可以期待找到一个利用MATLAB Simulink构建的异步电机矢量控制系统的仿真模型。Simulink是MATLAB的一个扩展,提供了图形化的建模环境,便于创建动态系统的模型并进行实时...
`aiohttp_json_rpc` 是一个 Python 库,专门用于实现基于 JSON-RPC 的异步网络通信。JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用 JSON 格式进行数据交换...
总的来说,android-json-rpc是Android开发中的一个强大工具,它极大地简化了JSON-RPC通信的实现,使开发者能更专注于业务逻辑,而不是底层通信细节。通过合理使用这个库,可以构建高效、可靠的Android应用。
* 同步模式有多进程模式和动态链接库模式两个子模式,异步模式有简单异步模式和完全异步模式两个子模式。 在 PROE 二次开发中,选择合适的模式取决于具体的应用场景和开发需求。了解同步模式和异步模式的区别可以...
例如,可能存在一个Server类用于启动监听,一个Client类用于建立连接,它们都有同步和异步版本的发送和接收数据的方法。 在实际应用中,同步通信适用于简单、低并发的场景,而异步通信适合高并发和实时性要求较高的...
ApacheThrift简介与安装 ...Thrift与RPC原理深入解析 Thrift在微服务架构中的应用 Thrift数据序列化与反序列化 Thrift异步通信与非阻塞API Thrift协议与传输层详解 Thrift服务发现与注册机制 Thrift安全性与认证授权
Socket编程中的阻塞与非阻塞、同步与异步是两个独立的概念,它们涉及的是不同层面的操作机制。这里我们将详细探讨这两个概念以及I/O模型。 首先,同步与异步是客户端(C端)调用服务端(S端)时的行为模式。同步...
- **异步/同步调用**:RPC调用可以是同步的,等待服务器返回结果;也可以是异步的,客户端发送请求后立即返回,通过回调或future接口获取结果。 - **重试机制**:当请求失败时,客户端可以设置重试策略,比如固定...
- **简单应用分析:**演讲中可能展示了如何使用JSON-RPC-Java构建一个简单的Web应用实例,包括应用架构、客户端与服务器端交互的过程等。 - **高级主题:** - 异步操作:如何实现客户端与服务器之间的异步通信。 -...
"从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步" 本文是《从根上理解高性能、高并发》系列文章的第四篇,主要讲解...同时,本文还介绍了TCP/IP协议、Netty框架等其他同步和异步技术手段的应用。
同步IO 是指应用程序在执行IO 操作时,需要等待IO 操作完成后才能继续执行其他操作,而异步IO 则是指应用程序可以继续执行其他操作,而不需要等待IO 操作完成。 在本文中,我们将讨论基于系统底层通信技术Socket 的...
下面将详细介绍这两种请求方式以及同步与异步的区别。 1. **QT中的HTTP GET请求** GET请求是最常见的HTTP请求类型,用于从服务器获取资源。在QT中,可以通过调用QNetworkAccessManager的get()函数实现。同步GET请求...
Asio异步框架模型介绍 Asio异步模型是C++网络编程中的一种高效、可扩展的编程模型,该模型基于proactor-based事件模型,使用异步操作和continuation来开发高效、可扩展的网络软件。 异步模型的概念 Asio异步模型...
6. **异步编程**:由于LND操作可能涉及到网络延迟,`lnd_rpc`可能支持异步编程模型,如Python的asyncio库,以便在等待RPC响应时执行其他任务。 7. **身份验证和安全性**:与LND节点的通信通常需要身份验证,如TLS...
1 pipeRpcDll库 IRpcServerListen类是服务端,IRpcServiceLauncher类是客户端 2 PipeClientRealCaseRpcHandler 客户端的通信类举例 3 PipeServerRealCaseRpcHandler 服务端的通信类举例 4 PipeClientEx项目是客户端...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用JSON(JavaScript Object Notation)作为数据交换格式。在Python中,json-rpc-python库提供了一种方便的方式...