SAP PI 同步 vs. 异步
处理可以定义为同步或者异步。
同步处理通过请求/响应操作调用,处理的结果立刻通过操作返回给调用者。
异步处理通过单方向的操作调用,结果和错误会通过另一个单向的操作调用。结果通过回调操作返回。
计算机的世界里没有异步通信,所有的两个系统之间的通信总是通过方法调用进行(请求/响应操作)。所以如何使其异步呢?答案是,在调用者和被调用者之间引入一个第三方的系统。
假设存在两个系统——A和B。A与B之间所有的通信通过一个方法调用来进行,因此他们是同步的。我们在AB间引入一个第三方系统,称其为中间系统I。A和I之间的通信通过方法调用,I和B之间的通信也是通过方法调用进行。但是A和B之间的调用可以是异步的,因为A不需要等待来自B的响应。
这是异步通信的基本原理,那么什么是中间系统呢?答案是队列。A被称为调用者,B被称为接收者。来自于A的消息首先添加到队列中,接着它再次被从队列中拉出,并且发送给B。B的响应通过相同的方式返回给A。在某些情况下,业务需求要求消息按照以A触发的时顺序发送给B,这种情况下可以依据先进先出策略。如果没有这样的需求,则消息会以随机顺序从队列发送至B。
因此可以把消息通信分为三类:
同步的
异步且无序的
异步且有序的
在PI中,我们定义它们为:同步——BE(Best Effort),异步且无序的——EO(Exactly Once),异步且有序的(Exactly Once in Order)。
确认
确认是异步通信的基础,为什么?
对于同步通信,系统A调用系统B时,如果B发送响应失败,处理会失败。但是在异步通信中,系统A调用系统I并且系统I会调用系统B。所以假设A与I之间的通信成功,然而I和B之间的通信失败。A该怎样得知发送到B的过程失败了呢?它通过确认来实现,该确认通过消息从A到B相同的路由方式,反向发送给A。如果从B到A的确认没有成功抵达A,那么A会认为处理失败,并且再次发送消息。
当我们讨论PI中的异步的时候,我们会使用术语 ‘Exactly Once’ 来表示EO和EOIO。Exactly Onc的意思是一旦发送的消息不能再次发送。为了实现这一特性,每一个从A发往B的消息都会有一个确认。通信的终端是适配器,因此适配器必须支持确认。
所有适配器都提供系统确认(system-acknowledgment),比如发送确认。支持同步通信的适配器除了支持系统确认以外还支持应用确认。
所以在PI中存在着以下类型的确认:
系统确认——系统确认在运行期间使用,以确认异步消息已抵达接收者。
应用确认——应用确认用以确保异步消息成功地被接收者处理。