PO系列 指定接口的处理队列

前言

PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统. (当然外围系统之间也可以使用PO). 

企业通过PO提供统一的中间件服务平台,所有系统都调用PO的服务或者发布服务让PO调用.

PO的异步消息在S4/ECC系统中使用了队列处理机制.

该机制的好处是可以控制系统的整体资源不会被接口处理大量占据, 

坏处是同一个队列中的排在前面的任务的处理性能或处理报错会影响队列中的后续任务

本文主要讲解S4/ECC中怎么启用三级队列机制来优化消息的处理

PO的队列处理

通过S4/ECC中执行事务代码SXI_MONITOR查询PO的相关消息,

  • 可以看出PO的消息使用了队列处理. 图一

  • 执行事务代码 SXMB_ADM 可以找到队列注册的位置,图二

  • 双击关联队列,可以注册相关队列 图三 .这里可以看到异步消息出站,入站的三级队列信息

  • SMQ1 出站队列监控-报错的队列重置队首任务状态,可以触发系统继续处理队列

  • SMQ2 入站队列监控-报错的队列重置队首任务状态,可以触发系统继续处理队列

fb340cee4efb0c8cef0e45bee195fe72.png

图一

78af1615a15586ef52d937c440ebf891.png

图二

62eb98f4403fd48c842662fd32b03dcc.png

图三

队列处理的优点

通过队列配置,可以控制接口对系统资源的占用.

该占用包含

  • 系统允许的队列处理对话数(RZ12) 图四

  • 队列的管理控制参数(SMQR) 图五

没有找到每个队列组允许的队列个数, 估计该数字依赖于RZ12中针对队列分配的进程数,

6f69ffc73acc94e51768912c985e8f1b.png

图四

b92063f62226746af32f042d590ced53.png

图五

队列处理的缺陷

队列处理的最大缺点就是排在队伍前面的任务会影响后面的任务. 

笔者曾经分析处理过用户提报的一个接口问题:一个简单的入库接口(只有一单一行), 该接口在SXI_MONITOR中可以查询到执行耗时4个小时. 而该接口的其它消息日志却很快就执行完毕. 此时分析应该是队列等待导致的执行时间过长.

找出当天该接口的同名队列中最早的一个持续时间很久的消息, 判断出该消息就是问题的源头.

还有就是队首任务的报错会中止整个队列, 此时只能通过使用SMQ1/SMQ2 重置队首任务状态,来激活队列的重新处理. 

非生产系统也可以通过删除队首任务来解决队列报错问题

程序RSXMB_RESTART_MESSAGES  也可以重新执行报错的PO/PI队列 

39a565d8716c38ccd66f788324cb3f4f.png

问题解决方式一

怎么解决队首消息长时间处理影响队列中的其它消息的处理,

常规思维方式就是优化所有接口的处理逻辑, 确保单一消息的执行时间不会太久.

具体的优化方式可以考虑先记录接口数据, 然后调度后台去处理接口逻辑, 这样就可以避免该接口消息的长时间处理影响队列中的其它消息

问题解决方式二

解决方式二就是本文讨论的主题, 启用接口的三层优先级队列组机制(注册时固定)

  • 正常队列组

  • 高优先级队列组

  • 低优先级队列组

通过配置把不同的接口指向特定的优先级队列组. 这样通过队列组名称的前4位,就可以确保不同优先级的消息一定不会进入相同的队列中. 估计系统会优先满足高优先级队列对进程的占用(尚未验证)

没有特殊配置的消息都会使用正常队列组

配置步骤

下传接口:

TCODE: SXMSIF里配置新的 发送/接收者标识

b003717093ea9ed9a6dcf6078cf5a310.png

467741586db90ffc162264bc2e828966.png

选中接口调用的服务类

dd531a08f4126b2da91f1f4da73c971d.png

直接保存

9a7fb0070f21d32693cef90be481b0b7.png

SXMB_ADM里

e85a3d83633561234a7d7bec66d17ba1.png

因为是S4发出的接口,所以选择发送者

95e865f420228b71e758fbfc496275f1.png

db94a6fda1c7400db55e15bc285911b8.png

先点保存,再点激活

1c7f8d4572a8d37429d6aa48ed6d2c3d.png

然后测试:

在激活情况下: 可以在sxi_monitor里看到接口占得队列是我们前边配置的XBT1*

969061330d8939bf47b16f9cf3a67291.png

然后把SXMB_ADM里取消激活,再ZP299997推数,然后看SIX_MONITOR,队列就是XBTS*了

ad55558ce5fda8eb389a2444b781bf01.png

上传接口:

TCODE: SXMSIF里配置新的 发送/接收者标识

e28898b2d7382afe0668b9661e3b3729.png

9accf2b4f1bcec8af7606ddd3f2f686c.png

然后SXMB_ADM里

51f565971237841060fed2c7f57b5b21.png

外围系统-PO-S4的接口,S4作为接收方,所以选择接收者

77f37a7763b1e2426facea2413cd24e2.png

这里有个发送者标识需要填,S4作为接收方的时候,接收者标识一定要指定正确服务类,然后这个发送者标识开始填了*,但是在激活的时候报错

4545719442c1cdaac5b509f4141491dd.png

所以去配置一个发送者标识,然后里面所有的信息都填*

e4f5aa57ddf84064245895968d4a2d84.png

然后如下图

551ed69c8ba1dcf59893672ffeb46bf3.png

然后保存激活即可

3af886bfb3340fcf652642f503e8c0b4.png

用postman测试接口,

测试地址:

报文:

{

        "body": {"FIELD1": "X","FIELD2": "B","FIELD3": "C"}

}

首先激活状态下:

队列是XBTA*

acdd018d35cab7002a2cbb8a00cef0fc.png

然后取消激活:

队列是XBTR*

7d8442352132170ee6dcbcfd2a28ad68.png

总结

一般情况下接口开发不会用到队列分配机制, 但是需要尽量优化接口的处理逻辑, 确保接口处理不会占用太多时间.

项目中如果发现特定接口耗时较长,对其它接口产生了影响, 则可以通过队列分配机制,把特定的一个或多个接口分配到其它优先级的队列中,

队列优先级通过队列的前4位字符可以识别

特别感谢孙顾问,本文中的详细处理步骤由他提供.

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

申请进入公众号讨论群提问或者参与话题讨论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值