`

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

 
阅读更多

最近在做一个挺有意思的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异步收发核心细节

    在选择同步还是异步的RPC-client时,应根据具体的业务场景和需求来决定。对于时延敏感的应用,可以选择同步模式以确保低延迟;而对于需要处理大量并发请求的应用,则更适合采用异步模式来提高吞吐量。无论选择哪种...

    ASP+ajax+jQuery--顶-踩-无刷新【点赞】程式3.0 修正调试版

    ASP.NET、Ajax 和 jQuery 是构建动态网页应用的三个关键技术,它们在实现无刷新用户体验方面扮演着重要角色。本文将深入探讨这些技术如何协同工作,以及如何利用它们来创建一个"顶-踩-无刷新【点赞】"功能的程序。 ...

    异步的 RPC

    - **回调函数**: 异步RPC通常涉及回调函数,客户端在发送请求时提供一个回调函数的引用,服务器在完成处理后通过这个回调函数将结果返回给客户端。 ### 2. 异步RPC的工作流程 1. **请求发起**: 客户端调用异步RPC...

    PyPI 官网下载 | awesome_rpc-0.1.0-py3-none-any.whl

    一旦安装成功,就可以在Python项目中导入并使用`awesome_rpc`库,它可能提供了创建客户端和服务端的接口,支持异步或同步RPC调用,可能还有错误处理和序列化机制。 总的来说,`awesome_rpc`是一个Python实现的RPC...

    异步电机矢量控制-仿真模型.rar

    在"异步电机矢量控制-仿真模型.rar"中,我们可以期待找到一个利用MATLAB Simulink构建的异步电机矢量控制系统的仿真模型。Simulink是MATLAB的一个扩展,提供了图形化的建模环境,便于创建动态系统的模型并进行实时...

    Python库 | aiohttp_json_rpc-0.12.2-py3-none-any.whl

    `aiohttp_json_rpc` 是一个 Python 库,专门用于实现基于 JSON-RPC 的异步网络通信。JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用 JSON 格式进行数据交换...

    android-json-rpc

    总的来说,android-json-rpc是Android开发中的一个强大工具,它极大地简化了JSON-RPC通信的实现,使开发者能更专注于业务逻辑,而不是底层通信细节。通过合理使用这个库,可以构建高效、可靠的Android应用。

    proe二次开发同步异步两种模式的区别

    * 同步模式有多进程模式和动态链接库模式两个子模式,异步模式有简单异步模式和完全异步模式两个子模式。 在 PROE 二次开发中,选择合适的模式取决于具体的应用场景和开发需求。了解同步模式和异步模式的区别可以...

    C#TCP/IP同步和异步通信

    例如,可能存在一个Server类用于启动监听,一个Client类用于建立连接,它们都有同步和异步版本的发送和接收数据的方法。 在实际应用中,同步通信适用于简单、低并发的场景,而异步通信适合高并发和实时性要求较高的...

    Apache Thrift.rar+RPC+微服务+异步通信+安全认证+服务发现等

    ApacheThrift简介与安装 ...Thrift与RPC原理深入解析 Thrift在微服务架构中的应用 Thrift数据序列化与反序列化 Thrift异步通信与非阻塞API Thrift协议与传输层详解 Thrift服务发现与注册机制 Thrift安全性与认证授权

    详解socket阻塞与非阻塞,同步与异步、I/O模型

    Socket编程中的阻塞与非阻塞、同步与异步是两个独立的概念,它们涉及的是不同层面的操作机制。这里我们将详细探讨这两个概念以及I/O模型。 首先,同步与异步是客户端(C端)调用服务端(S端)时的行为模式。同步...

    java 手写rpc框架 rpc-server and rpc-client

    - **异步/同步调用**:RPC调用可以是同步的,等待服务器返回结果;也可以是异步的,客户端发送请求后立即返回,通过回调或future接口获取结果。 - **重试机制**:当请求失败时,客户端可以设置重试策略,比如固定...

    json-rpc-java-talk-20050225.pdf

    - **简单应用分析:**演讲中可能展示了如何使用JSON-RPC-Java构建一个简单的Web应用实例,包括应用架构、客户端与服务器端交互的过程等。 - **高级主题:** - 异步操作:如何实现客户端与服务器之间的异步通信。 -...

    从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步-其它分享_专项技术区 - 即时通讯开发者社区!.pdf

    "从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步" 本文是《从根上理解高性能、高并发》系列文章的第四篇,主要讲解...同时,本文还介绍了TCP/IP协议、Netty框架等其他同步和异步技术手段的应用。

    JAVA IO同步,异步

    同步IO 是指应用程序在执行IO 操作时,需要等待IO 操作完成后才能继续执行其他操作,而异步IO 则是指应用程序可以继续执行其他操作,而不需要等待IO 操作完成。 在本文中,我们将讨论基于系统底层通信技术Socket 的...

    QT C++ http get、post 同步异步请求

    下面将详细介绍这两种请求方式以及同步与异步的区别。 1. **QT中的HTTP GET请求** GET请求是最常见的HTTP请求类型,用于从服务器获取资源。在QT中,可以通过调用QNetworkAccessManager的get()函数实现。同步GET请求...

    Asio作者介绍asio的异步框架模型

    Asio异步框架模型介绍 Asio异步模型是C++网络编程中的一种高效、可扩展的编程模型,该模型基于proactor-based事件模型,使用异步操作和continuation来开发高效、可扩展的网络软件。 异步模型的概念 Asio异步模型...

    Python库 | lnd_rpc-0.7.1.post3-py3-none-any.whl

    6. **异步编程**:由于LND操作可能涉及到网络延迟,`lnd_rpc`可能支持异步编程模型,如Python的asyncio库,以便在等待RPC响应时执行其他任务。 7. **身份验证和安全性**:与LND节点的通信通常需要身份验证,如TLS...

    qt rpc 同步异步通信

    1 pipeRpcDll库 IRpcServerListen类是服务端,IRpcServiceLauncher类是客户端 2 PipeClientRealCaseRpcHandler 客户端的通信类举例 3 PipeServerRealCaseRpcHandler 服务端的通信类举例 4 PipeClientEx项目是客户端...

    json-rpc-python

    JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用JSON(JavaScript Object Notation)作为数据交换格式。在Python中,json-rpc-python库提供了一种方便的方式...

Global site tag (gtag.js) - Google Analytics